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

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

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

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

Ответы [ 25 ]

5 голосов
/ 02 июня 2016

Вы также можете принудительно открыть приложение от имени администратора.Конечно, если у вас есть учетная запись администратора.

enter image description here

Найдите файл, щелкните правой кнопкой мыши> свойства> Ярлык> Дополнительно и выберите Запуск от имени администратора

Затем нажмите OK.

4 голосов
/ 13 июля 2015

C:\Users\"username"\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Windows PowerShell - это место, где расположен ярлык PowerShell.Он также все еще перемещается в другое место для вызова фактического exe (%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe).

Поскольку PowerShell управляется профилем пользователя, когда речь идет о разрешениях;если ваше имя пользователя / профиль имеет полномочия на выполнение каких-либо действий, то в этом профиле в PowerShell вы, как правило, сможете это сделать.При этом будет иметь смысл изменить ярлык, расположенный под вашим профилем пользователя, например, C:\Users\"username"\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Windows PowerShell.

Щелкните правой кнопкой мыши и выберите свойства.Нажмите кнопку «Дополнительно» на вкладке «Ярлык», расположенной прямо под текстовым полем «Комментарии», расположенным справа от двух других кнопок, «Открыть расположение файла» и «Изменить значок», соответственно.

Проверьтефлажок «Запуск от имени администратора».Нажмите ОК , затем Применить и ОК .Еще раз щелкните правой кнопкой мыши значок с надписью «Windows PowerShell», расположенный в C:\Users\"username"\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Windows PowerShell, и выберите «Прикрепить к меню« Пуск »/ панели задач».

Теперь, когда вы щелкаете по этому значку, он вызывает UAC * 1022.* для обострения.Выбрав «ДА», вы увидите, что консоль PowerShell открыта, и она будет помечена как «Администратор» в верхней части экрана.

Чтобы продвинуться дальше ... вы можете щелкнуть правой кнопкой мыши по этому же ярлыкув расположении своего профиля Windows PowerShell и назначьте сочетание клавиш, которое будет действовать точно так же, как если бы вы нажали недавно добавленный значок.Поэтому там, где написано «Сочетание клавиш», введите комбинацию клавиш / кнопок, например: Ctrl + Alt + P P (для PowerShell) .Нажмите Применить и OK .

Теперь все, что вам нужно сделать, это нажать назначенную комбинацию кнопок, и вы увидите, как активируется UAC, и после того, как вы выберете «ДА».'вы увидите консоль PowerShell, а в строке заголовка появится надпись «Администратор».

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

Это поведение является намеренным.Существует несколько уровней безопасности, поскольку Microsoft действительно не хотела, чтобы файлы .ps1 были последним почтовым вирусом.Некоторые люди считают, что это противоречит самому понятию автоматизации задач, что справедливо.Модель безопасности Vista + состоит в том, чтобы «деавтоматизировать» вещи, тем самым заставляя пользователя их устраивать.

Однако, я подозреваю, что если вы запустите PowerShell как повышенный, он сможет запускать пакетные файлы без запроса пароля.снова, пока вы не закроете powershell.

3 голосов
/ 20 сентября 2017

Ряд ответов здесь близок, но немного больше работы, чем необходимо.

Создайте ярлык для вашего скрипта и настройте его на «Запуск от имени администратора»:

  • Создайте ярлык.
  • Щелкните правой кнопкой мыши ярлык и откройте Properties...
  • Редактировать Target из <script-path> в powershell <script-path>
  • Нажмите Дополнительно... и включите Run as administrator
2 голосов
/ 13 мая 2013

Другое простое решение заключается в том, что вы также можете щелкнуть правой кнопкой мыши «C: \ Windows \ System32 \ cmd.exe» и выбрать «Запуск от имени администратора», после чего вы можете запускать любое приложение от имени администратора без ввода пароля.

2 голосов
/ 05 апреля 2018

