如何用PowerShell创建引用其他WMI类实例属性的WMI类属性
WMI类引用属性创建修正方案
你在创建WMI类引用属性时的核心问题有两处:一是引用属性的数组标记错误,二是硬编码了目标类名导致灵活性不足。以下是修正后的实现代码及关键说明:
关键修正点
- 引用单个实例时,添加属性的第三个参数(是否为数组)需设为
$false,原代码传$true会将属性设为引用数组类型 - 替换硬编码的
Device_WarrantyElement为变量$classNameElement,确保与目标类名一致 - 可选添加
Description限定符提升属性可读性
修正后的完整代码
$Namespace = "root\cimv2\YourCustomNamespace" # 替换为你的目标命名空间 $classNameElement = "Device_WarrantyElement" $className = "YourTargetClass" # 替换为你的主类名 if (!(Get-CimInstance -Namespace $Namespace -ClassName $classNameElement)){ $managementClass = New-Object System.Management.ManagementClass($Namespace, [String]::Empty, $null) $managementClass["__CLASS"] = $classNameElement # 添加ID键属性 $managementClass.Properties.Add("ID", [System.Management.CimType]::String, $false) $managementClass.Properties["ID"].Qualifiers.Add("Key", $true) # 添加其他属性 $managementClass.Properties.Add("Name", [System.Management.CimType]::String, $false) $managementClass.Properties.Add("Description", [System.Management.CimType]::String, $false) $managementClass.Properties.Add("Type", [System.Management.CimType]::String, $false) $managementClass.Properties.Add("Start", [System.Management.CimType]::String, $false) $managementClass.Properties.Add("End", [System.Management.CimType]::String, $false) $managementClass.Put() } $managementClass = $null if (!(Get-CimInstance -Namespace $Namespace -ClassName $className)){ $managementClass = New-Object System.Management.ManagementClass($Namespace, [String]::Empty, $null) $managementClass["__CLASS"] = $className # 添加Serial键属性 $managementClass.Properties.Add("Serial", [System.Management.CimType]::String, $false) $managementClass.Properties["Serial"].Qualifiers.Add("Key", $true) # 添加Country属性 $managementClass.Properties.Add("Country", [System.Management.CimType]::String, $false) # 修正后的Warranty引用属性创建 $managementClass.Properties.Add("Warranty", [System.Management.CimType]::Reference, $false) $managementClass.Properties["Warranty"].Qualifiers.Add("CIMTYPE", "ref:$classNameElement") # 可选:添加描述限定符 $managementClass.Properties["Warranty"].Qualifiers.Add("Description", "关联$classNameElement类的保修实例") $managementClass.Put() }
验证方法
类创建完成后,可通过以下命令验证引用属性是否正确配置:
Get-CimClass -Namespace $Namespace -ClassName $className | Select-Object -ExpandProperty Properties | Where-Object Name -eq Warranty
输出结果中CimType应为Reference,Qualifiers中会包含正确的CIMTYPE值。
内容的提问来源于stack exchange,提问作者Pete Mitchell
相关产品推荐
相关产品推荐

