通过Runspace远程执行New-Item创建虚拟目录时参数异常问题
问题原因
你遇到的差异核心在于远程Runspace会话默认没有加载IIS相关的PowerShell扩展模块。
本地执行New-Item创建IIS虚拟目录时,实际上是WebAdministration模块对New-Item命令做了扩展——针对IIS:\驱动器添加了physicalPath这类IIS专属参数。但远程Runspace默认是一个“干净”的会话,不会自动加载这个模块,此时你调用的是原生的New-Item(来自Microsoft.PowerShell.Management模块),而原生命令确实没有physicalPath参数,所以会触发找不到参数的报错。
解决方案
要解决这个问题,关键是确保远程Runspace会话在执行New-Item前,先加载WebAdministration模块。这里有两种可行的实现方式:
1. 在执行创建命令前手动加载模块
在远程Runspace中,先执行Import-Module WebAdministration,再运行你的New-Item命令。比如在VB.Net中,你可以把这两个命令放在同一个Pipeline里:
Dim command As New Command("Import-Module") command.Parameters.Add("Name", "WebAdministration") Dim newItemCmd As New Command("New-Item") newItemCmd.Parameters.Add("Path", "IIS:\Sites\ExternalInventory FTP\TestVT") newItemCmd.Parameters.Add("Type", "VirtualDirectory") newItemCmd.Parameters.Add("physicalPath", "C:\") Dim pipeline As Pipeline = runspace.CreatePipeline() pipeline.Commands.Add(command) pipeline.Commands.Add(newItemCmd) Dim results As Collection(Of PSObject) = pipeline.Invoke()
2. 配置Runspace初始化脚本自动加载模块
如果你需要每次远程连接都自动加载WebAdministration模块,可以在创建WSManConnectionInfo时指定初始化脚本,这样会话启动时就会自动加载模块:
Dim credential As PSCredential = ... ' 你的远程服务器凭据 Dim connectionUri As New Uri("http://your-server:5985/wsman") Dim connectionInfo As New WSManConnectionInfo(connectionUri, "http://schemas.microsoft.com/powershell/Microsoft.PowerShell", credential) ' 添加初始化脚本,自动加载WebAdministration模块 connectionInfo.InitializationScript = ScriptBlock.Create("Import-Module WebAdministration") ' 创建并打开Runspace Dim runspace As Runspace = RunspaceFactory.CreateRunspace(connectionInfo) runspace.Open() ' 之后直接执行New-Item命令即可 Dim newItemCmd As New Command("New-Item") newItemCmd.Parameters.Add("Path", "IIS:\Sites\ExternalInventory FTP\TestVT") newItemCmd.Parameters.Add("Type", "VirtualDirectory") newItemCmd.Parameters.Add("physicalPath", "C:\") Dim pipeline As Pipeline = runspace.CreatePipeline() pipeline.Commands.Add(newItemCmd) Dim results As Collection(Of PSObject) = pipeline.Invoke()
额外验证
如果执行后还是有问题,可以先在远程Runspace中执行Get-Module WebAdministration,确认模块是否成功加载。如果返回空,说明模块加载失败,可能需要检查远程服务器是否安装了IIS管理工具或者WebAdministration模块是否存在。
内容的提问来源于stack exchange,提问作者Tristan

