C#中如何创建同时包含InitialSessionState与WSManConnectionInfo的Runspace
问题
需求:创建同时包含InitialSessionState和WSManConnectionInfo的Runspace,通过PowerShell API将执行策略设为Unrestricted,实现远程PowerShell脚本执行。
已编写代码:
InitialSessionState initialSessionState = InitialSessionState.CreateDefault(); initialSessionState.ExecutionPolicy = ExecutionPolicy.Unrestricted; WSManConnectionInfo connectionInfo = new WSManConnectionInfo(); connectionInfo.ComputerName = "VMD_CLEAN_RDP"; connectionInfo.Credential = creds;
当前创建Runspace的方式:
Runspace runspace = RunspaceFactory.CreateRunspace(initialSessionState);
疑问:
- 创建该Runspace后能否添加
connectionInfo?或先通过connectionInfo创建Runspace再添加initialSessionState? - 能否在创建PowerShell对象后直接添加远程计算机地址和凭据?示例设想如下:
PowerShell ps = PowerShell.Create() { ps.AddRemoteComputer(remoteCompuuterName); ps.AddCredentials(creds) }
此前尝试结果:用connectionInfo创建Runspace可连接远程但脚本无法运行;用initialSessionState创建的Runspace能运行脚本但仅在本地执行。
解答
关于Runspace的创建限制
Runspace一旦创建完成,无法再修改其关联的WSManConnectionInfo或InitialSessionState,必须在创建Runspace时同时传入两者。
正确的创建方式是使用RunspaceFactory.CreateRunspace的重载方法,同时传入连接信息和初始会话状态:
// 保留原有初始化代码 InitialSessionState initialSessionState = InitialSessionState.CreateDefault(); initialSessionState.ExecutionPolicy = ExecutionPolicy.Unrestricted; WSManConnectionInfo connectionInfo = new WSManConnectionInfo(); connectionInfo.ComputerName = "VMD_CLEAN_RDP"; connectionInfo.Credential = creds; // 同时传入两者创建远程Runspace Runspace runspace = RunspaceFactory.CreateRunspace(connectionInfo, initialSessionState); runspace.Open();
关于PowerShell对象的远程设置
PowerShell类没有AddRemoteComputer或AddCredentials这类直接方法。要实现远程执行,正确的方式是将PowerShell对象绑定到已创建的远程Runspace:
// 绑定到远程Runspace PowerShell ps = PowerShell.Create(); ps.Runspace = runspace; // 添加要执行的脚本内容 ps.AddScript(@" # 示例远程执行脚本 Get-Process "); // 执行并获取结果 var results = ps.Invoke();
此前尝试问题的原因
- 仅用
WSManConnectionInfo创建Runspace:缺少设置执行策略的InitialSessionState,远程主机默认执行策略可能阻止脚本运行,导致执行失败。 - 仅用
InitialSessionState创建Runspace:默认创建本地Runspace,因此只会在本地执行脚本。
内容的提问来源于stack exchange,提问作者VictorMiqueles
相关产品推荐
相关产品推荐

