用于检查管理员权限的代码在某些服务器上不起作用

Code to check for Administrator privileges not working on some servers

我写的一个小脚本中有一行代码在执行之前检查 Powershell 是否具有管理权限。下面是带有管理检查的代码段:

If (-NOT ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole(` [Security.Principal.WindowsBuiltInRole] “Administrator”))
{
 Write-Warning “You do not have Administrator rights to run this script.`nPlease re-run this script as an Administrator.”
 Break
}

当某些客户 运行 他们收到以下错误的脚本时,我不确定为什么。有人可以给我解释一下吗?

Error message in PowerShell screenshot link

编辑:需要说明的是,该脚本在大多数安装了 PowerShell 的服务器或计算机上运行良好,只是偶尔会有客户遇到脚本问题。

您的代码中似乎有一些奇怪的引号,就在 IsInRole( 之后,请使用每次都有效的代码:

if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) {
    Write-Warning "You do not have Administrator rights to run this script.`nPlease re-run this script as an Administrator."
    Break
}

旧版本的 PowerShell 似乎不喜欢 IsInRole(` 处的反引号。这通常用于指示代码语句继续到下一行,但在这里它用在一行的中间。

新版本的 PowerShell 似乎可以容忍代码中间的反引号,但旧版本似乎坚持将反引号作为行中的最后一个字符。

如果您如下所示在 ` 之后直接放置一个换行符(或者如果您只是删除它),它应该可以在旧的 PowerShell 中工作。

If (-NOT ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole(`
[Security.Principal.WindowsBuiltInRole] "Administrator"))
{
 Write-Warning "You do not have Administrator rights to run this script.`nPlease re-run 
this script as an Administrator."
 Break
}

为了以防万一,我还把你的弯引号改成了 ASCII 引号。