Windows PowerShell最佳清单工具过 !

Don Jones

内容

浏览工具
测试驱动器
计算机 en Masse
什么实现出现? 使用它
将更多
功能强大的 Do-It-Yourself 工具

在过去的几个付款本专栏的我已演示了各种技术使用 Windows PowerShell 收集计算机库存信息。在这期,我将将所有内容组合到一个可以运行工具,它可以收集任何类型的信息从 Windows Management Instrumentation (WMI)。

视频

Don Jones 包装设置系列构建一个非常强大的、 全功能的清单工具。在此流的视频,他演示需要添加在最后一触及。

并且该工具将被设计为使用文本的列表的计算机名称或查询从 Active Directory 的计算机名称。

浏览工具

我将开始用脚本本身 (请参见 图 1 ),它使用逐句通过其结构的元素,并查看该技巧的一些。这些技术的一些可能看起来有些奇怪或移出位置,但我 lumping 它们在此处使我可以演示各种正在使用的很棒技巧。

图 1 脚本

1. function Get-WmiInventory {
2.  param (
3.  $wmiclass = "Win32_OperatingSystem"
4.  )
5.  PROCESS {
6.   $ErrorActionPreference = "SilentlyContinue"
7.   $computer = $_
8.   trap {
9.    $computer | out-file c:\errors.txt -append
10.    set-variable skip ($true) -scope 1
11.    continue
12.   }
13.   $skip = $false
14.   $wmi = Get-WmiObject -class $wmiclass -computer $computer -ea stop
15.   if (-not $skip) {
16.    foreach ($obj in $wmi) {
17.     $obj | Add-Member NoteProperty ComputerName $computer
18.     write $obj
19.    }
20.   }
21.  }
22. }  

第 1 行上可以看到该函数称为 get-WmiInventory。 权限下,我定义名为 $ wmiclass 的输入的参数并一下默认值为"Win 32 _ OperatingSystem"。 PROCESS scriptblock 指示这是一个设计为接受从管道的计算机名称的集合在筛选功能,您将看到稍后如何我将该信息传递到函数。

第 6 行关闭程序的正常错误报告行为,因为我想要提供自己的错误日志记录。 和第 7 行只是获取当前的计算机名称 (如通过管道输送到函数) 变量 $ 计算机中。

现在转到行 13,我在其中创建变量名为 $ 跳过,并将其设置为布尔值 False (详细的进行)。 在行 14,我然后尝试使用 Get-WmiObject cmdlet 获取所需的 WMI 信息,从当前计算机。 请注意我已指定了 –ErrorAction (或 –EA) 参数,它指示外壳程序生成异常,如果由于某种原因失败的 WMI 检索。

行 15 检查如果 $ 跳过变量仍包含 False。 如果那样,然后行 16 枚举任何返回来自 WMI,并添加行 17 中) 上 ComputerName 属性以每个 WMI 对象。 这样,该脚本将返回从多台计算机的 WMI 对象,每个用方便的属性中其父计算机名称标记。 行 18 输出为管道每个对象,以便其他 Cmdlet 可以处理它,或以便外壳的格式子系统可以采取上要显示某些对象的属性。

但是,如果出现问题? 因为我指定 –EA 停止,外壳程序将执行该陷阱第 8 行。 首先,它写入计算机名称文本文件以便我拥有失败库存的计算机名称的日志。 行 10,我将在 $ 跳过变量设置为布尔值 true。 这样可防止脚本试图输出任何在行 15,如果我未完成此,则失败的每台计算机将导致再次被输出的前一计算机的库存信息。

Windows PowerShell 常见问题

问: 能否使用 Windows PowerShell 来管理 Windows Server 2008 服务器核心?

A 绝对。 噢,您可能听过 Windows PowerShell 不能安装了 Server Core 因为 Server Core 目前不支持.NET Framework 外壳要求。 但这不是问题。 很多方面的管理员无任何他们的服务器上如果安装它们可以帮助其,和 Windows PowerShell 也不例外。 相反,可以客户端计算机上安装 Windows PowerShell 并用其远程管理服务器核心为 Windows Management Instrumentation (WMI)、 Active Directory 和更多使用这样的技术。 对于是实例,您可以轻松地管理大多数方面上服务器核心基于域控制器,而不必离开办公桌的并且所有的 Active Directory。

行 10 使用不同的技术将变量设置: 该陷阱本身是专用的变量范围,并且它不包含 $ 跳过变量。 $ 跳过我想从陷阱的父作用域上的一个级别的变量。 Set 变量 cmdlet 使我能够通过修改变量-作用域参数指示我想在 $ 跳过一个级别上。 此外请注意当您使用组变量,变量名不包含前的 $ 符号。

测试驱动器

若要测试这一个简单方法是只是管道此台计算机名中:

"localhost" | Get-WmiInventory 

由于我尚未指定 WMI 类名,因此使用 Win32_­OperatingSystem 的默认值。 若要指定不同的类,执行以下操作:

"localhost" | Get-WmiInventory "Win32_LogicalDisk"

图 2 显示结果。 如果您想要包含更多的计算机名称,您只需进行其中一个逗号分隔列表如下:

"localhost","server2","client17" | 
Get-WmiInventory "Win32_LogicalDisk"

fig02.gif

图 2 Get WmiInventory 结果

计算机 en Masse

指定单个计算机名称是非常枯燥乏味如果您有一个长的列表。 如果文本文件中已经有计算机名称列表每行的一个计算机名称,然后您可以通过执行此操作管道这些名称从右到库存函数:

Get-Content c:\names.txt | Get-WmiInventory "Win32_Service"

