我正在尝试编写一个脚本来列出所有用户帐户的权限(例如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.Smith
SeShutdownPrivilege
secedit
SeShutdownPrivilege
John.Smith
我可以使用可移植可执行文件(例如tokensz.exe
)ntrights.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。