我正在尝试找到一种方法来获取 Windows 7 系统上用户帐户的完整列表,包括隐藏帐户。用户帐户对话框 ( >control userpasswords2
) 仅显示普通用户帐户,甚至本地用户和组编辑器仅显示普通用户帐户和标准隐藏/禁用帐户,如管理员和访客。选择用户或组对话框有一个立即查找按钮,它将用户和组结合在一起,但是遗憾的是,它的内容与 LUG 相同。
我正在寻找一个更全面的列表,其中包括“超级隐藏”/虚拟用户帐户,如 TrustedInstaller(或更准确地说,NT 服务\TrustedInstaller—注意不同的“域”)。
我检查过了HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\SpecialAccounts\UserList
,但是SpecialAccounts
密钥不存在。
我还检查了HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList
,虽然它确实列出了 SystemProfile、LocalService 和 NetworkService 帐户,但没有列出其他帐户(如 TrustedInstaller 及其同类帐户)。
TrustedInstaller 特别让人困惑,因为它是一个用户、一个服务和一个可执行文件。我使用它作为示例,因为它“超级隐蔽”,似乎没有列在任何类型的用户列表中。(作为一个实验,我尝试在整个注册表中搜索“trustedinstaller”,看看是否能找到一个将其列为用户的地方,但没有找到。)
明确地说,我正在寻找的是可以在用户输入字段(例如权限对话框或参数)中使用的所有帐户的列表runas
。
答案1
我认为没有一份包含所有可能账户的最终清单。
您可以在用户输入字段(例如权限对话框)中使用不同类型的名称。
首先是标准的 Win32_Accounts,要获取完整列表,请打开 PowerShell 会话并运行:
get-wmiobject -class "win32_account" -namespace "root\cimv2" | sort caption | format-table caption, __CLASS, FullName
这些是常见的用户、群组和内置帐户。
从 Vista 开始,出现了一种新的帐户类型,称为虚拟帐户,因为它们不会显示在通常的管理工具中。有时也被称为服务帐户,这类帐户至少有三种不同的类型:
- Windows 服务帐户
从 Vista 开始,每个 Windows 服务都有一个与之关联的虚拟帐户,即使它在不同的用户帐户下运行,即使它根本没有运行。看起来NT Service\MSSQLSERVER
要获取这些列表,请使用:
get-service | foreach {Write-Host NT Service\$($_.Name)}
- IIS 应用程序池
在 ApplicationPoolIdentity 下运行的每个 IIS 应用程序池都在一个名为IIS APPPOOL\NameOfThePool
假设您已经安装了 IIS 管理脚本工具,您可以运行:
Get-WebConfiguration system.applicationHost/applicationPools/* /* | where {$_.ProcessModel.identitytype -eq 'ApplicationPoolIdentity'} | foreach {Write-Host IIS APPPOOL\$($_.Name)}
- Hyper-V 虚拟机
在 Server 2008+ 和 Windows 8+ 上,您有 Hyper-V,每个虚拟机都会创建自己的虚拟帐户,如下所示:
NT VIRTUAL MACHINE\1043F032-2199-4DEA-8E69-72031FAA50C5
要获取列表,请使用:
get-vm | foreach {Write-Host NT VIRTUAL MACHINE\$($_.Id) - $($_.VMName)}
即使这些帐户在权限对话框中不被接受,您仍然可以使用它们和 icacls.exe 来设置权限。
还有一个特殊组NT Virtual Machine\Virtual Machines
,它不会在其他地方显示。所有虚拟机帐户都是此组的成员,因此您可以使用它来设置所有 VM 文件的权限。
这些名称是特定于语言的,例如在德语中它被命名为NT Virtual Machine\Virtuelle Computer
- 桌面窗口管理器
dvm.exe 进程(桌面窗口管理器)在用户下运行Windows Manager\DWM-1
同样,您不能在权限对话框中使用此类用户。实际上也不可能枚举这些用户,因为每个“桌面会话”都有一个,因此当使用两个 RDP 会话时,除了 之外,您还拥有DWM-2
和。因此,可用的桌面数量与桌面数量一样多。DWM-3
DVM-1
- 计算机名称
在某些情况下,您还可以在权限对话框中使用计算机名称,通常是作为 Active Directory 域的一部分。
- Windows Remoting 虚拟用户
当使用 PowerShell 和“JEA(足够的管理)”并通过 PS 远程会话连接到服务器时,可能会创建一个临时虚拟用户。
它们的格式如下:
winrm virtual users\winrm va_x_computername_username
以及以以下格式开头的 SIDS-1-5-94-
‘x’ 是一个整数。
这些帐户可以在分配 NTFS 权限时使用,但我不知道如何列出所有这些可能的虚拟用户。
在 JEA 会话中,您可以使用它whoami
来找出当前帐户名称。
- 最后:
即使这些列表也没有提供所有可能的帐户。
例如,您可以创建一个应用程序池FooBarPool
,然后再次删除它,您仍然可以IIS APPPOOL\FooBarPool
在权限对话框中使用,因此某处必须有一个内部列表。
答案2
这是因为 TrustedInstaller 是一种服务,而不是“用户”对象。在 Vista 中,服务现在是安全主体,可以分配权限。
http://technet.microsoft.com/en-us/magazine/2007.06.acl.aspx
答案3
- 转到硬盘上的任何文件,右键单击,然后选择属性。
转到安全选项卡并单击
Edit
- 点击
Add...
点击
Advanced...
点击
Object Types...
并取消选中Groups
,然后点击OK
点击
Find Now
。这将列出所有常规用户和内置系统用户(Windows 称之为“内置安全原则”)。
请注意全部此页面上显示的帐户可以在 Run-As 命令中使用,但它们都可以在权限对话框中使用。
答案4
您可以使用 NetQueryDisplayInformation API,结合对用户信息标志的按位检查。我有完全相同的需求,所以我编写了一个示例代码(从 MSDN GROUP 查询修改而来)。
我使用的用户标志是 UF_NORMAL_ACCOUNT UF_ACCOUNTDISABLE UF_PASSWD_NOTREQD ---> 这确保我们获得人类账户,人类账户始终需要密码。
工作代码位于:http://www.cceye.com/list-system-normal-user-account-only/