如何导出并导入自定义WMI命名空间?PowerShell 2.0兼容问题
解决Windows 7 PowerShell 2.0导出自定义WMI命名空间MOF的问题
在PowerShell 5.1里直接调用(GWMI -Namespace "root\CustomName" -List).GetText('mof')能正常生成MOF,但PS 2.0里Get-WmiObject -List返回的是对象数组,不是单个集合对象,所以直接调用GetText会报错。下面是具体的解决方法,包含导出、目标环境准备和导入的完整流程:
一、Windows 7(PS 2.0)下导出自定义WMI命名空间的MOF文件
我们需要遍历命名空间下的每个WMI类,逐个生成MOF片段再合并:
- 以管理员身份打开PowerShell,执行以下脚本:
# 定义目标命名空间 $targetNamespace = "root\CustomName" # 生成命名空间声明(导入时需要) $namespaceHeader = '#pragma namespace("\\\\.\\{0}")' -f $targetNamespace # 获取命名空间下所有WMI类 $wmiClasses = Get-WmiObject -Namespace $targetNamespace -List # 初始化MOF内容数组,先加入命名空间声明 $mofContent = @($namespaceHeader) # 遍历每个类,生成对应的MOF代码 foreach ($class in $wmiClasses) { $mofContent += $class.GetText('mof') } # 将内容写入MOF文件(可自行修改路径) $mofContent | Out-File -FilePath "C:\Temp\CustomWMI_Export.mof" -Encoding UTF8
- 执行完成后,你会在指定路径得到完整的MOF文件,包含命名空间声明和所有类的结构。
替代方案:使用wbemtest图形工具导出
如果不习惯命令行,也可以用系统自带的wbemtest.exe:
- 按下Win+R,输入
wbemtest.exe回车打开工具 - 点击「连接」,输入命名空间
root\CustomName,点击「连接」 - 点击「枚举类」,选择「递归」选项,点击「确定」
- 在弹出的类列表中,按Ctrl+A选中所有类,右键选择「导出」,保存为MOF文件即可
二、目标计算机环境准备(创建自定义命名空间)
如果目标计算机还没有ROOT\CustomName命名空间,需要先创建:
- 创建一个名为
Create_CustomNamespace.mof的文件,内容如下:
#pragma namespace("\\\\.\\ROOT") instance of __Namespace { Name = "CustomName"; };
- 以管理员身份打开命令提示符/PowerShell,执行:
& mofcomp.exe "C:\Temp\Create_CustomNamespace.mof"
执行成功后,目标计算机就会创建好ROOT\CustomName命名空间。
三、导入MOF文件到目标计算机
不管是Windows 7还是Windows 10,都可以用mofcomp.exe完成导入:
- 将导出的
CustomWMI_Export.mof复制到目标计算机 - 以管理员身份打开命令提示符/PowerShell,执行:
& mofcomp.exe "C:\Temp\CustomWMI_Export.mof"
执行完成后,自定义WMI类就会被导入到目标计算机的ROOT\CustomName命名空间中。
注意事项
- 所有操作都需要管理员权限,否则会出现权限不足的错误
- 如果导入时报错,可以检查MOF文件是否有语法问题,或者目标命名空间是否已正确创建
内容的提问来源于stack exchange,提问作者Leptonator
相关产品推荐
相关产品推荐

