У меня здесь есть шаблон роли (XML-файл), который я создал для настройки нескольких серверов IIS одновременно. Шаблон находится на общем ресурсе UNC, у которого есть доступ на чтение к той же учетной записи пользователя, что и для запуска удаленной PowerShell. Эту учетную запись я также использую для RDP к этим серверам. Если я запускаю Install-WindowsFeature -ConfigurationFilePath \\path\to\RoleTemplate.xml на любом сервере, все работает нормально. Но выполнение этого в блоке сценария от одного сервера до многих других завершается неудачно с «Доступ к пути запрещен».

Эта команда не поддерживается изнутри ScriptBlock?


Пример сценария

$servers = "abc123 abc456 abc789";

ForEach ($server in ([regex]::matches($servers, "abc\d+") | %{$_.value})){
   Invoke-Command -ComputerName $server -ArgumentList {param($server)} -ScriptBlock {

        # IIS Role Setup
        Install-WindowsFeature -ConfigurationFilePath \\path\to\RoleTemplate.xml

        # Other irrelevant commands...

   }
}

Если я просто запускаю команду самостоятельно на этом сервере, используя те же учетные данные, она работает. Однако выполнение одного и того же оператора удаленно приводит к отказу:

Access to the path '\\path\to\RoleTemplate.xml' is denied.
    + CategoryInfo          : InvalidArgument: (\\path\to\...oleTemplate.xml:String) [Install-WindowsFeature], CmdletInvocationException
    + FullyQualifiedErrorId : Install_WindowsFeature_ConfigurationFile_Import_Exception,Microsoft.Windows.ServerManager.Commands.AddWindowsFeatureCommand
    + PSComputerName        : abc123

1 ответ1

0

После некоторого дополнительного исследования я решил использовать обходной путь.

Обходной путь - загрузить XML-файл конфигурации роли в переменную, а затем передать эту переменную в контекст Invoke-Command , записать переменную во временный файл и затем выполнить Install-WindowsFeature для этого файла. Не идеально, но это сделано.

$roleconfig = [System.IO.File]::ReadAllText("\\path\to\RoleTemplate.xml")

ForEach ($server in ([regex]::matches($servers, "abc\d+") | %{$_.value})){
   Invoke-Command -ComputerName $server -ArgumentList $roleconfig -EnableNetworkAccess -ScriptBlock {
        param($roleconfig)


        # IIS Role Setup
        [System.IO.File]::WriteAllText("C:\RoleTemplate.xml", $roleconfig)

        Install-WindowsFeature -ConfigurationFilePath C:\RoleTemplate.xml

        # Etc...
 }

}

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .