项目中有个需求,要通过PowerShell获取Server上某个服务的描述
Get-Service方法居然不返回该属性,夭寿
那获取系统更详细的信息,自然也有对应的命令
Get-WmiObject win32_service | ?{$_.Name -eq 'YOURSERVICENAME'} | select Description
Get-CimInstance win32_service | ?{$_.Name -eq 'YOURSERVICENAME'} | select Description
这两个命令看上去差异很小,我该使用哪个呢?
我们需要了解下WMI和CIM的相关知识
Common Information Model (CIM) 是开源的标准,提供systems, networks, applications and services管理信息的定义,由 Distributed Management Task Force (DMTF)开发和维护。
Windows Management Interface (WMI) 是微软针对windows平台,对CIM的一种实现。但是微软进加入了DCOM和RPC。WMI cmdlets使用DCOM访问远程机器,但DCOM这玩意属于“防火墙不友好”,就是要使用很多端口,你得配置好多防火墙规则,远程机器必须允许135, 445, 1024-1034端口,不方便不说还不安全。
微软在2012年发布了Windows Remote Management(WinRM),使用Web Services for Management protocol (WS-Man协议),这个WSMan协议使用5985端口(HTTP)和5986端口(HTTPS),防火墙非常友好。对应的新的cmdlets也在PowerShell 3.0 中加入。
整体关系如下:
毫无疑问,应该使用Get-CIMInstance
https://blog.ipswitch.com/get-ciminstance-vs-get-wmiobject-whats-the-difference
https://devblogs.microsoft.com/scripting/should-i-use-cim-or-wmi-with-windows-powershell/
https://techspi.azurewebsites.net/2019/03/24/wmi-vs-cim/