Як скрипт PowerShell, як я можу перевірити, чи працює я з правами адміністратора?


Відповіді:


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

(з прийомів безпеки командного рядка )


2
$ currentPrincipal = Новий об'єкт Security.Principal.WindowsPrincipal ([Security.Principal.WindowsIdentity] :: GetCurrent ()) & {if ($ currentPrincipal.IsInRole ([Security.Principal.WindowsBuiltInRole] :: Administrator) {(get- хост) .UI.RawUI.Backgroundcolor = "DarkRed" clear-host write-host "Попередження: PowerShell працює як адміністратор.`
— n

Перший рядок: остання дужка закриття) відсутня. Я не можу це виправити, оскільки це змінює менше 6 символів.
— Ксав'є Ніколлет

57

У Powershell 4.0 ви можете використовувати потрібно у верхній частині сценарію:

#Requires -RunAsAdministrator

Виходи:

Сценарій 'MyScript.ps1' неможливо запустити, оскільки він містить оператор "#requires" для запуску адміністратора. Поточний сеанс Windows PowerShell не працює як адміністратор. Запустіть Windows PowerShell, скориставшись опцією Запустити як адміністратор, а потім спробуйте запустити сценарій ще раз.


Не зовсім те, що я шукав, але все ще дуже корисний. Дякую Едді!
— Майкл Келлі

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

Виконайте вищевказану функцію. Якщо результат є True, користувач має права адміністратора.


4
Це визначає лише те, чи користувач, що запускає скрипт, є адміністратором на машині, а не, якщо сценарій виконується в даний час з адміністративними привілеями . Іншими словами, це все одно поверне справжнє значення, навіть якщо користувач не використовував "запустити як адміністратор" для запуску командної оболонки.
— Holistic Developer

2
@HolisticDeveloper, це неправильно. Якщо ви не піднесені, воно повернеться неправдивим
— charleswj81

@ charleswj81 відтепер я спостерігаю поведінку, яку описує Holistic Developer.
— zneak

Я не думаю, що тобі потрібна
— напівкрапка

Це працює для мене на Win10 станом на 2018 рік. Повертається помилково, якщо поточний обліковий запис користувача не підвищено, повертає значення "True", якщо патрон енергоблоку працює підвищеним.
— Арберг

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
    }

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

1
На жаль, це не працює. Якщо сценарій не працює з підвищеними правами, він навіть не завантажиться, і ви не побачите власне повідомлення про помилку.
— JamesQMurphy

Дякую. Я виправив свою відповідь вище.
— MovGP0
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.