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