
Active Directory や SMS などを照会して、複数のサーバーの Windows サーバーにログインしたユーザーのリストを取得する方法を探しています。Linux で lastlog ファイルを確認するようなものです。ユーザー名以外の時間やその他の情報は必要ありません。
出力が次のように単純なもの: SERVERNAME: shatnerw, nimoyl, kelleyd,
これに関するどんな意見でも大歓迎です。たとえ「この関数を VB スクリプトで使用する」という意見でも構いません。
ありがとう、ablackhat
編集: これまでのところ、情報は HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList のレジストリにあることがわかりました。 GUID も含まれているので問題ありません。 今度は、それをリモートでクエリする方法を見つける必要があります。
答え1
プロファイル リストだけが必要な場合は、PowerShell がおそらく最善の選択肢です。
$Server = 'RemoteServer'
$Reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('LocalMachine', $Server)
これにより、HKLM 内のリモート レジストリ オブジェクトのホルダーとして $reg がインスタンス化されます。必要なビットを取得するには、次のようにします。
$ProfileList = $Reg.OpenSubKey('SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList')
これにより、$ProfileList にプロファイル自体のサブキーが入力されます。次に、ユーザーのリストを抽出します。
Write-Host "`n$Server: " -nonewline
ForEach ($SID in $ProfileList.GetValueNames()) {
$ProfileKey = $ProfileList.OpenSubKey($SID)
# Get the ProfileImagePath key
$ProfileKey.GetValue("ProfileImagePath")
# Break the path up into an array, using \ as the delimiter
$PathBits = $ProfileKey.Split("\")
# The last element of the array is our user, find the last element
$LastIndex = $PathBits.Count - 1
# Dump the last element to something useful
$User = $PathBits[$LastIndex]
# Output the user
write-host " $User" -nonewline
}
またはそれに近いもの。思いついたものです。
答え2
監視するサーバーに適用する GPO を作成し、「コンピューターの構成」>「ポリシー」>「Windows の設定」>「セキュリティの設定」>「ローカル ポリシー」>「監査ポリシー」で、要件に応じて成功または失敗時に「ログオン イベントの監査」を有効にします。
監視対象のサーバーが DC である場合は、アカウント ログオン イベントの監査を有効にしないでください。アカウント ログオン イベントは、誰かがドメイン ユーザー アカウントでログオンしたときにドメイン コントローラーで生成されるため、イベントが多すぎます。
つまり、ユーザーがコンピュータにログオンすると「ログオン イベント」が作成され、ユーザーがドメイン ユーザー アカウントでログオンするとドメイン コントローラに「アカウント ログオン イベント」が作成されますが、ユーザーが対話的にログオンするコンピュータもアカウント ログオン イベントを生成します。これが監視対象です。EventForwarding (対応サーバー用) と組み合わせると、独自のイベント ログを監視するか、SNMP トラップを使用してイベントをキャッチしevntwin.exe
、SNMP 監視/警告システムに転送することができます。
ユーザーのワークステーションでは、PHP/MySQL がインストールされている内部サーバーに隠し IE プロセスを開く VBScript を実際に使用しています。このプロセスはユーザー名をデータベースにダンプするだけです。VBScript は次のようになります。
Set oIE = CreateObject("InternetExplorer.Application")
Set oNet = CreateObject("WScript.Network")
sComputerName = oNet.ComputerName
sUsername = oNet.UserName
oIE.Navigate "http://intranet/logon/logon.php?un=" & Trim(sUsername) & "&ma=" & Trim(sComputerName)
Do While oIE.Busy = True
WScript.Sleep 500
Loop
oIE.Quit
Set oIE = Nothing
WScript.Quit
当然、これを実行するには Web サーバー、PHP、MySQL データベースが必要です。興味がある場合は、お知らせください。それらも調べます。GPO を使用してこれを適用することもできますが、1 つ注意点があります。GPO のユーザー構成セクションでのみ実行できます。
つまり、選択肢は 2 つあります。HTH。
編集: 上で参照した PHP スクリプトは次のとおりです。実に簡単です。
mysql_connect('mysqlserver', 'username', 'password');
mysql_select_db('database');
$un = trim(addslashes($_GET['un']));
$ma = trim(addslashes($_GET['ma']));
mysql_query("INSERT INTO userlist (user_logon_name, machine_name, logon_time) VALUES ('$un', '$ma', now())");
echo "User ". $_GET['un']. " logged on.";
乾杯