ユーザがログオンしたログをサーバにとりたい
環境
サーバ:Windows 2003 Server
クライアント:Windows 2000 または Windows XP
問題
WSHのLogEventメソッドを利用して、1つのサーバにユーザがログオンした際のログを集約しようとしたんです。
Active Directory ドメインで、ユーザのログオン/ログオフの状況を監査したい
http://monyo.com/technical/windows/35.html
上記ページを参考にして以下のように書いたんですが、「エラー:書き込みできません。 コード:800A0046」となってしまいます。
Const AUDIT_SUCCESS = 8 REM Create Objects Set objShell = WScript.CreateObject("WScript.Shell") Set objNetwork = WScript.CreateObject("WScript.Network") Set objADSys = CreateObject("ADSystemInfo") REM Build a message string strMsg = "ユーザ " + objNetwork.UserName + _ " (端末 " + objNetwork.ComputerName + ")が、" + _ "ドメイン " + objNetwork.UserDomain + _ " (サーバ " + objADSys.GetAnyDCName + ") にログオンしました。" Dim logServer logServer = objADSys.GetAnyDCName logServer = Replace(logServer, "02", "01") wscript.echo logServer REM Write to Eventlog objShell.LogEvent AUDIT_SUCCESS, strMsg, logServer Set objShell = Nothing Set objNetwork = Nothing Set objADSys = Nothing
原因
調べてみると、Domain Userにはイベントログへの書き込み権限がないようです。
正確には、対面ログインした状態なら書き込めるんですが、ネットワーク越しではダメとのこと。
解決策
さらに調査をすすめると、どうやらレジストリに設定があるみたいです。
Windows Server 2003 のイベント ログのセキュリティをローカルまたはグループ ポリシーで設定する方法
http://support.microsoft.com/default.aspx?scid=kb;ja;323076&sd=tech
上記ページによると、
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Eventlog\Application\CustomSD
で設定されている値の末尾に、「(A;;0x3;;;DU)」を加えるとちゃんとログが取れるようになりました。
補足
ちなみに、「(A;;0x3;;;DU)」の意味ですが
- 「A」は許可
- 「0x3」は1:読取+2:書き込みということで、読み書きの権限
- 「DU」はDomainUsersの略
となっています。
これであとは上記スクリプトをグループポリシーを使ってログオン時に動くよう設定すれば、ユーザのログオンログがとれることになります。