2013-09-07 2 views
1

В этой теме я нашел способ проверить, имеет ли пользователь административные привилегии. Однако, когда я пытаюсь использовать логическую логику, это не сработает.Административные привилегии

$user = [Security.Principal.WindowsIdentity]::GetCurrent(); 
(New-Object Security.Principal.WindowsPrincipal $user).IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator) 

if($user = $false){cls;Write-warning "Starting and stopping services can only be done with administrative privileges.`nPlease restart this script from an elevated prompt!";Read-host;exit 
} 

Проблема заключается в том, в то время как работает скрипт с моего компьютера, не возбуждая Powershell с правами администратора текст «False» идет вверх. Тем не менее, оператор if не срабатывает. Я определяю его неправильно?

EDIT: Когда я использую $true вместо $false, оператор if запускается как в том случае, когда я это делаю, так и не запускаю скрипт из подсказки с повышенными правами.

ответ

6

Есть 2 проблемы с условием $user = $false:

  1. Это не условие, в первую очередь. = - оператор присваивания, а не оператор сравнения. Вам нужно -eq, чтобы проверить равенство.
  2. $user не является логическим значением. То, что вы на самом деле хотите проверить здесь, - это возвращаемое значение метода IsInRole(). Однако вы никогда не назначаете его переменной, поэтому вы не можете использовать ее в другом месте вашего кода.

Измените код следующим образом:

$user = [Security.Principal.WindowsIdentity]::GetCurrent() 
$isAdmin = (New-Object Security.Principal.WindowsPrincipal $user).IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator) 

if (-not $isAdmin) { 
    cls 
    Write-warning "Starting and stopping services can ..." 
    Read-host 
    exit 
} 

и проблема исчезнет.

+0

Это имеет смысл. На самом деле у меня был -eq в моем оригинальном скрипте. Бог знает, почему я написал «=» здесь. Интересно, однако, где идет новый объект, когда я не назначаю его переменной? Ноль? –

+0

Он будет задерживаться в памяти, пока сборщик мусора не избавится от него. –

0

кажется любопытным мне .. Ты не можешь просто обновить следующие быть сделать то же проверку:

if !($isAdmin) { 
    cls 
    Write-warning "Starting and stopping services can ..." 
    Read-host 
    exit 
} 
+0

Это вызовет ошибку. '!' и '-not' имеют одинаковый смысл (отрицают следующее условие), но они ** должны ** находиться внутри круглых скобок. –

Смежные вопросы