Как я могу запустить пакетный скрипт с повышенными правами удаленно с powershell - PullRequest
0 голосов
/ 04 января 2019

Я пишу скрипт, который должен запускать пакет на нескольких удаленных компьютерах. Эти пакетные сценарии должны выполняться с правами администратора домена.

Возможно ли даже добиться этого с помощью командлета Invoke-Command?

Я уже включил WinRM на удаленной машине, поэтому не думаю, что это проблема.

$computername = Read-Host "Enter Hostname"

$user = "mydomain\administrator"
$pwd = Read-Host "Enter Password" -AsSecureString
$cred = New-Object System.Management.Automation.PSCredential ("$user", $pwd)

Invoke-Command -ComputerName $computername -Credential $cred -ScriptBlock {
    $remoteuser = "mydomain\administrator"
    $remotepwd = Read-Host "Enter Password" -AsSecureString
    $remotecred = New-Object System.Management.Automation.PSCredential ("$remoteuser", $remotepwd)

    $script = "\\path_to_script\script.bat"

    Start-Process $script -Credential $cred1    
}

Я ожидаю, что скрипт будет запущен под учетными данными администратора домена на удаленной машине. Вместо этого я получаю эту ошибку:

CategoryInfo: NotSpecified: (:) [Start-Process], UnauthorizedAccessException FullyQualifiedErrorId: System.UnauthorizedAccessException, Microsoft.PowerShell.Commands.StartProcessCommand PSComputerName: mycomputername

1 Ответ

0 голосов
/ 04 января 2019

Ваша $cred1 переменная не существует, она должна быть $remotecred:

Start-Process $script -Credential $remotecred

Имя переменной $pwd зарезервировано для «рабочего каталога печати».

Это можно увидеть запустив новую консоль PowerShell и запросив ее, вы получите значение для текущего рабочего каталога:

PS C:\WINDOWS\system32> $pwd

Path
----
C:\WINDOWS\system32

Вместо этого используйте что-то другое, например $pass.

Я бы также позвонил CMD и передал ваш пакетный файл, используя /c ( ссылка на документацию ):

Start-Process CMD -ArgumentList "/c $script" -Credential $remotecred

Реализация всего этого на практике:

$computername = Read-Host "Enter Hostname"

$user = "mydomain\administrator"
$pass = Read-Host "Enter Password" -AsSecureString
$cred = New-Object System.Management.Automation.PSCredential ($user, $pass)

Invoke-Command -ComputerName $computername -Credential $cred -ScriptBlock {
    $remoteuser = "mydomain\administrator"
    $remotepwd = Read-Host "Enter Password" -AsSecureString
    $remotecred = New-Object System.Management.Automation.PSCredential ("$remoteuser", $remotepwd)

    $script = "\\path_to_script\script.bat"

    Start-Process CMD -ArgumentList "/c $script" -Credential $remotecred
}

Если вы фактически используете те же учетные данные для удаленного сеанса, что и для запуска командного файла, тогда вам не нужен второй набор учетных данных.

Поскольку удаленный сеанс работает как mydomain\administrator, все процессы, которые он запускает, также будут запускаться от имени этого пользователя:

$computername = Read-Host "Enter Hostname"

$user = "mydomain\administrator"
$pass = Read-Host "Enter Password" -AsSecureString
$cred = New-Object System.Management.Automation.PSCredential ($user, $pass)

Invoke-Command -ComputerName $computername  -ScriptBlock {
    $script = "\\path_to_script\script.bat"

    Start-Process CMD -ArgumentList "/c $script"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...