各サーバーにログインしたユーザーのリストを取得する

各サーバーにログインしたユーザーのリストを取得する

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.";

乾杯

関連情報