另一种技术包括在获取 QADComputer 为 cmd­let Quest.com/powershell 中作为可用的 Active Directory cmdlet 的一部分提供的使用。 需要安装 Active Directory cmdlet,打开 Windows PowerShell 并运行:

Add-PSSnapin Quest.ActiveRoles.ADManagement

运行 Get-QADComputer 从 Active Directory 中检索的所有计算机。 但请注意在大型的域中这可能需要一段! 您可以运行帮助 Get-QADComputer 若要查看的选项可用于筛选台计算机 (如) 只提取驻留在特定的组织单位 (OU) 的计算机列表。 您还需要进行次要更改该的脚本更改从第 7 行

$computer = $_

$computer = $_.Name

原因是需要在 Name 属性而不是为简单的字符串对象,对象生成的 Get-QADComputer 存储计算机名称。

什么实现出现? 使用它

此脚本的默认输出会在 Windows PowerShell 格式子系统将创建默认情况下任何窗体。 是例如,Win 32 _ OperatingSystem 类是从该类实际可用信息的小子集 (只是六个属性)。 通过管道到自定义输出任何标准的外壳 cmdlet 的此脚本的输出。 因此,要显示生成编号和 Service Pack 信息以及该计算机名称执行此操作:

Get-Content c:\names.txt | Get-WmiInventory | 
Format-List BuildNumber,ServicePackMajor­Version,­ComputerName

如果您想获取已安装的服务的清单,并生成一个 HTML 表,请将此执行:

Get-Content c:\names.txt | Get-WmiInventory "Win32_Service" | 
ConvertTo-HTML | Out-File c:\services_inventory.html

如果想要获取的逻辑磁盘信息的完整库存和逗号分隔的值 (CSV) 文件写入它,执行此操作:

Get-Content c:\names.txt | 
Get-WmiInventory "Win32_LogicalDisk" | Export-CSV c:\disks.csv

请注意执行由于 Get-WmiInventory 函数生成不简单的文本的对象外壳程序可以操作非常有些可帮助您是否为统计趋势、 管理报告或只是快速查看关键信息的获取到需要窗体的数据。

将更多

在当前的脚本中的一个弱点是它检索的所有 WMI 对象从您指定的类。 使用某些类,可能太多的数据。 我通常希望限制 Win 32 _ LogicalDisk,以便只检索具有 3 的 DriveType 属性的本地磁盘。 我可以轻松地修改以包括筛选器条件类似的脚本) 修改后的脚本如 图 3 所示。 若要调用此新的脚本,我使用此:

Get-Content c:\names.txt | 
Get-WmiInventory "Win32_LogicalDisk" "DriveType='3'"

图 3 支持筛选修订后的脚本

1. function Get-WmiInventory {
2.  param (
3.   $wmiclass = "Win32_OperatingSystem"
4.   $filter = ""
5.  )
6.  PROCESS {
7.   $ErrorActionPreference = "SilentlyContinue"
8.   $computer = $_
9.   trap {
10.    $computer | out-file c:\errors.txt -append
11.    set-variable skip ($true) -scope 1
12.    continue
13.  }
14.  $skip = $false
15.  $wmi = Get-WmiObject -class $wmiclass -computer $computer -ea stop –filter $filter
16.  if (-not $skip) {
17.    foreach ($obj in $wmi) {
18.     $obj | Add-Member NoteProperty ComputerName $computer
19.     write $obj
20.    }
21.   }
22.  }
23. }

4 和 15 的行上的该更改只会收集名为 $ 筛选器的新参数,并将它传递给的 Get-WmiObject –filter 参数。 在调用该函数时 $ 筛选器参数是第二个,使的 WMI 类名后传递作为第二个值。 还有 plenty 更多的可自定义此功能为您的特定环境,但有您应该避免这样做的一些事项:

  • 没有发送到其输出,之外,管道修订后的脚本的行 19 上完成的函数。 换句话说,不必函数输出信息文件。 相反,执行函数的管道输出,并发送 Cmdlet,如 out-file,以便将输出移动到文件或其他媒体。 这将确保该函数保留其灵活性。
  • 不筛选出该函数中的信息如删除 WMI 对象属性,或只输出的属性的子集。 这太会降低为将来的方案的函数的灵活性。 相反,如果您不需要的所有信息在输出,管道的输出格式 cmdlet 或选择对象,这样,您可以获得只为手头任务所需的信息。
  • 不要在函数中添加其他的任务。 保留每个的函数单个承担任务而不是执行许多操作的构建 Super-functions。 完成如果复杂的过程操作它构建为独立函数的每个独立任务,然后管道到另一个中的信息。 这使每个函数,更灵活、 易于维护,并且更更易于调试。

功能强大的 Do-It-Yourself 工具

而脚本像这是一个功能强大的配置管理系统如 System Center Configuration Manager 不替代,它提供的简单库存选择信息从一组远程计算机。 此脚本是 Windows PowerShell 是在最佳操作之一一个很好示例: 提供快速、 临时的解决方案问题 Microsoft 不会创建 Windows 或任何时的其他产品使用。

因为此特定脚本使用 WMI,它适用于计算机所有上溯至 Windows NT 4.0 即使不能的旧计算机上安装 Windows PowerShell 本身! 因为许多 Microsoft 产品公开通过 WMI 管理信息,您将可以收集信息,从不同的产品。 我要使用 WMI 资源管理器工具 (免费之一是在 scriptinganswers.com 在"工具区域中") 浏览可用 WMI 信息在计算机上的,然后使用我所示从多台计算机中收集的信息类似的脚本。

Don Jones 在 Concentrated 技术和 co-author Windows PowerShell: TFM (SAPIEN Press) 的合作伙伴。 获取每周的 Windows PowerShell 提示,并联系 Don, ConcentratedTech.com.