如何列出任何用户的 Windows 权限

如何列出任何用户的 Windows 权限

我正在尝试编写一个脚本来列出所有用户帐户的权限(例如SeShutDownPrivilege等)。我希望我的脚本可以作为标准用户运行,但如果必须,我也可以作为管理员帐户运行它。以下是我迄今为止尝试过的方法:

  • 使用 tokensz(来自https://blogs.technet.microsoft.com/askds/2007/11/02/whats-in-a-token/):tokensz /compute_tokensize /dump_groups适用于当前登录的用户 ( )。但即使以域管理员身份登录,在尝试其他用户 ( tokensz /compute_tokensize /dump_groups /user:[another.user]) 时,我也会收到错误SEC_E_LOGON_DENIED

  • whoami /all有效,但仅适用于当前登录的用户

  • ntrights.exe似乎无法列出权限,只能添加和删除。

  • secedit /export /areas USER_RIGHTS /cfg out.txt:列出所有权限以及拥有该权限的 SID,但该列表似乎不完整; 的输出显示具有 的tokensz用户,但的输出列出了不是其成员的组。John.SmithSeShutdownPrivilegeseceditSeShutdownPrivilegeJohn.Smith

我可以使用可移植可执行文件(例如tokensz.exentrights.exe和内置实用程序,但无法安装应用程序或扩展

答案1

您可以使用访问检查来完成这个任务。

Accesschk “domain\user” -a *将列出给定域用户的所有权限。

您可以在 PowerShell 脚本中调用该程序,将结果连接到文本文件中,然后筛选出您想要了解的权限。

答案2

对于任何寻找 PowerShell 脚本的人来说,这应该是可以的:

gwmi Win32_UserProfile | foreach-object {
 $sid = New-Object System.Security.Principal.SecurityIdentifier($_.SID)
 $user = $sid.Translate([System.Security.Principal.NTAccount])
 $username = $user.Value
 $username
 $chkCmd = "accesschk """ + $username + """ -a * -q"
 iex $chkCmd
 ""
}

它获取具有个人资料的用户列表在本地机器上,根据 SID 确定其名称,并accesschk根据 Ramhound 的建议对其进行调用。每个用户的记录以格式的用户名开头DOMAIN\user,每行包含一个权限,最后以一个空白行结尾。(SID 翻译由本文。)您可以使用重定向运算符将其内容转储到文件中>

AccessChk 的一个缺点是,它似乎会为没有本地管理员权限的域用户生成一个空列表。因此,此版本为域中和机器上的每个已知用户生成上述信息有点蹩脚,但可能会在该工具的未来版本中变得有用:

gwmi Win32_UserAccount | foreach-object {
 $username = $_.Caption
 $username
 $chkCmd = "accesschk """ + $username + """ -a * -q"
 iex $chkCmd
 ""
}

如果您想知道它secedit在说什么,它只是获取在用户权限分配中已分配权限的主体列表(SID 格式)(请参阅secpol.msc)。因此,您通常会看到用户或管理员等组的 SID,而不是特定人员的 SID。

相关内容