用户和计算机的关系

用户和计算机的关系

我曾多次使用 Get-ADUser 和 Get-ADComputer 来帮助解决系统中的问题。

我已经看到了几种识别方法哪个用户登录通过任一注册表指定机器,程序日志记录程序其他脚本,但由于我并不是一名真正的网络管理员,因此经常被拒绝访问。这没什么,因为我对深入研究并不感兴趣。

我所需要的只是以某种方式识别哪些用户在一台机器上有一个帐户(配置文件)(或者哪些机器有一个用户帐户),这样我就可以在他们的 IP 地址出现异常时联系他们并帮助他们。

这两个对象之间真的没有任何关系吗?

答案1

这些对象之间绝对没有“开箱即用”的关系。Windows 8/Windows Server 2012 引入了“主计算机”Active Directory 架构属性,但我非常怀疑您是否会发现它正在被使用。

获取远程计算机上的登录用户是声音好像它应该真的很容易,但实际上并非如此。

我认为您必须获得网络管理人员的合作才能可靠地获得所需的信息。通过“正常方式”(psloggedonWMI 查询、远程注册表访问)远程查询登录用户信息将要求您在远程计算机上拥有本地管理员权限,或者对默认设置进行更改以授予您的非管理员上下文该权限。

开始讨论“黑客”:我可以想象这样一种场景:您的异常处理程序试图将用户的浏览器重定向到需要 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"}
}

相关内容