在PowerShell中通过WQL从SCCM多表返回指定属性的问题
使用PowerShell执行SCCM WQL查询获取匹配机箱类型的计算机信息
我帮你调整了PowerShell脚本,确保它和SCCM控制台的查询逻辑完全一致,能准确返回你需要的计算机名称和机箱类型数据。下面是完整的可运行脚本,以及关键细节的说明:
完整脚本
# 配置SCCM服务器和站点代码 $sccmServer = "sccmserver" $siteCode = "sitecode" # 替换成你的实际站点代码,比如"XYZ" $namespace = "root\sms\site_$siteCode" # 定义需要筛选的机箱类型集合(可根据需求增删,对应SCCM的机箱类型枚举值) $targetChassisTypes = @("1","2","3","4","6","7","9","10","14","15","16","17","18","21") # 构建WQL查询,这里用双引号Here-String解析变量,自动生成IN子句的格式 $query = @" SELECT SMS_G_System_COMPUTER_SYSTEM.Name, SMS_G_System_SYSTEM_ENCLOSURE.ChassisTypes FROM SMS_R_System INNER JOIN SMS_G_System_COMPUTER_SYSTEM ON SMS_G_System_COMPUTER_SYSTEM.ResourceID = SMS_R_System.ResourceId INNER JOIN SMS_G_System_SYSTEM_ENCLOSURE ON SMS_G_System_SYSTEM_ENCLOSURE.ResourceId = SMS_R_System.ResourceId WHERE SMS_G_System_SYSTEM_ENCLOSURE.ChassisTypes IN ($($targetChassisTypes -join "','")) "@ # 执行查询(推荐用Get-CimInstance,兼容性更好) try { $results = Get-CimInstance -ComputerName $sccmServer -Namespace $namespace -Query $query -ErrorAction Stop # 格式化输出,和SCCM控制台的列名、展示风格对齐 $results | Select-Object ` @{Name="计算机名称"; Expression={$_.Name}}, ` @{Name="机箱类型"; Expression={$_.ChassisTypes}} ` | Format-Table -AutoSize } catch { Write-Error "查询执行失败: $_" }
关键细节说明
- 机箱类型集合管理:用数组
$targetChassisTypes统一维护需要筛选的类型,后续要调整只需修改这个数组,无需手动拼接WQL字符串,避免出错。通过$targetChassisTypes -join "','"自动把数组转成WQL的IN子句需要的格式(比如'1','2','3')。 - 查询逻辑对齐:完全复用了你在SCCM控制台使用的表关联逻辑——通过
SMS_R_System(基础资源表)关联SMS_G_System_COMPUTER_SYSTEM(计算机名称信息)和SMS_G_System_SYSTEM_ENCLOSURE(机箱类型信息),确保返回结果和控制台一致。 - 兼容性优化:使用
Get-CimInstance替代旧的Get-WmiObject,它支持PowerShell 5.1及以上版本,在现代系统上更稳定,也支持更多的错误处理机制。 - 输出格式化:通过
Select-Object重命名列名,并用Format-Table -AutoSize让输出更整齐,和SCCM控制台的展示效果匹配。
你只需要把脚本里的sccmserver和sitecode替换成你的实际SCCM服务器名称和站点代码,再根据需求调整$targetChassisTypes里的枚举值,就能直接运行得到想要的结果了。
内容的提问来源于stack exchange,提问作者maliciousbloke
相关产品推荐
相关产品推荐

