Код для проверки прав администратора не работает на некоторых серверах

У меня есть строка кода в небольшом написанном мной сценарии, который проверяет, есть ли у 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
}

Когда некоторые клиенты запускают скрипт, они получают следующую ошибку, и я не уверен, почему. Может кто-нибудь, пожалуйста, объясните мне это?

Сообщение об ошибке в ссылке на скриншот PowerShell

РЕДАКТИРОВАТЬ: Чтобы было ясно, сценарий отлично работает на большинстве серверов или компьютеров с установленным PowerShell, только у клиента время от времени возникают проблемы со сценарием.

1 ответ

Решение

Кажется, в вашем коде есть несколько странных цитат сразу после 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.

Другие вопросы по тегам