我们大多数人都处理过终于留在其计划的终身日期或者是预算和官僚机构的终身日期的硬件,甚至没有进入服务,直到它进入它的寿命。
在规划和优先顺序进行服务器 - 硬件升级中的步骤是库存和评估您现有的硬件,这可能看起来像IT实习的适当工作,这也是PowerShell的完美作业。
用PowerShell阅读系统遥测
在本次讨论中主要powershell cmdlet是Get-WmiObject。大多数服务器管理员将至少熟悉Windows管理界面(WMI),这是一组遥测要点,以帮助监控性能和服务器健康以及其他事情。WMI经常用于将组策略对象的应用程序过滤到仅符合特定标准集的计算机。WMI是微软的普通信息模型(CIM)的实施,这是一个行业标准。这Get-WmiObjectcmdlet能够访问WMI和CIM类。
PowerShell还提供了Get-Ciminstance.cmdlet,它在功能上类似于Get-WmiObject但有几个关键的区别。具体地说,Get-WmiObject使用分布式组件对象模型(DCOM)与远程计算机通信,而Get-Ciminstance.使用PowerShell Remoting / Windows远程管理(WinRM)。协议方面存在一些技术差异,但关键功能差异是WinRM需要提前在远程计算机上设置一些设置。
频繁,使用WMI的最困难的部分正在找到使用的正确课程。跑步Get-WmiObject使用-List参数将返回上千个类供选择,但要将其限制在25个以下,你可以使用:
get-wmiobject -list |其中 - 对象名称 - 键*处理器*。
一个不错的好处Get-WmiObject是-Computername参数接受多个主机名,这意味着您可以轻松地从系统列表中提取信息,从而非常努力。这可能是一个硬编码的主机名列表,从文本文件中提取的选择,或从Active Directory拉出的计算机名单列表。
获取服务器CPU详细信息
CIM_Processor类可以提供与cpu相关的信息,但与许多其他PowerShell cmdlet一样,Get-WmiObject默认情况下并不超级。执行命令
Get-WmiObject CIM_Processor
返回仅仅6个细节,就像这个屏幕截图(单击展开):
幸运地从cmdlet收集更多信息,通过利用来实现琐碎选择对象cmdlet。
这get-wmiobject cim_processor |选择 - 对象*命令采用输出Get-WmiObject,即使是那些未自动显示的字段,也返回整个集合。对于实际使用,这可能更多的信息比真正有用,因此使用这作为一个起点和缩放的东西回到您真正关心的特定字段。
有一些通用的关键处理器性能指标(时钟速度、内核或线程数、缓存细节),与CPU制造商、家族甚至架构无关。WMI允许访问这些值中的每一个,这使得它们可以通过编程来访问Get-WmiObject。此外,服务器通常具有多个CPU,这使得套接字识别 - 主板上CPU的物理位置 - 一个关键信息。
以下是命令看起来列出服务器CPU的特定详细信息:
Get-WmiObject CIM_Processor |选择对象PSComputerName, Name, DeviceID, socketdesignt, ProcessorType, MaxClockSpeed, NumberOfCores, ThreadCount, L2CacheSize, VirtualizationFirmwareEnabled
详细的系统内存
读取系统存储器细节的步骤类似于读取处理器信息的步骤,尽管存储器更有可能具有多个硬件组件。甚至具有单个CPU的入门级服务器可能有几个内存模块。当提取单个服务器的详细信息时,这不一定是至关重要的,但是在执行批量库存时可能变得重要,并且您希望以特定方式存储或显示的信息。例如,如果您的意图是可以分析电子表格,您是否希望显示每个内存模块的详细信息,或整个系统内存的摘要数据?
如果您使用上面的技术并以名为“Memory”提取WMI类列表,您将看到几种可能的候选人,但CIM_PhysicalMemory是暂时的最佳选择。您可能有兴趣查看CIM_MEMORY和CIM_ASSOCEDPROCESSOMEMEMORY,因为这两者都进入处理器缓存内存。就最初提取的系统内存详细信息而言,让我们前进,假设您已经使用类似于以下命令的内容从CIM_PhysicalMemory类中删除了可从CIM_PhysicalMemory类的所有详细信息列表:
get-wmiobject cim_physicalmemory |Select-object Banklabel,制造商,Partnumber,SerialNumber,容量,速度,SementClockspeed,SextendVoltage
与前面提到的处理器细节一样,本文提供了一个常用的用于定义系统内存性能的详细信息列表。这个列表当然不是包罗万象的,可以很容易地根据您的需要进行调整。
现在,如果每个内存模块的列表满足您的库存需求,那么很好,您基本上完成了。但是为了好玩,让我们假设您希望获得系统内存的概要,只捕获服务器中包含的总体容量和物理内存模块的数量。为此,我们可以使用衡量对象Cmdlet既可以计算物理内存设备的数量,也可以计算总容量:
$ ramsummary = get-wmiobject cim_physicalmemory |SELECT-object-expandproperty容量|测量对象-Sum
如您所见,我们主要将这个命令的结果分配给一个变量——用于存储值的内存单元——在本例中是$ramSummary。因此,在执行命令之后,我们可以很容易地同时得到count和sum。我们已经讲过了Get-WmiObject和选择对象cmdlet,虽然-Expandproperty参数不是我们以前所涉及的东西。如下所示(点击展开), - 扩展名称将结果转换为名称,其中名称显示为列标题(在这种情况下容量)和值,只是值的列表,(在本例中为8589934592)。
出于本练习的目的,这是关键,因为我们将值列表送入衡量对象cmdlet。注意衡量对象默认情况下提供计数,暗示该细节,但是我们必须指定我们也想要总和。可以指定其他标志,以便检索平均,最大值,最小值或其他措施(可能取决于将送入Cmdlet的信息类型)。
因为定义了$ramSummary变量,所以可以将count和sum作为变量$ramSummary的属性来访问。计数和ramSummary.Sum美元。CIM_PhysicalMemory类最初为内存容量返回的度量单位是字节,因此很可能您希望将一个值显示为更具可读性的值。有几种方法可以做到这一点,简单地将结果除以1024三次就可以得到gb,但更优雅的方法是使用PowerShell常量将数字简单地转换为gb,比如使用$ramSummary之类的方法。总和/ 1 gb。
TPM安全信息
安全是现代网络的一个巨大因素,特别是作为虚拟机和容器增加了系统密度。可信平台模块(TPM)是Windows安全功能的关键,如BitLocker磁盘加密。与Windows 11一样,安装Windows Server 2022将需要TPM 2.0芯片。
当然,您可以使用WMI类来检索与某些TPM相关的信息,但还有一个专用的cmdlet,可以让您的工作不仅仅是检查可用性和状态。让我们从Win32_tpm WMI类开始。
如果您使用-List参数Win32_TPM检索一个WMI对象列表,WMI类不会显示,如果您尝试get-wmiobject win32_tpm它将给您一个错误,说明类是无效的。这是因为你必须指定类存在的命名空间或路径:
get-wmiobject - inamespace root / cimv2 / security / microsofttpm -class win32_tpm
这绝对比简单地提供班级名称更涉及,但这是这项工作。注意:要使用Win32_tpm类,则需要管理凭据。
WMI不仅仅是一种只读系统;有方法 - 程序函数 - 可以针对WMI对象执行。这在硬件方面具有有限的益处,但对系统流程或服务等事物更有用。
有几种方法可以了解Win32_tpm类,这些方法是了解的,但首先是如何提取类别可用的方法列表:
$ tpm = get-wmiobject - inamespace root / cimv2 / security / microsofttpm -class win32_tpm
$tpm | Get-Member -MemberType方法
获取会员有一个cmdlet吗得到帮助几乎每天都能派上用场。这对命令首先将WMI类的输出存储到$tpm变量,然后列出与该类相关联的方法。Win32_TPM类中的一些潜在有用的方法是IsActivated(), IsEnabled()和SelfTest();每一个都可以通过引用变量和后面的方法来执行,例如:$tpm。自我测试()。
如前所述,有一组专用的TPM cmdlet,您可以使用它来获取列表get命令名词Tpm这是其中一个值得注意的地方。如果你执行Get-Tpm您可能马上就会注意到,与我们一直在研究的基于wmi的细节有相当多的重叠。很明显Get-Tpm比完整的WMI命令键入速度是更快的,但主要的缺点是没有-Computername参数,因为有了Get-WmiObject,所以对远程系统执行更像是挑战。
检查保修状态
根据您的服务器硬件制造商,可能可以以编程方式检查其保修状态,假设您的硬件供应商支持它。如果您使用像HPE,戴尔或联想这样的大供应商之一,则机会很好地提供API,甚至可以提供PowerShell包PowerShell画廊。在大多数情况下,您需要能够通过系统的序列号(A.K.A.Service标记)来传递模块,您可以使用Win32_BIOS类中的SerialNumber属性来获取:
get-wmiobject win32_bios |select-object-expanderperty serialnumber