В скрипте PowerShell, как я могу проверить, работает ли я с правами администратора?

Ответы:

36
$currentPrincipal = New-Object Security.Principal.WindowsPrincipal([Security.Principal.WindowsIdentity]::GetCurrent())
$currentPrincipal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)

(из трюков безопасности командной строки )

Davey
источник
2
$ currentPrincipal = New-Object Security.Principal.WindowsPrincipal ([Security.Principal.WindowsIdentity] :: GetCurrent ()) & {if ($ currentPrincipal.IsInRole ([Security.Principal.WindowsBuiltInRole] :: Administrator)) {(get- host) .UI.RawUI.Backgroundcolor = "DarkRed" clear-host write-host "Предупреждение: PowerShell работает от имени администратора. n"}
Дейви
Первая строка: последняя закрывающая скобка) отсутствует. Я не могу это исправить, так как меняется менее 6 символов.
Ксавье Николет
57

В Powershell 4.0 вы можете использовать требования в верхней части вашего скрипта:

#Requires -RunAsAdministrator

Выходы:

Сценарий «MyScript.ps1» не может быть запущен, поскольку он содержит оператор «#requires» для запуска в качестве администратора. Текущий сеанс Windows PowerShell не работает от имени администратора. Запустите Windows PowerShell с помощью параметра «Запуск от имени администратора» и попробуйте снова запустить сценарий.

eddiegroves
источник
Не совсем то, что я искал, но все еще очень полезно. Спасибо Эдди!
Майкл Келли
33
function Test-Administrator  
{  
    $user = [Security.Principal.WindowsIdentity]::GetCurrent();
    (New-Object Security.Principal.WindowsPrincipal $user).IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator)  
}

Выполните вышеуказанную функцию. Если результат равен True, пользователь имеет права администратора.

Шей Леви
источник
4
Это только определяет, является ли пользователь, выполняющий сценарий, администратором на компьютере, а не то, выполняется ли сценарий в настоящее время с правами администратора . Другими словами, это все равно вернет true, даже если пользователь не использовал «запуск от имени администратора» для запуска командной оболочки.
Целостный разработчик
2
@HolisticDeveloper, это неверно. Если вы не повышены, он вернет false
charleswj81
@ charleswj81 На данный момент я наблюдаю поведение, которое описывает Holistic Developer.
zneak
Я не думаю, что вам нужна точка с запятой ... но это говорит о том, что я тоже не думаю, что это приводит к ошибке
Каньон Колоб
Это работает для меня на Win10 с 2018. Возвращает False, если текущая учетная запись пользователя не повышена, возвращает True, если powershell работает с повышенными правами.
Арберг
0

Он проверит, являетесь ли вы администратором, если нет, то он снова откроется в PowerShell ISE в качестве администратора.

Надеюсь это поможет!

    $ver = $host | select version
    if ($ver.Version.Major -gt 1)  {$Host.Runspace.ThreadOptions = "ReuseThread"}

    # Verify that user running script is an administrator
    $IsAdmin=[Security.Principal.WindowsIdentity]::GetCurrent()
    If ((New-Object Security.Principal.WindowsPrincipal $IsAdmin).IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator) -eq $FALSE)
    {
      "`nERROR: You are NOT a local administrator.  Run this script after logging on with a local administrator account."
        # We are not running "as Administrator" - so relaunch as administrator

        # Create a new process object that starts PowerShell
        $newProcess = new-object System.Diagnostics.ProcessStartInfo "PowerShell_ise";

        # Specify the current script path and name as a parameter
        $newProcess.Arguments = $myInvocation.MyCommand.Definition;

        # Indicate that the process should be elevated
        $newProcess.Verb = "runas";

        # Start the new process
        [System.Diagnostics.Process]::Start($newProcess);

        # Exit from the current, unelevated, process
        exit
    }
blayderunner123
источник
0

В качестве комбинации приведенных выше ответов вы можете использовать что-то вроде следующего в начале вашего сценария:

# todo: put this in a dedicated file for reuse and dot-source the file
function Test-Administrator  
{  
    [OutputType([bool])]
    param()
    process {
        [Security.Principal.WindowsPrincipal]$user = [Security.Principal.WindowsIdentity]::GetCurrent();
        return $user.IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator);
    }
}

if(-not (Test-Administrator))
{
    # TODO: define proper exit codes for the given errors 
    Write-Error "This script must be executed as Administrator.";
    exit 1;
}

$ErrorActionPreference = "Stop";

# do something

Другой способ - запустить скрипт с этой строкой, что предотвратит его выполнение, если он не запущен с правами администратора.

#Requires -RunAsAdministrator
MovGP0
источник
1
К сожалению, это не работает. Если скрипт не запущен с повышенными правами, он даже не загрузится, и вы не увидите свое сообщение об ошибке.
JamesQMurphy
Спасибо. Я исправил свой ответ выше.
MovGP0