Я использую решение ниже. Он обрабатывает stdout / stderr с помощью функции транскрипции и правильно передает код завершения родительскому процессу. Вам необходимо настроить путь / имя файла.

If (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator"))
{ 
  echo "* Respawning PowerShell child process with elevated privileges"
  $pinfo = New-Object System.Diagnostics.ProcessStartInfo
  $pinfo.FileName = "powershell"
  $pinfo.Arguments = "& '" + $myinvocation.mycommand.definition + "'"
  $pinfo.Verb = "RunAs"
  $pinfo.RedirectStandardError = $false
  $pinfo.RedirectStandardOutput = $false
  $pinfo.UseShellExecute = $true
  $p = New-Object System.Diagnostics.Process
  $p.StartInfo = $pinfo
  $p.Start() | Out-Null
  $p.WaitForExit()
  echo "* Child process finished"
  type "C:/jenkins/transcript.txt"
  Remove-Item "C:/jenkins/transcript.txt"
  Exit $p.ExitCode
} Else {
  echo "Child process starting with admin privileges"
  Start-Transcript -Path "C:/jenkins/transcript.txt"
}

# Rest of your script goes here, it will be executed with elevated privileges
2 голосов
/ 22 июля 2017

Проблема с ответами @ pgk и @ Andrew Odri заключается в том, что у вас есть параметры сценария, особенно когда они являются обязательными. Вы можете решить эту проблему, используя следующий подход:

  1. Пользователь щелкает правой кнопкой мыши файл .ps1 и выбирает «Запустить с помощью PowerShell»: запросите параметры в полях ввода (это гораздо лучший вариант, чем использовать HelpMessage атрибут атрибута);
  2. Пользователь выполняет скрипт через консоль: разрешите ему передать желаемые параметры и разрешите консоли заставить его сообщать обязательные.

Вот как будет выглядеть код, если сценарий имеет обязательные параметры ComputerName и Port :

[CmdletBinding(DefaultParametersetName='RunWithPowerShellContextMenu')]
param (
    [parameter(ParameterSetName='CallFromCommandLine')]
    [switch] $CallFromCommandLine,

    [parameter(Mandatory=$false, ParameterSetName='RunWithPowerShellContextMenu')]
    [parameter(Mandatory=$true, ParameterSetName='CallFromCommandLine')]
    [string] $ComputerName,

    [parameter(Mandatory=$false, ParameterSetName='RunWithPowerShellContextMenu')]
    [parameter(Mandatory=$true, ParameterSetName='CallFromCommandLine')]
    [UInt16] $Port
)

function Assert-AdministrativePrivileges([bool] $CalledFromRunWithPowerShellMenu)
{
    $isAdministrator = ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)

    if ($isAdministrator)
    {
        if (!$CalledFromRunWithPowerShellMenu -and !$CallFromCommandLine)
        {
            # Must call itself asking for obligatory parameters
            & "$PSCommandPath" @script:PSBoundParameters -CallFromCommandLine
            Exit
        }
    }
    else
    {
        if (!$CalledFromRunWithPowerShellMenu -and !$CallFromCommandLine)
        {
            $serializedParams = [Management.Automation.PSSerializer]::Serialize($script:PSBoundParameters)

            $scriptStr = @"
                `$serializedParams = '$($serializedParams -replace "'", "''")'

                `$params = [Management.Automation.PSSerializer]::Deserialize(`$serializedParams)

                & "$PSCommandPath" @params -CallFromCommandLine
"@

            $scriptBytes = [System.Text.Encoding]::Unicode.GetBytes($scriptStr)
            $encodedCommand = [Convert]::ToBase64String($scriptBytes)

            # If this script is called from another one, the execution flow must wait for this script to finish.
            Start-Process -FilePath 'powershell' -ArgumentList "-ExecutionPolicy Bypass -NoProfile -EncodedCommand $encodedCommand" -Verb 'RunAs' -Wait
        }
        else
        {
            # When you use the "Run with PowerShell" feature, the Windows PowerShell console window appears only briefly.
            # The NoExit option makes the window stay visible, so the user can see the script result.
            Start-Process -FilePath 'powershell' -ArgumentList "-ExecutionPolicy Bypass -NoProfile -NoExit -File ""$PSCommandPath""" -Verb 'RunAs'
        }

        Exit
    }
}

function Get-UserParameters()
{
    [string] $script:ComputerName = [Microsoft.VisualBasic.Interaction]::InputBox('Enter a computer name:', 'Testing Network Connection')

    if ($script:ComputerName -eq '')
    {
        throw 'The computer name is required.'
    }

    [string] $inputPort = [Microsoft.VisualBasic.Interaction]::InputBox('Enter a TCP port:', 'Testing Network Connection')

    if ($inputPort -ne '')
    {
        if (-not [UInt16]::TryParse($inputPort, [ref]$script:Port))
        {
            throw "The value '$inputPort' is invalid for a port number."
        }
    }
    else
    {
        throw 'The TCP port is required.'
    }
}

# $MyInvocation.Line is empty in the second script execution, when a new powershell session
# is started for this script via Start-Process with the -File option.
$calledFromRunWithPowerShellMenu = $MyInvocation.Line -eq '' -or $MyInvocation.Line.StartsWith('if((Get-ExecutionPolicy')

Assert-AdministrativePrivileges $calledFromRunWithPowerShellMenu

# Necessary for InputBox
[System.Reflection.Assembly]::Load('Microsoft.VisualBasic, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a') | Out-Null

if ($calledFromRunWithPowerShellMenu)
{
    Get-UserParameters
}

# ... script code
Test-NetConnection -ComputerName $ComputerName -Port $Port
2 голосов
/ 13 мая 2015

Я нашел способ сделать это ...

Создайте командный файл, чтобы открыть ваш скрипт:

@echo off
START "" "C:\Scripts\ScriptName.ps1"

Затем создайте ярлык, на рабочем столе произнесите (правый клик Новый -> Ярлык ).

Затем вставьте это в местоположение:

C:\Windows\System32\runas.exe /savecred /user:*DOMAIN*\*ADMIN USERNAME* C:\Scripts\BatchFileName.bat

При первом открытии вам необходимо будет ввести пароль один раз. Затем он сохранится в диспетчере учетных данных Windows.

После этого вы сможете работать от имени администратора без необходимости ввода имени пользователя или пароля администратора.

1 голос
/ 15 июля 2019

Ниже приведен фрагмент кода для сценариев Powershell , в котором сохраняется рабочий каталог :

if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) {
    Start-Process PowerShell -Verb RunAs "-NoProfile -ExecutionPolicy Bypass -Command `"cd '$pwd'; & '$PSCommandPath';`"";
    exit;
}

# Your script here

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

Если вы не хотите использовать самоподъемный скрипт / фрагмент, а вместо этого просто хотите получитьпростой способ запустить скрипт от имени администратора (например, из контекстного меню Проводника), см. мой другой ответ здесь: https://stackoverflow.com/a/57033941/2441655

1 голос
/ 05 ноября 2016

Самый надежный способ, который я нашел, - это обернуть его в самоподъемный файл .bat:

@echo off
NET SESSION 1>NUL 2>NUL
IF %ERRORLEVEL% EQU 0 GOTO ADMINTASKS
CD %~dp0
MSHTA "javascript: var shell = new ActiveXObject('shell.application'); shell.ShellExecute('%~nx0', '', '', 'runas', 0); close();"
EXIT

:ADMINTASKS

powershell -file "c:\users\joecoder\scripts\admin_tasks.ps1"

EXIT

.bat проверяет, являетесь ли вы администратором, и перезапускает скрипт как администратор, еслинеобходимо.Он также предотвращает открытие посторонних окон «cmd» с 4-м параметром ShellExecute(), установленным на 0.

...