スクリプト

AD認証のイベントログ取得スクリプト

ADドメインログオンのイベントログ取得

AD 認証を行った際に、時間とそのユーザの MAC アドレスと IP アドレスをログとして取得したい、という時に作ったスクリプトです。

方針としては、以下の 3 段階になります。

  1. ADのドメインコントローラ上でコマンドを打ち、一般ユーザにイベントログの書き込み権限を与える
  2. ログオンスクリプトでイベントログへの書き込みを行う
  3. イベントログを PowerShell でテキストファイルに変換出力する

1. ADのドメインコントローラ上でコマンドを打ち、一般ユーザにイベントログの書き込み権限を与える

まず、ドメインコントローラのコマンドプロンプトで、以下コマンドを打ちます。

wevtutil gl application

意味合い的には、Windows EVenT UTILities GetLog APPLICATION , つまり、Windows のアプリケーションイベントログの設定情報をGETするためのコマンドです。

色々と表示される中、channelAccess で始まる文に注目します。例えば以下のように表示されます。

channelAccess: O:BAG:SYD:(A;;0x2;;;S-1-15-2-1)(A;;0xf0007;;;SY)(A;;0x7;;;BA)(A;;0x7;;;SO)(A;;0x3;;;IU)(A;;0x3;;;SU)(A;;0x3;;;S-1-5-3)(A;;0x3;;;S-1-5-33)(A;;0x1;;;S-1-5-32-573)

次に、上記をベースに、channelAccess の SDDL 形式セキュリティ記述子に(A;;0x2;;;DU)を加えます。

これはドメインユーザ (DU) に書き込み権限 (0x2) を与える設定になります。具体的にはコマンドプロンプトで以下のように打ちます。

wevtutil sl application /ca:O:BAG:SYD:(A;;0x2;;;S-1-15-2-1)(A;;0xf0007;;;SY)(A;;0x7;;;BA)(A;;0x7;;;SO)(A;;0x3;;;IU)(A;;0x3;;;SU)(A;;0x3;;;S-1-5-3)(A;;0x3;;;S-1-5-33)(A;;0x1;;;S-1-5-32-573)(A;;0x2;;;DU)

sl は Set-Log の略です。全ドメインコントローラでこの設定を行います。

これで 1 段階目の準備は完了です。

2. ログオンスクリプトでイベントログへの書き込みを行う

以下の VBS スクリプトを AD のログオンスクリプトに仕込みます。ユーザが AD 認証で PC にログインするたびに、このスクリプトが動作します。

---login-log.vbs---

Const AUDIT_SUCCESS = 8

REM Create Objects
Set objShell = WScript.CreateObject("WScript.Shell")
Set oLocator = WScript.CreateObject("WbemScripting.SWbemLocator")
Set oService = oLocator.ConnectServer
Set oClassSet = oService.ExecQuery("Select * From Win32_NetworkAdapterConfiguration")
Set objNetwork = WScript.CreateObject("WScript.Network")
Set objADSys = CreateObject("ADSystemInfo")

cnt = 0

For Each oClass In oClassSet
  If oClass.IPEnabled = True and cnt = 0 Then
    strIP = oClass.IPAddress(0)
    strMAC = oClass.MACAddress
    cnt=1
  End If
Next

REM Build a message string

strMsg = Cstr(year(now)) + "/" + Cstr(Right("0" & month(now),2)) + "/" + Cstr(Right("0" & day(now),2)) + " User=" + objNetwork.Username + ",MAC=" + strMAC + ",IP=" + strIP

REM Write to EventLog
objShell.LogEvent AUDIT_SUCCESS, strMsg, objADSys.GetAnyDCName

REM は REMARK の略で、コメントアウト行であることを示します。

3. イベントログを PowerShell でテキストファイルに出力する

PowerShell で、1 時間おきにイベントログからテキストログに変換するスクリプトを作りました。

これをドメインコントローラのタスクスケジューラに仕込み、1 時間おきに走らせます。

--- evtlog2txtlog.ps1 ---

set-PSDebug -strict

# イベントログ取得終了時刻の設定
$end_time = [system.datetime]
$end_time = get-date -Minute '00' -Second '00'

# イベントログ取得開始時刻の設定
$start_time = [system.datetime]
$start_time = (get-date).AddMinutes(-60)

# 出力先フォルダの設定
$dir = [string]
$dir = "D:\ADAuth-Log"

# Application ログの出力先パス
$name = [string]
$name = "application_" + $start_time.tostring("yyyyMMdd") + ".txt"

# Application ログの出力先パス(ファイル名含む)
$fPath = [string]
$fPath = $dir + "\" + $name
$temp = $dir + "\temp.txt"

# EventLogEntry Object 生成
$event = [system.diagnostics.eventLogEntry]
# EventLogEntry から Application ログを時間指定で抽出、表示方法を既定から変更
$event = get-WinEvent -FilterHashtable @{LogName="application";ProviderName="WSH";StartTime=$start_time;EndTime=$end_time} | format-table -HideTableHeaders -AutoSize -Property Message

$event > $temp

New-Item $fPath -type file -force

Get-Content $temp | ForEach-Object {
   if($_ -ne "") {
      $_.trim() | Out-File $fPath -Append -encoding utf8
    }
}

Write-host "終了"

trap{
   Write-host "エラーが発生しました"
   break
}

コメント

タイトルとURLをコピーしました