
Я ищу способ сделать запрос к Active Directory или SMS или чему-то еще, чтобы получить список пользователей, которые вошли на сервер Windows для нескольких серверов. Это было бы похоже на проверку файла lastlog на Linux. Мне не нужно время или что-то еще, кроме имени пользователя.
Что-то с таким простым выводом, как: 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)
Это создаст экземпляр $reg как держателя для удаленного объекта реестра в HKLM. Чтобы добраться до нужной вам части:
$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
Создайте объект групповой политики, который применяется к серверам, которые вы хотите отслеживать, и в разделе «Конфигурация компьютера» > «Политики» > «Параметры Windows» > «Параметры безопасности» > «Локальные политики» > «Политика аудита» включите «Аудит событий входа в систему» при успешном и/или неудачном завершении в зависимости от ваших требований.
Не включайте Audit account login events, если серверы, которые вы отслеживаете, являются DC. События входа в учетную запись генерируются на контроллерах домена, когда кто-то входит в систему с учетной записью пользователя домена, поэтому вы увидите слишком много событий.
Короче говоря, "Событие входа" создается, когда пользователь входит в систему на компьютере, "Событие входа в учетную запись" создается на контроллере домена, когда пользователь входит в систему с учетной записью пользователя домена, НО компьютер, на который он входит, также интерактивно генерирует событие входа в учетную запись. Это то, за чем вы хотите следить. В сочетании с EventForwarding (для ваших совместимых серверов) вы можете просто отслеживать свой собственный журнал событий или использовать SNMP-ловушки для перехвата событий evntwin.exe
и пересылки их в систему мониторинга/оповещения SNMP.
На рабочих станциях пользователей я на самом деле использую VBScript, который открывает скрытый процесс IE на внутреннем сервере с установленным PHP/MySQL, который просто сбрасывает имя пользователя в базу данных и все. 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
Очевидно, вам нужны веб-сервер, PHP и база данных MySQL, чтобы работать с этим, так что если это то, что вас интересует, дайте мне знать, и я раскопаю эти части тоже. Вы можете применить это, используя GPO, но с одной оговоркой: это может работать только в разделе конфигурации пользователя вашего GPO.
Итак, у вас есть два варианта. 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.";
Ваше здоровье