Powershell 管理员权限的通用测试

Powershell 管理员权限的通用测试,powershell,Powershell,是否有一个单一的保证方法来测试当前用户是否具有管理员权限?我试过这个 $isAdmin = (new-object System.Security.Principal.WindowsPrincipal([System.Security.Principal.WindowsIdentity]::GetCurrent())).IsInRole("Administrators") 只要Windows最初是用英语安装的,它就可以工作。如果Windows以西班牙语安装,则必须测试Administrador

是否有一个单一的保证方法来测试当前用户是否具有管理员权限?我试过这个

$isAdmin = (new-object System.Security.Principal.WindowsPrincipal([System.Security.Principal.WindowsIdentity]::GetCurrent())).IsInRole("Administrators")
只要Windows最初是用英语安装的,它就可以工作。如果Windows以西班牙语安装,则必须测试Administradors。还有一些其他语言也有类似的功能。
我的第一个想法是只测试所有可能的拼写,但如果有简单、优雅和万无一失的拼写,那将是我的首选。

您可以使用管理员SID,因为它是静态的

SID:S-1-5-32-544

姓名:管理员

描述:内置组。首次安装operatingsystem后,组中唯一的成员是管理员帐户。当计算机加入域时,域管理员组将添加到管理员组。当服务器成为域控制器时,企业管理员组也将添加到管理员组


您正在调用
IsInRole
方法的
String
定义,这就是为什么在不同语言中出现问题的原因

如果查看
IsInRole
重载定义,您将看到第一个定义是
String
,这是您在代码中调用的定义

OverloadDefinitions
-------------------
bool IsInRole(string role)
bool IsInRole(System.Security.Principal.WindowsBuiltInRole role)
bool IsInRole(int rid)
bool IsInRole(System.Security.Principal.SecurityIdentifier sid)
bool IPrincipal.IsInRole(string role)
这种基于字符串的重载与
NET LOCALGROUP Administrators
命令具有相同的缺点,它依赖于不同操作系统语言中不相同的组名

要解决此问题,请使用
System.Security.Principal.WindowsBuiltInRole
重载定义:

$role = [System.Security.Principal.WindowsBuiltInRole] "Administrator"
并检查此角色:

$isAdmin = (new-object System.Security.Principal.WindowsPrincipal([System.Security.Principal.WindowsIdentity]::GetCurrent())).IsInRole($role)
这样,您就不需要关心不同的操作系统语言

*要获取所有可用的WindowsBuiltInRoles,请执行以下操作:

[System.Enum]::GetValues([System.Security.Principal.WindowsBuiltInRole])

Frode,这对我来说返回false,无论是作为管理员运行还是双击测试脚本的快捷方式。在Windows7 Home上测试,如果可能会有影响的话。在Win10的PS2.0中得到了相同的错误。PS 5.0自动将SID值(字符串)强制转换为SID对象。在PS2.0中,我必须手动执行此操作。更新的答案应该有效。作为一种替代方法,您可以使用WMI将SID解析为组名:
([WMI]“Win32_SID.SID='S-1-5-32-544')。AccountName
。有趣的是,虽然所有这些方法都会测试用户帐户是否为管理员帐户,但它们似乎无法验证是否确实应用了完整的管理员权限。与中一样,有时如果不以管理员身份右键单击运行,Powershell将无法在程序文件中执行文件操纵等操作。我正在使用本地管理员组中的帐户测试我的答案。正常打开powershell:False。使用Run-as-admin:True打开powershell。多年来,我一直在脚本中使用这种技术,没有出现任何问题。
[System.Enum]::GetValues([System.Security.Principal.WindowsBuiltInRole])