PowerShell: запуск команды от имени администратора - PullRequest
234 голосов
/ 07 октября 2011

Вы знаете, как, если вы являетесь администратором системы, и вы можете просто щелкнуть правой кнопкой мыши, скажем, пакетный скрипт и запустить его от имени администратора без ввода пароля администратора?

Мне интересно, как это сделать с помощью скрипта PowerShell. Я не хочу вводить свой пароль; Я просто хочу имитировать щелчок правой кнопкой мыши Запуск от имени администратора метод.

Все, что я прочитал до сих пор, требует от вас ввода пароля администратора.

Ответы [ 25 ]

254 голосов
/ 07 октября 2011

Если текущая консоль не имеет повышенных прав и для операции, которую вы пытаетесь выполнить, требуются повышенные привилегии, вы можете запустить powershell с параметром «Запуск от имени администратора»

PS> Start-Process powershell -Verb runAs
95 голосов
/ 12 июля 2012

Вот дополнение к предложению Шей Леви (просто добавьте эти строки в начале сценария):

If (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator"))

{   
$arguments = "& '" + $myinvocation.mycommand.definition + "'"
Start-Process powershell -Verb runAs -ArgumentList $arguments
Break
}

В результате текущий скрипт передается новому процессу powershell в режиме администратора (если текущий пользователь имеет доступ к режиму администратора и сценарий не запускается от имени администратора).

82 голосов
/ 24 июля 2015

Самоподъемный скрипт PowerShell

Windows 8.1 / PowerShell 4.0 +

Одна строка:)

