是否有一种保证方法可以测试当前用户是否拥有管理员权限?我试过这个
$isAdmin = (new-object System.Security.Principal.WindowsPrincipal([System.Security.Principal.WindowsIdentity]::GetCurrent())).IsInRole("Administrators")
只要Windows最初安装在英语中,它就可以工作。如果Windows以西班牙语安装,则必须测试Administra d ors。还有一些其他类似的语言。 我的第一个想法就是测试所有可能的拼写,但如果有简单,优雅和万无一失的东西,这将是我的偏好。
答案 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"))