列出本地设备上活跃的所有用户帐户

列出本地设备上活跃的所有用户帐户

我需要在 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-

相关内容