UNC 路径中的 Install-WindowsFeature -ConfigurationFilePath 被拒绝

UNC 路径中的 Install-WindowsFeature -ConfigurationFilePath 被拒绝

我这里有一个角色模板(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

经过一些额外的调查后,我决定采用一种解决方法。

解决方法是将角色配置 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...
 }

}

相关内容