![获取每个服务器的登录用户列表](https://linux22.com/image/533473/%E8%8E%B7%E5%8F%96%E6%AF%8F%E4%B8%AA%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%9A%84%E7%99%BB%E5%BD%95%E7%94%A8%E6%88%B7%E5%88%97%E8%A1%A8.png)
我正在寻找一种查询 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)
这将实例化 $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
创建一个适用于您要监控的服务器的 GPO,并在计算机配置 > 策略 > Windows 设置 > 安全设置 > 本地策略 > 审核策略下,根据您的要求在成功和/或失败时启用“审核登录事件”。
如果您监控的服务器是 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
显然,您需要 Web 服务器、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.";
干杯