答案1
这些对象之间绝对没有“开箱即用”的关系。Windows 8/Windows Server 2012 引入了“主计算机”Active Directory 架构属性,但我非常怀疑您是否会发现它正在被使用。
获取远程计算机上的登录用户是声音好像它应该真的很容易,但实际上并非如此。
我认为您必须获得网络管理人员的合作才能可靠地获得所需的信息。通过“正常方式”(psloggedon
WMI 查询、远程注册表访问)远程查询登录用户信息将要求您在远程计算机上拥有本地管理员权限,或者对默认设置进行更改以授予您的非管理员上下文该权限。
开始讨论“黑客”:我可以想象这样一种场景:您的异常处理程序试图将用户的浏览器重定向到需要 NTLM 身份验证的页面,如果客户端配置为自动尝试使用登录用户的凭据进行身份验证,您可以通过这种方式“获取”凭据。我还可以看到网络管理人员可能会严重误解这是对用户的攻击,所以我强烈建议不要这样做。
假设您正在管理一个 Web 应用程序,但不是网络管理人员。如果您可以让网络管理员同意将您的 Web 服务器加入域,您可以启用身份验证,此时您将知道远程用户的用户名,而不必处理任何 IP 地址问题。如果您的客户端配置正确,身份验证也可以透明地进行。
答案2
Windows 计算机上的现有配置文件在以下注册表项中列出:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList
它包含每个用户配置文件的子键,每个子键的名称通过安全标识符标识相应的用户。
您可以通过枚举子键来“发现”用户配置文件,并将所有用户 SID 转换为其相应的帐户对象:
$profileList = "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList"
# Retrieve subkeys that represent user profiles
$UserProfiles = Get-ChildItem $profileList |? {$_.Name -like "*S-1-5-21-*"}
foreach($Profile in $UserProfiles)
{
$ntAccType = [System.Security.Principal.NTAccount] -as [Type]
$userSid = ($Profile.Name-split"\\")[-1]
try{
# Attempt to translate the SID to an NTAccount object
(New-Object System.Security.Principal.SecurityIdentifier $userSid).Translate($ntAccType)
} catch {"Translating SID $userSid to Account failed"}
}