使用 Hyper-V Integration Services WMI API 向虚拟机复制文件:Windows-classic-samples 实战解析
示例工程【免费下载链接】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),仅供参考

相关新闻

Pytest 测试框架实战:从 fixture 到参数化,打造优雅自动化测试工程

Pytest 测试框架实战:从 fixture 到参数化,打造优雅自动化测试工程

你有没有经历过这种时刻:写了好久业务代码,终于调通了,心里美滋滋,但转头一想到改完这模块可能把以前的功能搞坏,就又有点心虚。想写点测试吧,一看现有代码里那堆几十行重复的 setUp、tearDown,…

2026/10/15 6:24:44 阅读更多 →
考虑储能与新能源误差的售电公司购售电策略优化

考虑储能与新能源误差的售电公司购售电策略优化

1. 题目拆解:这个策略到底在解决售电公司的什么痛点拿到这个题目,先别急着看代码。我们需要把“考虑储能和可再生能源误差的售电公司购售电策略”这句话拆开,看清楚它到底在解决一个什么样的现实问题。售电公司这个角色,是电力市场…

2026/10/15 6:24:44 阅读更多 →
TCL脚本编程入门:解释器、字符串处理与实战避坑指南

TCL脚本编程入门:解释器、字符串处理与实战避坑指南

简介:这份中文版TCL教程PDF,定位为脚本语言入门与进阶的中文参考手册,面向自动化运维、嵌入式开发及需要编写脚本工具的技术人员。内容覆盖TCL核心语法、置换、变量、表达式、List、控制流、过程、字符串操作、文件访问、错误与异常&#xff…

2026/10/15 6:24:44 阅读更多 →

最新新闻

C++多态原理:编译时与运行时多态及虚函数机制详解

C++多态原理:编译时与运行时多态及虚函数机制详解

1. 从形状计算看多态的本质:为什么我们需要它前两天整理 C 多态笔记时,我想起了自己在某个图形项目里写过的一段“黑历史”:刚开始接触面向对象时,我以为多态就是“给函数加个 virtual”,结果写出来的形状面积计算全是…

2026/10/15 7:01:52 阅读更多 →
express校园通全栈项目:从需求拆解到部署上线

express校园通全栈项目:从需求拆解到部署上线

做校园类项目的人不少,但能把“校园生活助手”做到真正能上线、能过答辩、能作为后面求职作品展示的,往往不是功能堆得最多的那个,而是把后端接口、前端交互、部署运维这条链路都理清楚的那个。express“校园通”校园生活助手APP这个题目&…

2026/10/15 7:01:52 阅读更多 →
TensorFlow实战指南:从核心设计到生产部署的完整解析

TensorFlow实战指南:从核心设计到生产部署的完整解析

1. 从一个“老古董”框架说起:为什么今天还要聊TensorFlow前几天有个刚入行的朋友问我,现在新项目到底该选TensorFlow还是PyTorch。这问题要是放在五年前,答案可能一边倒;但放到今天,情况变得微妙起来。我自己从2016年…

2026/10/15 7:01:52 阅读更多 →
第2章:Linux 基础,clear 命令

第2章:Linux 基础,clear 命令

专栏导航 上一篇:第2章:Linux 基础,whoami 命令 回到目录 下一篇:无 本节前言 对于本节所讲解的知识,有可能,你会需要时不时地参考本专栏的其它文章。真的遇到了需要参考之前的文章的知识点&#xff0c…

2026/10/15 7:01:52 阅读更多 →
RocketMQ消费组内Tag不一致的坑:消息丢失与进度跳跃的底层原理

RocketMQ消费组内Tag不一致的坑:消息丢失与进度跳跃的底层原理

1. 先复盘:同一个消费组设不同Tag的迷惑现场1.1 你会遇到的那些"奇怪现象"做消息中间件的时间久了,碰到"同一个消费组设置不同tag出现奇怪现象"这类问题频率其实很高。前前后后我至少见过五种典型表现:同一个消费组里&am…

2026/10/15 7:01:52 阅读更多 →
医疗健康大数据平台实战:从数据治理到智能应用

医疗健康大数据平台实战:从数据治理到智能应用

做了几年“基于大数据的医疗健康智能管理”方向的东西,最大的感触是:这个领域最难的从来不是算法,而是把数据从各个角落里捞出来、洗干净、排整齐。跟很多同行聊下来,大家都遇到过类似的尴尬——领导看完大屏演示,问了…

2026/10/15 7:00:51 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →