O Windows PowerShellMelhor Inventory Tool já!

Don Jones

Conteúdo

Explorando a ferramenta
Unidade de teste
Computadores en Masse
O que você fazer com ele?
Indo além
Poderosas ferramentas Do-It-yourself

Em prestações passadas algumas desta coluna, eu tenha demonstrado diversas técnicas para usar o Windows PowerShell para coletar informações de inventário de computador.Nesta edição, irá montar tudo em uma ferramenta prontos para execução que pode reunir qualquer tipo de informação de INSTRUMENTAÇÃO de gerenciamento do Windows ().

Vídeo

Don Jones ajusta a sua série sobre a criação de uma ferramenta de inventário muito eficiente, completo.Neste vídeo de fluxo, ele demonstra os toques finais que você precisará adicionar.

E a ferramenta irá ser projetada para funcionar com uma lista de texto de nomes de computador ou nomes de computador consultados do Active Directory.

Explorando a ferramenta

VOU começar com o script propriamente dito (veja a Figura 1 ), percorrendo os elementos da sua estrutura e examinando alguns dos truques que ele usa.Algumas dessas técnicas podem parecer um pouco estranho ou está fora do local, mas eu estou lumping-las aqui para que possa demonstrar uma variedade de truques interessantes sendo usado.

A Figura 1 O script

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. }  

Na linha 1, você pode ver que a função é chamada Get-WmiInventory. Logo abaixo, definir um parâmetro de entrada chamado $ wmiclass e dê um valor padrão de "Win32_OperatingSystem" a ele. O PROCESS scriptblock indica que essa é uma função de filtragem, um criado para aceitar uma coleção de nomes de computador do canal de — você verá em instantes como passar informações para a função.

Linha 6 desativa comportamento normal de relatório de erro o shell, desde que deseja fornecer meu próprio log de erros. E linha 7 simplesmente captura o nome do computador atual (como enviada por pipe para a função) no computador variável $.

Agora vá para a linha 13, onde eu criar uma variável chamada $ ignorar e defini-la como o valor booleano valor False (mais informações sobre isso em instantes). Na linha 14, então tentar capturar as informações de WMI desejadas do computador atual, usando o cmdlet Get-WmiObject. Observe que eu tenha especificado o parâmetro –ErrorAction (ou –EA), que informa o shell para gerar uma exceção se a recuperação WMI falhar por algum motivo.

Linha 15 verifica se o $ pular variável ainda contém False. Se ele faz e linha 16 enumera a que veio volta WMI e adiciona (em linha 17) uma propriedade NomeDoComputador para cada objeto WMI. Dessa forma, quando o script está retornando objetos WMI de vários computadores, cada um deles é rotulado com seu nome de computador pai em uma propriedade conveniente. Linha 18 produz cada objeto para o pipeline para outra cmdlet pode lidar com ele ou para o subsistema de formatação do shell possa assumir o controle para exibir algumas das propriedades do objeto.

Mas e se algo der errado? Desde que especifiquei –EA parar, o shell executará o ajuste de registro na linha 8. Primeiro, ele grava o nome do computador em um arquivo texto para que eu tenha um registro de nomes de computador que falhou o estoque. Em seguida, na linha 10, defini a variável de ignorar $ como o valor booleano True. Isso evita que o script tentem saída nada na linha 15 — se eu não feito isso, cada computador que não resultaria em informações de inventário do computador anterior sendo saída novamente.

O Windows PowerShell perguntas e respostas

P É possível usar o Windows PowerShell para gerenciar o servidor principal do Windows Server 2008?

A certeza. Ah, você provavelmente ouviu que o Windows PowerShell não esteja instalado no Server Core porque Server Core atualmente não suporta o .NET Framework, que requer que o shell. Mas isso não é um problema. Muita administradores prudente não instalar algo em seus servidores se eles podem ajudá-lo, e o Windows PowerShell não é exceção. Em vez disso, você pode instalar o Windows PowerShell no computador cliente e usá-lo para remotamente gerenciar Server Core usando essas tecnologias como de WMI, Active Directory e muito mais. Por exemplo, você pode gerenciar facilmente maioria dos aspectos do Active Directory em um controlador de domínio com o Server Core, tudo sem deixar o conforto de sua mesa.

Linha 10 usa uma técnica diferente para definir a variável: A interceptação propriamente dito é um escopo de variável particular e ele não contém uma variável de ignorar $. O $ ignorar variável quero provém pai escopo a interceptação, um nível acima. O cmdlet Set-variável permite modificar a variável usando o parâmetro de escopo, indicando que a exclusão de $ estou interessado em é um nível de backup. Também observe que, quando você usa o Set-variável, o nome da variável não inclui o símbolo $ na frente dele.

Unidade de teste

Uma maneira simples para testar isso é apenas pipe em um nome único computador, como este:

"localhost" | Get-WmiInventory 

Como eu não tenha especificado um nome de classe WMI, o padrão de Win32_­OperatingSystem é usado. Para especificar uma classe diferente, faça isso:

"localhost" | Get-WmiInventory "Win32_LogicalDisk"

a Figura 2 mostra os resultados. E se você deseja incluir mais nomes de computador, você simplesmente fazer uma lista separada por vírgulas deles assim:

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

fig02.gif

A Figura 2 resultados de Get-WmiInventory

Computadores en Masse

Especificar nomes de computador individuais é muito tedioso se você tiver uma lista longa. Se você já tiver uma lista de nomes de computador em um arquivo de texto — o nome de um computador por linha — e você pode canalizar os nomes de direita para a função de estoque ao fazer isso:

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

