示例工程【免费下载链接】Windows-classic-samplesThis repo contains samples that demonstrate the API used in Windows classic desktop applications.项目地址https://gitcode.com/gh_mirrors/wi/Windows-classic-samples点击查看免费下载导读本文以 Windows-classic-samples 仓库中的 Hyper-V Integration Services 示例 为核心深入讲解如何通过 Hyper-V 集成服务的 WMI APIMsvm_GuestFileService与CopyFilesToGuest方法在宿主与虚拟机之间复制文件。示例采用 C# 编写适合具备一定 WMI 编程经验的开发者。读完本文你将掌握该示例的完整命令行用法、参数语义、源码级调用链以及如何在 Visual Studio 中构建与运行它从而在自己的管理工具中复用这套文件分发能力。示例概览集成服务与客户机文件服务Hyper-V 的集成服务Integration Services负责向虚拟机客户机Guest提供宿主导入的功能组件例如时间同步、心跳、关机以及文件复制等。示例演示的核心操作正是其中的向虚拟机复制文件底层对应 Hyper-V WMI 提供程序V2中的CopyFilesToGuest方法。整个示例是一个控制台应用工程结构与入口如下Program.cs命令行参数解析与Main入口GuestServiceInterface.cs核心业务逻辑封装了获取 WMI 对象、构造参数并调用CopyFilesToGuest的完整过程WmiUtilities.csHyper-V 示例公用的 WMI 工具类负责按名称查找虚拟机、校验方法返回值、轮询异步 Job 并输出Msvm_Error详细信息IntegrationServices.csproj项目文件目标框架为 .NET Framework 4.5程序集名为IntegrationServicesIntegrationServices.slnVisual Studio 2013 解决方案。从工程配置可见该项目引用了System.Management程序集这是通过 WMI 与 Hyper-V 交互所必需的依赖命名空间为Microsoft.Samples.HyperV.IntegrationServicesWMI 工具部分则位于Microsoft.Samples.HyperV.Common见 WmiUtilities.cs。命令行用法与参数说明官方 README 中给出的简化用法为IntegrationServices.exe CopyFileToGuest vmName但对照源码中Main方法与ShowUsage方法的实现Program.cs该示例实际的完整用法是IntegrationServices.exe CopyFileToGuest HostMachine VMName SourceFile DestinationFile [OverwriteExisting [CreateFullPath]]参数含义如下参数含义HostMachine运行 Hyper-V 的宿主机名称用于构造 WMI 管理路径\\HostMachine\root\virtualization\v2VMName目标虚拟机名称SourceFile宿主侧待复制的源文件完整路径DestinationFile虚拟机客户机内的目标文件完整路径OverwriteExisting可选是否覆盖客户机中已存在的同名文件布尔值默认falseCreateFullPath可选是否自动创建目标文件的完整路径含中间目录布尔值默认false源码给出的参考示例Program.csIntegrationServices.exe CopyFileToGuest HyperVHost WS12VM c:\temp\testfile c:\temp\testfile1 IntegrationServices.exe CopyFileToGuest HyperVHost WS12VM c:\temp\testfile c:\temp\testfile1 true IntegrationServices.exe CopyFileToGuest HyperVHost WS12VM c:\temp\testfile c:\temp\testfile1 true true关于参数解析的实现细节从 Program.cs 可以确认Main要求参数个数必须在 5 到 7 之间args.Length 5 || args.Length 7时调用ShowUsage少于 5 个或超过 7 个都会直接打印用法说明第一个参数必须是操作名CopyFileToGuest比较时忽略大小写StringComparison.OrdinalIgnoreCase当传入第 6 个参数时解析为OverwriteExisting传入第 7 个参数时解析为CreateFullPath两者均通过Convert.ToBoolean(..., CultureInfo.InvariantCulture)转换因此可接受true/false等标准布尔字符串程序整体使用try/catch包裹任何异常都会在控制台输出e.Message与e.StackTrace。源码级调用链从命令行到 WMI 方法示例的核心逻辑集中在 GuestServiceInterface.cs 的CopyFileToGuest方法GuestServiceInterface.cs整个调用过程可分为五个步骤。第一步构造 WMI 管理范围ManagementScope方法首先按宿主机名构造 WMI 命名空间路径\\HostMachine\root\virtualization\v2并创建ManagementScope。root\virtualization\v2是 Hyper-V WMI 提供程序V2的专用命名空间所有Msvm_*类如Msvm_ComputerSystem、Msvm_GuestFileService都注册在该命名空间下。第二步获取 Msvm_GuestServiceInterfaceComponentGetGuestServiceInterfaceComponentGuestServiceInterface.cs先通过WmiUtilities.GetVirtualMachine(vmName, scope)按名称查询出代表虚拟机的Msvm_ComputerSystem实例再调用GetRelated(Msvm_GuestServiceInterfaceComponent, Msvm_SystemDevice, ...)获取与该虚拟机关联的集成服务接口组件。GetVirtualMachine的实现位于 WmiUtilities.cs内部使用 WQL 查询SELECT * FROM Msvm_ComputerSystem WHERE ElementNamevmName若查询结果为空会抛出ManagementException若存在多个同名虚拟机则取第一个对象。第三步获取 Msvm_GuestFileServiceGetGuestFileServiceGuestServiceInterface.cs以接口组件为起点通过关联类Msvm_RegisteredGuestService获取对应的Msvm_GuestFileService实例。Msvm_GuestFileService就是承载文件复制方法的服务类——它代表运行在客户机中的文件服务是CopyFilesToGuest方法的宿主。第四步构造 Msvm_CopyFileToGuestSettingData 参数CreateCopyFileToGuestSettingDataGuestServiceInterface.cs在 WMI 中创建Msvm_CopyFileToGuestSettingData实例并填充四个关键属性属性对应参数说明SourcePathsourceFileNamePath宿主侧源文件路径DestinationPathdestinationFileNamePath客户机内目标路径OverwriteExistingoverwriteExisting是否覆盖已存在文件CreateFullPathcreateFullPath是否自动创建完整路径随后通过GetText(TextFormat.CimDtd20)将该设置对象序列化为 CIM/DTD 格式的文本字符串存入copyFileToGuestSettingDataText数组每次调用只复制一个文件因此数组长度为 1作为CopyFilesToGuest方法的入参。第五步调用 CopyFilesToGuest 并校验结果最后GuestServiceInterface.cs通过guestFileService.GetMethodParameters(CopyFilesToGuest)获取方法入参模板将CopyFileToGuestSettings属性赋值为上述设置文本数组再调用InvokeMethod(CopyFilesToGuest, inParams, null)发起文件复制。调用完成后WmiUtilities.ValidateOutput(outParams, scope, true, true)负责校验返回值。从 WmiUtilities.cs 的实现可以看出其判定逻辑若ReturnValue 4096表示方法启动了异步操作返回参数中的Job对象指向一个Msvm_Job。此时程序每秒轮询一次JobState直到任务进入完成、终止或异常等终态IsJobComplete再通过IsJobSuccessful判断是否成功只有Completed与CompletedWithWarnings视为成功若ReturnValue ! 0视为同步失败失败时若 Job 携带ErrorDescription则以其作为错误消息printErrorstrue时还会调用PrintMsvmErrorsWmiUtilities.cs对 Job 的GetErrorEx返回的Msvm_Error嵌入实例做 XML 解析逐条输出Error Message与Error SourcethrowIfFailedtrue时失败会抛出ManagementException最终由Main中的catch打印到控制台。构建与运行构建步骤启动 Visual Studio选择FileOpenProject/Solution进入 Samples/Hyper-V/IntegrationServices/cs 目录双击打开IntegrationServices.sln解决方案按F7或使用BuildBuild Solution编译。编译产物为IntegrationServices.exe位于bin\Debug\或bin\Release\见 IntegrationServices.csproj。运行步骤重要前提示例必须以 Hyper-V 管理员身份运行README 明确注明 This sample must be run as a Hyper-V administrator并且目标虚拟机需要启用 Hyper-V 集成服务。为项目设置调试命令行参数完整用法为IntegrationServices.exe CopyFileToGuest HostMachine VMName SourceFile DestinationFile [OverwriteExisting [CreateFullPath]]在 Visual Studio 中按F5DebugStart Debugging调试运行或按CtrlF5DebugStart Without Debugging直接运行若操作失败控制台窗口会显示错误信息——包括异常消息、堆栈跟踪以及Msvm_Error的详细错误来源。运行环境要求根据 README 的说明客户端操作系统Windows 8.1服务器操作系统Windows Server 2012 R2开发环境Visual Studio 2013目标框架 .NET Framework 4.5可在更新版本的 Visual Studio 中不加修改地直接构建运行知识基础需要一定的 WMI 编程经验。扩展思考把该能力集成到自己的管理工具这个示例虽然只演示了单文件复制但其代码组织方式可以直接复用到更复杂的场景批量文件分发CopyFileToGuest的入参CopyFileToGuestSettings是一个数组结合CreateCopyFileToGuestSettingData的构造方式可以循环生成多条设置并一次性提交实现多文件批量复制跨宿主机管理HostMachine参数决定了ManagementScope的目标将其留空或指向远程宿主机即可将同一套代码用于本机或远程管理异步任务状态跟踪ValidateOutput中基于Msvm_Job的轮询与GetErrorEx错误解析逻辑是 Hyper-V WMI 异步方法调用后的标准处理范式适用于其他返回 Job 的Msvm_*服务方法前提约束复制前需确认目标虚拟机已安装并启用 Hyper-V 集成服务组件Msvm_GuestServiceInterfaceComponent存在且与Msvm_GuestFileService正确关联否则GetRelated返回空集合时会抛出异常。如果你需要深入了解 Hyper-V WMI 提供程序V2的更多类与方法README 中提供了Hyper-V integration services API与Hyper-V WMI provider (V2)两个相关主题的链接可与本示例的源码相互印证学习。仓库中 Hyper-V 目录 下还有 AppHealth、DynamicMemory、Generation2VM 等 C# 示例它们共享WmiUtilities一类的工具代码可作为进一步研究 Hyper-V WMI 编程的配套资料。赞分享示例工程【免费下载链接】Windows-classic-samplesThis repo contains samples that demonstrate the API used in Windows classic desktop applications.项目地址https://gitcode.com/gh_mirrors/wi/Windows-classic-samples点击查看免费下载相关推荐Windows-classic-samples 之 Hyper-V 虚拟光纤通道FibreChannelWMI 示例实战解析Windows classic samples 之 Hyper V 虚拟光纤通道FibreChannelWMI 示例实战解析 本指南围绕 Windows c示例工程Hyper-V 增强会话模式管理实战Windows-classic-samples 中的 EnhancedSession WMI 示例深度解析Hyper V 增强会话模式管理实战Windows classic samples 中的 EnhancedSession WMI 示例深度解析 本指南围绕 S示例工程使用 Hyper-V WMI 管理第二代虚拟机Generation2VM 示例深度解析使用 Hyper V WMI 管理第二代虚拟机Generation2VM 示例深度解析 第二代虚拟机Generation 2 VM基于 UEFI 固件支示例工程上一篇Tigard开源社区贡献指南如何参与项目开发与功能扩展下一篇7步打造高效Go物联网系统基于build-web-application-with-golang的MQTT实战指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考