ユーザがログオンしたログをサーバにとりたい

環境

サーバ: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の略

となっています。

これであとは上記スクリプトをグループポリシーを使ってログオン時に動くよう設定すれば、ユーザのログオンログがとれることになります。