Outra técnica envolve o uso de cmd­let o Get-QADComputer, que é fornecido como parte de cmdlets do Active Directory livres disponíveis em quest.com/powershell. Você precisará instalar os cmdlets do Active Directory, abra o Windows PowerShell e execute:

Add-PSSnapin Quest.ActiveRoles.ADManagement

Execute Get-QADComputer para recuperar todos os computadores do Active Directory. Mas lembre-se de que, em um domínio grande, isso irá demorar um pouco! Você pode executar o Help Get-QADComputer para ver algumas das opções disponíveis para filtrar a lista de computadores, como apanhar somente os computadores que residem em uma unidade organizacional específica (OU). Você também precisa fazer uma alteração secundária o script, alterar linha 7 de

$computer = $_

$computer = $_.Name

Isso é necessário porque os objetos produzidos pelo Get-QADComputer armazenam o nome do computador em uma propriedade de nome em vez de um objeto de cadeia de caracteres simples.

O que você fazer com ele?

Padrão saída esse script terão qualquer formulário o subsistema de formatação do Windows PowerShell criará por padrão. Por exemplo, a classe Win32_OperatingSystem é um subconjunto pequeno (apenas seis propriedades) das informações, na verdade, disponíveis em dessa classe. Você pode canalizar a saída desse script para qualquer cmdlet do shell padrão para personalizar essa saída. Portanto, para exibir o número da compilação e serviço de informações do pacote, juntamente com os nomes de computador, faça isso:

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

Se você deseja obter um inventário dos serviços instalados e produzir uma tabela HTML, faça o seguinte:

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

E se desejar obter um inventário completo de informações de disco lógico e gravá-los para um arquivo de valores separados (CSV) vírgula, faça isso:

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

Observe que como a função de Get-WmiInventory produz objetos, texto simples não, o shell pode fazer bastante para ajudar você a tirar os dados para o formulário que for necessário, seja para estatísticas tendências, relatórios de gerenciamento, ou apenas uma olhada rápida no informações críticas.

Indo além

Uma vulnerabilidade no script atual é que ele recupera todos os objetos do WMI da classe especificada. Com algumas classes, que pode ser muitos dados. Geralmente prefiro restringir Win32_LogicalDisk para que eu apenas recuperar discos locais, que tem uma propriedade DriveType de 3. Pode modificar facilmente o script para incluir critérios de filtro como — o script revisado é mostrado na Figura 3 . Para chamar esse script novo, eu uso isso:

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

A Figura 3 O script revisado para oferecer suporte a filtragem

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. }

As alterações, em linhas 4 e 15, simplesmente obter um novo parâmetro chamado $ filtro e passá-lo para o parâmetro –filter de Get-WmiObject. Ao chamar a função, o parâmetro de filtro $ está em segundo lugar, para que ele é passado como um segundo valor após o nome de classe WMI. Há plenty mais do que você pode fazer para personalizar esta função para seu ambiente específico, mas existem algumas coisas que você deve evitar fazer:

  • Não tem a função enviar sua saída para qualquer mas o pipeline, que é feito na linha 19 do script revisado. Em outras palavras, não ter as informações de saída da função para um arquivo. Em vez disso, se a saída do pipeline da função e enviar que ele seja um cmdlet, como Out-File, que move a saída para um arquivo ou outra mídia. Isso garantirá que a função retém sua flexibilidade.
  • Não filtrar informações dentro a função — como remover propriedades do objeto WMI ou saída apenas um subconjunto de propriedades. Isso muito reduziria de flexibilidade a função para cenários futuras. Em vez disso, se você não precisa todas as informações sendo saída, conduza que a saída para um cmdlet Format ou Select-Object para que você possa obter apenas as informações que necessárias para a tarefa à mão.
  • Não adicione tarefas adicionais para a função. Manter cada função designado única, em vez de construção super-functions que fazer coisas. Se você tiver um processo complexo, fazê-lo, criação de cada tarefa separada como uma função autônomo e, em seguida, comunicando informações de um para outro. Isso mantém a cada função mais flexível, mais fácil manter e muito mais fácil de depurar.

Poderosas ferramentas Do-It-yourself

Enquanto um script como isso não é nenhum substituto para um sistema de gerenciamento de configuração eficiente como System Center Configuration Manager, ele fornecer uma maneira fácil selecionar informações de inventário de um conjunto de computadores remotos. Esse script é um bom exemplo de uma das coisas Windows PowerShell é melhor em: fornecendo uma solução rápida e ad hoc para problemas que a Microsoft não antevir ao criar o Windows ou qualquer outro produto você está usando.

Como esse script específico usa o WMI, ele funciona com computadores todos a maneira de volta para o Windows NT 4.0 — mesmo se próprio Windows PowerShell não pode ser instalado em um computador que antigo! E, porque muitos produtos da Microsoft expõem informações de gerenciamento por meio do WMI, você pode coletar informações de vários produtos. Gosto de usar uma ferramenta de explorer WMI (um gratuita uma é em ScriptingAnswers.com na "ferramentas zona") para procurar as informações de WMI disponíveis em um computador e usar um script como o que mostramos aqui para coletar essas informações de vários computadores.

Don Jones um parceiro na tecnologia concentrou e co-autor de Windows PowerShell: TFM (SAPIEN Press). Obtenha dicas de Windows PowerShell semanais e entrar em contato com Don, em ConcentratedTech.com.