我需要在 PowerShell(理想情况下是 PS2.0+)中寻找一种方法来列出本地系统上所有用户帐户,这些帐户中用户在本地存在,但用户可能不在本地。本地用户本身。也就是说,设备可能连接到一个域,其中类似命令get-WMIObject Win32_UserAccount
将列出域上的所有用户并且(最有可能)超时或遇到权限错误,因为该命令是从本地用户的上下文中运行的(即使它是以 LocalSystem 帐户身份执行的)。
以下是我所知道的枚举用户的各种方法以及它们不合适的原因。
get-WMIObject Win32_UserAccount -Filter {LocalAccount="True"}
这不会显示实际登录到该设备的域用户;它只显示在相关设备上本地设置的用户,而将潜在的用户帐户留在表上。net user
如上。get-WMIObject Win32_UserAccount
(没有附加参数)
在连接到足够大的域的设备上,此查询会挂起并最终以“任务取消”错误退出,因为它正在尝试枚举数千名用户。我只需要在本地设备上存在的用户。- 枚举
HKEY_USERS
此配置单元仅枚举已登录用户的配置文件作为键在查询时。 - 枚举
C:\Users
这个有用,但我不太愿意用;感觉不太精确。此外,它还添加了我不感兴趣的无用帐户,如Default
和。Public
我将尝试预防类似以下投诉对这个类似问题的回答(“那么你需要重新设计你的应用程序”)注意我并没有试图收集数据来自这些用户配置文件。我只需要枚举它们;accountName 值就足够了。
除了查看文件夹之外,Windows 中是否存在分类帐或名册,我可以在某个地方查询这些数据?
答案1
该注册表项HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList
包含所有具有 Windows 已知的用户配置文件目录的帐户的子项。本地“用户”组中的每个人都有此注册表项的读取权限。
子项以帐户 SID 命名,您可以使用以下方式将其映射到用户名现有 API:
$sidobj = [Security.Principal.SecurityIdentifier] $sidstr
$namestr = $sidobj.Translate([Security.Principal.NTAccount]).Value
使用已知 SID表来过滤掉不需要的“内部帐户”SID 或 SID 前缀。(通常所有“真实”帐户的 SID 都以 开头S-1-5-21-
)