管理员权限的通用测试

时间:2016-03-05 11:01:02

标签: powershell

是否有一种保证方法可以测试当前用户是否拥有管理员权限?我试过这个

$isAdmin = (new-object System.Security.Principal.WindowsPrincipal([System.Security.Principal.WindowsIdentity]::GetCurrent())).IsInRole("Administrators")

只要Windows最初安装在英语中,它就可以工作。如果Windows以西班牙语安装,则必须测试Administra d ors。还有一些其他类似的语言。 我的第一个想法就是测试所有可能的拼写,但如果有简单,优雅和万无一失的东西,这将是我的偏好。

2 个答案:

答案 0 :(得分:4)

您正在调用String方法的IsInRole定义,这就是您遇到不同语言问题的原因。

如果您要查看IsInRole OverLoadDefinitions,您会看到第一个Defintion是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 OverLoadDefinition:

$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])

答案 1 :(得分:1)

您可以将SID用于管理员,因为它是well-known SID(静态)。

  

SID: S-1-5-32-544

     

名称:管理员

     

描述:一个内置组。初始安装操作系统后,该组的唯一成员是管理员帐户。当计算机加入域时,Domain Admins组将添加到Administrators组。当服务器成为域控制器时,Enterprise Admins组也会添加到Administrators组。

$isAdmin = (new-object System.Security.Principal.WindowsPrincipal([System.Security.Principal.WindowsIdentity]::GetCurrent())).IsInRole(([System.Security.Principal.SecurityIdentifier]"S-1-5-32-544"))