Как запустить скрипт на Windows-серверах WinRM - PullRequest
0 голосов
/ 11 октября 2018

Я пытаюсь запустить скрипт, который ищет / загружает / устанавливает обновления Windows на удаленных компьютерах с помощью WinRM.Я запускаю этот скрипт как пользователь домена с правами администратора.Тем не менее я получаю сообщение об отказе в доступе.

Теперь у меня скопирован скрипт на удаленные серверы, но я не могу просмотреть вывод, чтобы увидеть, запущен скрипт или нет.

ВЫХОД Я хочу видеть: enter image description here

# Continue running on other servers on error
$ErrorActionPreference = "Continue"

# Server list
$servers = Get-Content "C:\Users\admin\Desktop\vm-nonprod.txt"

# Logs
$log = "C:\Users\admin\Desktop\log-nonprod.txt"

# Path to script on server list
$scriptpath = "C:\Patch.ps1"

$results = @()

foreach ($server in $servers) {

    try {

        $Credential = Import-CliXml -Path "C:\Users\admin\Desktop\admin.Cred"

        #New-PSSession -ComputerName $server -Credential $Credential
        Invoke-Command -ComputerName $server -Credential $Credential -ScriptBlock {$scriptpath} -ArgumentList "Y" | Out-File -FilePath C:\Users\admin\Desktop\WinPatch.txt
        #Invoke-Command -ComputerName $server -Credential hhq\admin -FilePath "C:\Users\admin\Documents\Patch.ps1"
        #Copy-Item -Path C:\Users\admin\Documents\Patch.ps1 -Destination 'C:\' -ToSession (New-PSSession –ComputerName $server -Credential $Credential)
    }
    catch {
        Write-Output ("Error running script on remote host: " + $server)
    }
}

$results | Export-Csv -NoTypeInformation $log

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

Здесь есть несколько проблем.

  1. Существует ли скрипт на сервере?
    Похоже, да, у вас есть Patch.ps1 в C:\ на каждом $server
  2. Блок сценариев не запускает сценарий - просто печатает переменную.
    Чтобы запустить его, измените {$scriptpath} на {. $scriptpath} или {& $scriptpath}
  3. Переменная $scriptpath имеет видне входит в область действия скриптового блока - вам нужно будет передать его в -ArgumentList

    Изменение: {$scriptpath} -ArgumentList "Y"
    ____To: {param($p); . $p} -ArgumentList $scriptpath

  4. Аргумент«Y» передается в скрипт, а не в скрипт.Блок сценария не ищет его, поэтому это значение теряется.
    Предположим, вы хотите, чтобы оно было передано в сценарий - это необходимо сделать в блоке сценария:
    {$scriptpath "Y"}

  5. Я бы порекомендовал избавиться от Out-File, пока вы не будете довольны выводом в консоли.


Соберите все вместе:

-ScriptBlock {$scriptpath} -ArgumentList "Y" | Out-File -FilePath C:\Users\admin\Desktop\WinPatch.txt

-ScriptBlock {param($p); . $p "Y"} -ArgumentList $scriptpath
0 голосов
/ 11 октября 2018

Я полагаю, что вы неправильно прокомментировали команду Invoke-Command.У того, кто работает, есть только имя пользователя hhq \ admin в параметре учетных данных.Это может произойти сбой из-за этого, потому что он будет запрашивать пароль во время выполнения.

...