- 示例工程
【免费下载链接】Windows-classic-samples
This repo contains samples that demonstrate the API used in Windows classic desktop applications.
导读
本篇文章围绕 Windows-classic-samples 仓库中的 RemoteRunspace01 示例,系统讲解如何在桌面应用中通过WSManConnectionInfo类构造远程 Runspace、配置OperationTimeout与OpenTimeout两类超时、建立并关闭远程连接。读完本文,你将掌握 PowerShell 托管 SDK(System.Management.Automation)中远程运行空间(Remote Runspace)的完整生命周期管理,以及如何结合源码与工程配置在 Visual Studio 中构建、运行该示例。
示例背景:为什么需要 Remote Runspace
在 Windows 经典桌面应用中,若要跨进程执行 PowerShell 命令,通常使用Runspace(运行空间)承载命令执行上下文。当目标命令需要在另一台计算机(或本机通过 WinRM 建立的远程会话)上执行时,就需要创建远程 Runspace。它与本地 Runspace 的关键区别在于:远程 Runspace 依赖一条 WSMan/WinRM 连接通道,连接的建立、数据的发送与接收都受超时控制,超时设置不当会导致应用长时间挂起或过早失败。
RemoteRunspace01 正是演示这条完整链路的最小可运行示例:构造连接信息 → 设置超时 → 建立连接 → 关闭连接。
示例目录结构与目标
仓库中该示例位于 Samples/PowerShell/Remoting/RemoteRunspace01,包含:
| 文件 | 作用 |
|---|---|
| README.md | 示例说明文档(构建与运行指南) |
| RemoteRunspace01.cs | 核心 C# 源码(Main 入口与全部逻辑) |
| RemoteRunspace01.csproj | MSBuild 工程文件(目标框架与程序集引用) |
| RemoteRunspace01.sln | Visual Studio 解决方案文件 |
| Readme.txt | 与 README 对应的纯文本说明 |
README 声明的示例目标(Sample Objectives)可归纳为四个步骤:
- 创建WSManConnectionInfo类实例;
- 通过该实例设置
OperationTimeout与OpenTimeout; - 使用该实例建立远程连接;
- 关闭远程连接。
核心 API:WSManConnectionInfo 与 Runspace
示例依赖两个核心类型,均位于System.Management.Automation.Runspaces命名空间:
- WSManConnectionInfo:封装一条基于 WSMan/WinRM 协议的远程连接信息。其默认构造函数会生成指向本机(localhost)的连接;也可以通过构造函数或属性指定远程计算机、认证方式、端口、会话配置等参数。
- Runspace:执行 PowerShell 命令的运行空间。通过
RunspaceFactory.CreateRunspace(connectionInfo)传入连接信息,即可创建与远程端点绑定的远程 Runspace。
源码开头即显式引入这两个命名空间(见 RemoteRunspace01.cs):
using System.Management.Automation; // Windows PowerShell namespace. using System.Management.Automation.Runspaces; // Windows PowerShell namespace.源码逐步解析:远程连接的完整生命周期
以下代码来自 RemoteRunspace01.cs,是示例的全部逻辑。我们按步骤拆解。
第 1 步:构造 WSManConnectionInfo
// Create a WSManConnactionInfo object using the default constructor // to connect to the "localHost". The WSManConnectionInfo object can // also specify connections to remote computers. WSManConnectionInfo connectionInfo = new WSManConnectionInfo();使用默认构造函数创建连接信息,此时目标为本机(localhost)。源码注释明确说明:该对象同样可以配置到远程计算机的连接——当需要连到其他主机时,可通过带主机名参数的构造重载或相关属性指定目标地址。这是后续所有超时与连接操作的信息载体。
第 2 步:设置 OperationTimeout(操作超时)
// Set the OpertationTimeout property. The OperationTimeout is used to tell // Windows PowerShell how long to wait (in milliseconds) before timing out // for any operation. This includes sending input data to the remote computer, // receiving output data from the remote computer, and more. The user can // change this timeout depending on whether the connection is to a computer // in the data center or across a slow WAN. connectionInfo.OperationTimeout = 4 * 60 * 1000; // 4 minutes.OperationTimeout的单位是毫秒,示例设置为4 * 60 * 1000 = 240000,即4 分钟。它控制远程会话中任意一次操作的最长等待时间,包括:
- 向远程计算机发送输入数据;
- 从远程计算机接收输出数据;
- 其他一切在已建立会话上的数据交互。
从源码设计意图看,该值应按网络状况调整:数据中心内网可适当调小以快速失败;跨慢速 WAN 链路则应调大,避免把正常的网络延迟误判为故障。
第 3 步:设置 OpenTimeout(连接建立超时)
// Set the OpenTimeout property. OpenTimeout is used to tell Windows PowerShell // how long to wait (in milliseconds) before timing out while establishing a // remote connection. The user can change this timeout depending on whether the // connection is to a computer in the data center or across a slow WAN. connectionInfo.OpenTimeout = 1 * 60 * 1000; // 1 minute.OpenTimeout同样以毫秒为单位,示例设置为1 * 60 * 1000 = 60000,即1 分钟。它专用于建立远程连接这一阶段:在调用Open()时,等待连接建立完成的最长时间。与OperationTimeout一样,注释建议根据目标机位于数据中心内网还是慢速 WAN 调整取值。
两个超时的分工:
OpenTimeout只管“连得上”,OperationTimeout管“连上之后的每一次收发”。示例将前者设为 1 分钟、后者设为 4 分钟,体现了“建立连接应快速失败、已建会话应容忍较长操作”的常见取舍。
第 4 步:用连接信息创建远程 Runspace
// Create a remote runspace using the connection information. using (Runspace remoteRunspace = RunspaceFactory.CreateRunspace(connectionInfo))通过RunspaceFactory.CreateRunspace(connectionInfo)把上一步配置好的连接信息绑定到新创建的 Runspace 对象上。采用using语句块包裹,保证资源在块结束时被释放。
第 5 步:Open() 建立远程连接
// Establish the connection by calling the Open() method to open the runspace. // The OpenTimeout value set previously will be applied while establishing // the connection. Establishing a remote connection involves sending and // receiving some data, so the OperationTimeout will also play a role in this process. remoteRunspace.Open();调用Open()触发真正的连接建立。源码注释点明两个关键细节:
- 建立连接过程受
OpenTimeout约束; - 由于握手本身也涉及数据收发,
OperationTimeout在该阶段同样起作用。
源码在此处留有明确扩展点(见 RemoteRunspace01.cs):注释指出可在 Open 之后加入“在远程 Runspace 中运行命令”的代码,而这些命令运行同样受OperationTimeout约束,因为运行命令必然涉及数据收发。
第 6 步:Close() 关闭远程连接
// Close the connection by calling the Close() method to close the remote // runspace. The Dispose() method (called by using primitive) will call // the Close() method if it is not already called. remoteRunspace.Close();显式调用Close()关闭远程连接。源码注释进一步说明:using块退出时调用的Dispose()会兜底调用Close()——即使忘记显式关闭,资源也不会泄漏。
超时参数速查:取值、单位与适用阶段
| 参数 | 示例取值 | 单位 | 适用阶段 | 影响范围 |
|---|---|---|---|---|
OperationTimeout | 4 * 60 * 1000(4 分钟) | 毫秒 | 连接建立后的一切操作 | 发送输入数据、接收输出数据、运行命令等 |
OpenTimeout | 1 * 60 * 1000(1 分钟) | 毫秒 | 连接建立阶段(Open()) | 从发起连接到握手完成 |
两个参数的可调性在源码注释中被反复强调:无论目标是数据中心内网还是慢速 WAN,都应据此调整取值。示例采用的 4 分钟/1 分钟组合是文档推荐的合理起点,实际生产环境可结合目标机的响应速度与网络带宽继续调优。
工程配置解读:目标框架与程序集引用
从 RemoteRunspace01.csproj 可以看到构建该示例的关键配置:
- 输出类型:
Exe(控制台可执行程序),程序集名RemoteRunspace01; - 目标框架:
v4.0(.NET Framework 4.0); - 平台:Debug/Release 双配置,输出目录分别为
bin\Debug\与bin\Release\(与 README 中“可执行文件构建在默认 \bin 或 \bin\Debug 目录”的描述一致); - 关键引用:
System.Management.Automation(版本3.0.0.0,PublicKeyToken31bf3856ad364e35),这是 PowerShell 托管 API 的正式程序集,HintPath 指向 GAC_MSIL 目录(见 RemoteRunspace01.csproj)。
RemoteRunspace01.sln 为标准 Visual Studio 2012 格式解决方案,包含单一项目RemoteRunspace01,支持 Debug/Release 两种配置的编译。
构建示例(Visual Studio)
README 提供的构建步骤(见 README.md)如下:
- 启动 Microsoft Visual Studio,选择File(文件)> Open(打开)> Project/Solution(项目/解决方案);
- 进入示例所在目录
Samples/PowerShell/Remoting/RemoteRunspace01,双击 Visual Studio 解决方案文件(.sln); - 按F7或使用Build > Build Solution构建示例;
- 生成的可执行文件位于默认的
\bin或\bin\Debug目录。
运行前提:启用 Windows PowerShell 远程处理
由于示例依赖 WSMan/WinRM 远程通道,运行前必须先确认目标机的 PowerShell 远程处理(Remoting)已启用。README 给出了明确的检查方式:在 PowerShell 中执行帮助命令
help about_remote该帮助主题会说明如何启用远程处理功能。运行步骤(见 README.md):
- 确认 Windows PowerShell 远程处理已启用(参考上文
help about_remote); - 以管理员身份启动命令提示符(Command Prompt);
- 切换到包含示例可执行文件的目录;
- 运行可执行文件;
- 观察输出结果并与源码一一对应。
需要说明的是,README 标注的运行环境为 Windows 8.1(客户端)/ Windows Server 2012 R2(服务器端),这是官方文档声明的最低验证环境;在现代 Windows 版本上,只要 PowerShell 远程处理可用,示例的核心逻辑同样适用。
延伸阅读:同目录下的兄弟示例
RemoteRunspace01 所在的 Samples/PowerShell/Remoting 目录还收录了另外两个进阶示例,可帮助你在掌握基础连接后继续深入:
- RemoteRunspacePool01:演示如何构造远程 Runspace 池(
RunspaceFactory.CreateRunspacePool(1, 2, connectionInfo)),并借助BeginInvoke()/EndInvoke()并发运行Get-Process与Get-Service两个命令,适合理解“单连接多并发”场景(见 RemoteRunspacePool01.cs); - RemotingDisconnectConnect01:演示远程会话的断开与重连——长时脚本在服务端继续运行期间,客户端可
Disconnect()后重建/重连对象以取回状态与输出,适合理解“断线不中断任务”的场景(见 RemotingDisconnectConnect01.cs)。
三者共用WSManConnectionInfo这一连接信息基座,阅读顺序建议为:RemoteRunspace01(单连接基础)→ RemoteRunspacePool01(并发池)→ RemotingDisconnectConnect01(断连重连)。
小结
RemoteRunspace01 用不到七十行代码,清晰展示了 PowerShell 托管 SDK 中远程 Runspace 的四步生命周期:创建WSManConnectionInfo、设置两类超时、CreateRunspace后Open()建立连接、Close()/Dispose()收尾释放。其中OperationTimeout(示例 4 分钟)与OpenTimeout(示例 1 分钟)的取舍,是保证远程命令在数据中心内网与慢速 WAN 两类网络环境下都可靠执行的关键实践。配合 工程源码、构建配置 与 同目录进阶示例,你可以在此基础上直接扩展出“远程执行命令并读取结果”的完整桌面应用逻辑。
- 示例工程
【免费下载链接】Windows-classic-samples
This repo contains samples that demonstrate the API used in Windows classic desktop applications.
相关推荐
如何快速上手DeBERTa-v3-base-zeroshot-v2.0:5分钟实现零样本分类
如何快速上手DeBERTa v3 base zeroshot v2.0:5分钟实现零样本分类 DeBERTa v3 base zeroshot v2.0是一款基
告别Android设备连接烦恼:UniversalAdbDriver终极解决方案
告别Android设备连接烦恼:UniversalAdbDriver终极解决方案 还在为Windows系统无法识别Android设备而苦恼吗?Universal
驱动开发ObjectGraph-Xcode常见问题解决:Graphviz安装失败、插件不显示等8大难题
ObjectGraph Xcode常见问题解决:Graphviz安装失败、插件不显示等8大难题 ObjectGraph Xcode是一款能展示项目中类之间依赖关
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考