Як скрипт 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.