if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) { Start-Process powershell.exe "-NoProfile -ExecutionPolicy Bypass -File `"$PSCommandPath`"" -Verb RunAs; exit }

# Your script here
39 голосов
/ 10 января 2015

Бенджамин Армстронг опубликовал отличную статью о самоподъемных скриптах PowerShell .Там несколько мелких проблем с его кодом;Ниже приведена модифицированная версия, основанная на исправлениях, предложенных в комментарии.

По сути, он получает удостоверение, связанное с текущим процессом, проверяет, является ли он администратором, а если нет, создает новый процесс PowerShell садминистратор привилегий и завершает старый процесс.

# Get the ID and security principal of the current user account
$myWindowsID = [System.Security.Principal.WindowsIdentity]::GetCurrent();
$myWindowsPrincipal = New-Object System.Security.Principal.WindowsPrincipal($myWindowsID);

# Get the security principal for the administrator role
$adminRole = [System.Security.Principal.WindowsBuiltInRole]::Administrator;

# Check to see if we are currently running as an administrator
if ($myWindowsPrincipal.IsInRole($adminRole))
{
    # We are running as an administrator, so change the title and background colour to indicate this
    $Host.UI.RawUI.WindowTitle = $myInvocation.MyCommand.Definition + "(Elevated)";
    $Host.UI.RawUI.BackgroundColor = "DarkBlue";
    Clear-Host;
}
else {
    # We are not running as an administrator, so relaunch as administrator

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

    # Specify the current script path and name as a parameter with added scope and support for scripts with spaces in it's path
    $newProcess.Arguments = "& '" + $script:MyInvocation.MyCommand.Path + "'"

    # 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;
}

# Run your code that needs to be elevated here...

Write-Host -NoNewLine "Press any key to continue...";
$null = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown");
18 голосов
/ 03 октября 2016

Вы можете создать пакетный файл (*.bat), который запускает ваш скрипт powershell с правами администратора при двойном щелчке.Таким образом, вам не нужно ничего менять в вашем скрипте powershell . Для этого создайте командный файл с тем же именем и расположением вашего скрипта powershell, а затем поместите в него следующее содержимое:

@echo off

set scriptFileName=%~n0
set scriptFolderPath=%~dp0
set powershellScriptFileName=%scriptFileName%.ps1

powershell -Command "Start-Process powershell \"-ExecutionPolicy Bypass -NoProfile -NoExit -Command `\"cd \`\"%scriptFolderPath%\`\"; & \`\".\%powershellScriptFileName%\`\"`\"\" -Verb RunAs"

Вот и все!

Вот объяснение:

Если ваш скрипт powershell находится в пути C:\Temp\ScriptTest.ps1, ваш пакетный файл должен иметь путь C:\Temp\ScriptTest.bat,Когда кто-нибудь выполнит этот пакетный файл, произойдут следующие шаги:

  1. Команда cmd выполнит команду

    powershell -Command "Start-Process powershell \"-ExecutionPolicy Bypass -NoProfile -NoExit -Command `\"cd \`\"C:\Temp\`\"; & \`\".\ScriptTest.ps1\`\"`\"\" -Verb RunAs"
    
  2. Новый сеанс PowerShellоткроется, и будет выполнена следующая команда:

    Start-Process powershell "-ExecutionPolicy Bypass -NoProfile -NoExit -Command `"cd \`"C:\Temp\`"; & \`".\ScriptTest.ps1\`"`"" -Verb RunAs
    
  3. Еще один новый сеанс powershell с правами администратора откроется в папке system32 и ему будут переданы следующие аргументы:

    -ExecutionPolicy Bypass -NoProfile -NoExit -Command "cd \"C:\Temp\"; & \".\ScriptTest.ps1\""
    
  4. Следующая команда будет выполнена с правами администратора:

    cd "C:\Temp"; & ".\ScriptTest.ps1"
    

    Когда аргументы пути и имени сценария заключены в двойные кавычки, они могут содержать пробел илиодиночные кавычки (').

  5. Текущая папка изменится с system32 на C:\Temp и будет выполнен скрипт ScriptTest.ps1.После передачи параметра -NoExit окно не будет закрыто, даже если ваш скрипт powershell выдает какое-то исключение.

14 голосов
/ 08 октября 2011

Вы можете легко добавить некоторые записи реестра, чтобы получить контекстное меню «Запуск от имени администратора» для .ps1 файлов:

New-Item -Path "Registry::HKEY_CLASSES_ROOT\Microsoft.PowershellScript.1\Shell\runas\command" `
-Force -Name '' -Value '"c:\windows\system32\windowspowershell\v1.0\powershell.exe" -noexit "%1"'

(обновлено до более простого сценария из @Shay)

В основном на HKCR:\Microsoft.PowershellScript.1\Shell\runas\command установите значение по умолчанию для вызова скрипта с помощью Powershell.

12 голосов
/ 17 ноября 2014

Использование

#Requires -RunAsAdministrator

пока не заявлено.Похоже, что он существует только с PowerShell 4.0.

http://technet.microsoft.com/en-us/library/hh847765.aspx

Когда этот параметр переключателя добавляется в оператор require, он указывает, что сеанс Windows PowerShell, в котором вы находитесьзапуск сценария должен быть запущен с повышенными правами пользователя (Запуск от имени администратора).

Мне кажется, это хороший способ сделать это, но я не уверен в полевом опыте,еще.Среды выполнения PowerShell 3.0, вероятно, игнорируют это, или, что еще хуже, выдают ошибку.

Когда скрипт запускается как не администратор, выдается следующая ошибка:

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

+ CategoryInfo          : PermissionDenied: (StackOverflow.ps1:String) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : ScriptRequiresElevation
9 голосов
/ 26 июля 2013

Код, отправленный Джонатаном и Шей Леви, не работает для меня.

Пожалуйста, найдите рабочий код ниже:

If (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator"))
{   
#"No Administrative rights, it will display a popup window asking user for Admin rights"

$arguments = "& '" + $myinvocation.mycommand.definition + "'"
Start-Process "$psHome\powershell.exe" -Verb runAs -ArgumentList $arguments

break
}
#"After user clicked Yes on the popup, your file will be reopened with Admin rights"
#"Put your code here"
8 голосов
/ 11 сентября 2013

Вам необходимо перезапустить скрипт с правами администратора и проверить, был ли скрипт запущен в этом режиме.Ниже я написал скрипт, который имеет две функции: DoElevatedOperations и DoStandardOperations .Вы должны поместить свой код, который требует прав администратора, в первый, а стандартные операции - во второй.Переменная IsRunAsAdmin используется для определения режима администратора.

Мой код представляет собой упрощенный фрагмент сценария Microsoft, который автоматически создается при создании пакета приложения для приложений Магазина Windows.

param(
    [switch]$IsRunAsAdmin = $false
)

# Get our script path
$ScriptPath = (Get-Variable MyInvocation).Value.MyCommand.Path

#
# Launches an elevated process running the current script to perform tasks
# that require administrative privileges.  This function waits until the
# elevated process terminates.
#
function LaunchElevated
{
    # Set up command line arguments to the elevated process
    $RelaunchArgs = '-ExecutionPolicy Unrestricted -file "' + $ScriptPath + '" -IsRunAsAdmin'

    # Launch the process and wait for it to finish
    try
    {
        $AdminProcess = Start-Process "$PsHome\PowerShell.exe" -Verb RunAs -ArgumentList $RelaunchArgs -PassThru
    }
    catch
    {
        $Error[0] # Dump details about the last error
        exit 1
    }

    # Wait until the elevated process terminates
    while (!($AdminProcess.HasExited))
    {
        Start-Sleep -Seconds 2
    }
}

function DoElevatedOperations
{
    Write-Host "Do elevated operations"
}

function DoStandardOperations
{
    Write-Host "Do standard operations"

    LaunchElevated
}


#
# Main script entry point
#

if ($IsRunAsAdmin)
{
    DoElevatedOperations
}
else
{
    DoStandardOperations
}
6 голосов
/ 27 апреля 2018

Добавление моих 2 центов. Моя простая версия, основанная на сетевой сессии, которая до сих пор работает в Windows 7 / Windows 10. Почему это усложняет?

if (!(net session)) {$path =  "& '" + $myinvocation.mycommand.definition + "'" ; Start-Process powershell -Verb runAs -ArgumentList $path ; exit}

просто добавьте в начало скрипта, и он будет работать от имени администратора.

...