在Windows Server 2012发布后,首先再来看看Windows PowerShell 3.0中提供的新命令。这篇博文的目的是为了呼应Window PowerShell 产博客:Introduction to CIM Cmdlets。当然这里并不会全部翻译这篇博客,主要将结合我自己的理解做一些补充。
首先是一些名词之间的关系,大家已经从标题中看到了,今天将会涉及到的cmdlets是名词部分包含CIM的cmdlets。那么什么是CIM呢?CIM是由分布式管理任务组(DMTF)所制定的一个标准,用来描述受管理的诸如存储,网络或者软件组件的结构及行为。大家已经熟悉的WMI就是CIM在Windows中的实现。作为一款为云而优化的系统,Windows Server 2012中使用了防火墙友好型的WinRM协议(WS-Man协议的Windows实现),从而解决了之前由于使用DCOM而带来的诸多问题,同时也为支持WS-Man协议的异构系统实现了统一管理的可能。
接下来我们来看下名词部分包含CIM的cmdlets共有多少,获得这个列表的命令很简单,Get-Command -Noun CIM* 。
大家需要注意,名词包含CIM的cmdlets可以作为名词部分包含WMI的cmdlets的替代。因此还请大家从Windows Server 2012开始逐渐学会使用这些基础cmdlets,这些cmdlets将会为你打开Windows Server 2012的管理之门。
今天的这篇介绍主要集中在名词是CimSession的cmdlets。从之前的截图中大家已经看到了,一共是三项命令,New-CimSession,Get-CimSession和Remove-CimSession。
那么首先需要回答的问题是New-CimSession存在的意义,原来我们只需要直接使用Get-WMIObject即可,但为什么在Windows Server 2012中新增这个命令?最主要的理由是为了支持标准化,其次为了优化和远程计算机之间所产生的数据流量。为什么这么说,看过我之前博客的朋友可能依稀记得我曾说过每对远程计算机执行一次Get-WMIObject,都会打开和关闭一次网络会话,如果针对同一台服务器要查询多个类中的信息,那么带来的网络开销是非常可观的。而New-CIMSession的作用就是首先和远程服务器之间建立起一个会话通道,然后所有后续命令都通过这个通道来获得相应的数据。使用起来就是将New-CIMSession建立起来的会话保存到变量中,然后再在其它cmdlet中通过使用CIMSession参数来使用这个会话。
再举个形象点的例子,大家都喝过软包装饮料,建立CIMSession的作用就是将吸管插入,然后按需饮用,喝完之后将吸管拔出。而以前的做法就是喝一口就将吸管拔出,再喝的时候再次插入吸管,没人会这么做的吧?那么同样的,在Windows PowerShell V3之前ITPro可能没什么办法,在Windows PowerShell V3之后,还请大家养成建立CIMSession的习惯。
先来看看有多少cmdlet支持CIMSession参数:
可以看到有接近一半的cmdlet都支持CIMSession参数,这里我是通过安装RAST,然后导入所有可用模块来查找命令数量的,当然这个数量并不是非常精确的。接下来就是具体命令的比较,命令如下:
#1..10 | %{Get-WmiObject -ComputerName CNSHUTILSVR01 -Class Win32_Bios}
#1..10 | %{Get-CimInstance -ComputerName CNSHUTILSVR01 -Class Win32_Bios}
#$cimSession = New-CimSession -ComputerName cnshutilsvr01
#1..10 | %{Get-CimInstance -CimSession $cimSession -Class Win32_Bios}
#Remove-CimSession $cimSession
个中差异各位可以通过打开TCPView来进行比较:
名词部分是CIMSession的cmdlets都是比较容易使用的,这得益于PowerShell的统一和连贯的设计,相信大家使用下就能上手了,下次将介绍其它的和CIM有关的cmdlets,敬请期待。