Windows PowerShellInventario herramienta Best nunca!

Don Jones

Contenido

La herramienta de exploración
Unidad de prueba
Los equipos en masa
¿Qué que hacer con el?
Va reducir
Eficaces herramientas Do-It-Yourself

En las partes algunas anteriores de esta columna, han demostrado diversas técnicas para usar Windows PowerShell para recopilar información de inventario del equipo.En esta entrega, se reunir todo en una herramienta listos para ejecución que puede recopilar cualquier tipo de información de Windows Management Instrumentation (WMI).

Vídeo

Don Jones ajusta hasta su serie sobre la creación de una herramienta muy eficaz y completo.En este vídeo de transmisión por secuencias, muestra el toque final que tendrá que agregar.

Y la herramienta se se ha diseñado para trabajar con una lista de texto de nombres de equipo o los nombres de equipo consultados de Active Directory.

La herramienta de exploración

Comenzará con la secuencia de comandos (consulte la figura 1 ), paso a los elementos de su estructura paso y examinando algunos de los trucos utiliza.Algunas de estas técnicas pueden parecer un poco extraño o fuera de lugar, pero estoy lumping les aquí por lo que puede demostrar una gran variedad de trucos interesantes usado.

La figura 1 la secuencia de comandos

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

En la línea 1, puede ver que la función es denominada Get-WmiInventory. Directamente debajo, definir un parámetro de entrada denominado $ wmiclass y concédale un valor predeterminado de "Win32_OperatingSystem". El scriptblock proceso indica que se trata de una función de filtrado, uno diseñado para aceptar una colección de nombres de equipo desde la canalización, verá en un momento cómo pasar esa información a la función.

Línea 6, se desactivará comportamiento normal de informes de errores el shell ya que desea proporcionar mi propio registro de errores. Y línea 7 simplemente toma el nombre de equipo actual (como canalizar a la función) en el equipo $ variable.

Ahora Ir a línea 13, que creo una variable denominada $ omitir y establecerla en el valor booleano el valor False (más que en un momento). En línea 14, a continuación, intentar obtener la información de WMI deseada desde el equipo actual mediante el cmdlet Get-WmiObject. Tenga en cuenta que ha especificado el parámetro –ErrorAction (o –EA), que indica el shell para generar una excepción si la recuperación WMI un error por algún motivo.

Línea 15 comprueba si la $ omitir variable aún contiene False. Si lo hace, entonces línea 16 enumera a través de lo que procede volver WMI y agrega (en línea 17) una propiedad NombreDeEquipo para cada objeto WMI. De esta forma, cuando la secuencia de comandos está devolviendo objetos WMI desde varios equipos, cada uno de ellos se etiqueta con su nombre de equipo principal en una propiedad adecuada. Línea 18 envía cada objeto a la canalización para otro cmdlet puede tratar o para formato subsistema el shell puede hacerse cargo para mostrar algunas de las propiedades del objeto.

Pero ¿qué ocurre si algo va mal? Puesto que especifica –EA detener, el shell ejecutará el reventado de línea de 8. En primer lugar, escribe el nombre de equipo en un archivo de texto para que tengan un registro de nombres de equipo que no se pudo el inventario. A continuación, en línea 10, establecen la $ omitir variable el valor booleano true. Esto impide que la secuencia de comandos de intentar salida nada en la línea de 15, si no había hecho esto, entonces daría como resultado cada equipo que se produce un error en información de inventario el equipo anterior se salida nuevo.

Windows PowerShell preguntas y respuestas

P ¿Puedo utilizar Windows PowerShell para administrar principal del servidor de Windows Server 2008?

A totalmente. AH, probablemente ha oído que Windows PowerShell no puede instalarse en Server Core debido a que Server Core actualmente no admite .NET Framework, que requiere que el shell. Pero esto no es un problema. Muchos administradores aconsejable no instalar a cualquier cosa en sus servidores, si pueden ayudar, y Windows PowerShell no es una excepción. En su lugar, puede instalar Windows PowerShell en el equipo cliente y utilizar se para remota administrar Server Core mediante dichas tecnologías como Instrumental de administración de Windows (WMI), Active Directory y mucho más. Puede, por ejemplo, administrar fácilmente la mayoría de los aspectos de Active Directory en un controlador de dominio de en función de Server Core, todo sin dejar la comodidad de su escritorio.

Línea 10 utiliza una técnica diferente para establecer la variable: el reventado sí es un ámbito de variable privado y no contiene una variable de omitir $. La $ omitir variable desea es de ámbito de principal de la captura, un nivel hacia arriba. El cmdlet Set-variable permite modificar la variable con el de parámetro de scope, que indica que la omitir $ que me interesan está un nivel hacia arriba. Tenga en cuenta también que cuando se utiliza Set-Variable, el nombre de la variable no incluir el símbolo $ delante de él.

Unidad de prueba

Un modo simple para probar esto es canalizar sólo en un solo nombre de equipo, así:

"localhost" | Get-WmiInventory 

Porque no ha especificado un nombre de clase WMI, se utiliza el valor predeterminado de Win32_­OperatingSystem. Para especificar una clase diferente, siga esto:

"localhost" | Get-WmiInventory "Win32_LogicalDisk"

la figura 2 muestra los resultados. Y si desea incluir más nombres de equipo, basta con realizar una lista separada por comas de ellos así:

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

fig02.gif

La Figura 2 resultados de Get-WmiInventory

Los equipos en masa

Especificar los nombres de equipo individual es bastante tedioso si dispone de una lista larga. Si ya tiene una lista de nombres de equipo en un archivo de texto, nombre de equipo uno por línea, a continuación, puede canalizar los nombres de derecha a la función de inventario de este modo:

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

Otra técnica implica el uso de la cmd­let Get-QADComputer, que se proporciona como parte de los cmdlets de Active Directory libres disponibles desde quest.com/powershell. Deberá instalar los cmdlets de Active Directory, abrir Windows PowerShell y ejecutar:

Add-PSSnapin Quest.ActiveRoles.ADManagement

Ejecutar Get-QADComputer para recuperar todos los equipos de Active Directory. Pero tenga en cuenta que en un dominio grande, esta operación tardará unos minutos. Se puede ejecutar Help Get-QADComputer para ver algunas de las opciones disponibles para filtrar la lista de equipos, como sólo captura los equipos que residen en una unidad organizativa (OU) específica. También deberá realizar un cambio secundario en la secuencia de comandos, cambiar la línea 7 desde

$computer = $_

$computer = $_.Name

Esto es necesario porque los objetos creados por Get-QADComputer almacenar el nombre de equipo en una propiedad Name en vez de como un objeto de cadena simple.

¿Qué que hacer con el?

Resultado de esta secuencia de comandos predeterminado tendrá el formulario se crea el subsistema de formato de Windows PowerShell de forma predeterminada. Por ejemplo, la clase Win32_OperatingSystem es un subconjunto pequeño (sólo seis propiedades) de la información realmente disponible de esa clase. Puede canalizar la salida de esta secuencia de comandos para cualquier cmdlet del shell estándar para personalizar ese resultado. Por lo tanto, para mostrar número de generación y servicio de información del paquete, junto con los nombres de equipo, haga lo siguiente:

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

Si desea obtener un inventario de los servicios instalados y generar una tabla HTML, siga esto:

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

Y si desea obtener un inventario completo de información de disco lógico y escribirlo en un archivo de (CSV) de valores separados por comas, siga esto:

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

Tenga en cuenta que porque la función de Get-WmiInventory genera objetos, no simple texto, el shell puede hacer bastante para ayudarle a obtener los datos en el formulario que necesita, tanto si se trata de estadística tendencias, informes de administración, o sólo un vistazo rápido a información crítica.

Va reducir

Un punto débil en la secuencia actual es que recupera todos los objetos WMI de la clase que especifique. Con algunas clases, que puede ser demasiados datos. Normalmente prefieren restringir Win32_LogicalDisk de manera que sólo recuperar discos locales, que tiene una propiedad DriveType de 3. Puede modificar fácilmente la secuencia de comandos para incluir criterios de filtro como, la secuencia de comandos revisada se muestra en la figura 3 . Para llamar a esta nueva secuencia de comandos, utilice esto:

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

La figura 3 la secuencia de comandos revisada que admite el filtrado

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

Los cambios, en líneas 4 y 15, simplemente recopilar un nuevo parámetro denominado $ filtro y lo pasa al parámetro –filter de Get-WmiObject. Cuando se llama a la función, el parámetro de filtro $ es en segundo lugar, por lo que se pasa como un segundo valor después del nombre de la clase WMI. Hay mucho más que puede hacer para personalizar esta función para su entorno específico, pero hay unas cosas debe evitar esto:

  • No tiene la función enviar su salida a todo excepto la canalización, que se realiza en línea 19 de la secuencia de comandos revisada. En otras palabras, no tener la información de salida función a un archivo. En su lugar, tomar la salida de la función de la canalización y enviar a un cmdlet, como Out-File, que se mueve el resultado a un archivo o otro medio. Esto garantizará que la función conserva su flexibilidad.
  • No filtrar información dentro de la función, como quitar propiedades del objeto WMI o caso de salida sólo un subconjunto de propiedades. Esto demasiado reduciría la flexibilidad de la función para escenarios de futuros. En su lugar, si no tiene toda la información que se va a salida, canalizar que resultados para un cmdlet Format o Select-Object para que se pueda obtener sólo la información que necesita para la tarea en cuestión.
  • No agregue tareas adicionales a la función. Cada función única encargados de mantener, en lugar de creación super-functions que hacer muchas cosas. Si tiene un proceso complejo, realizar creando cada tarea discreto como una función independiente y, a continuación, canalizar la información de una a otra. Esto mantiene cada función más flexible, más fáciles de mantener y mucho más fáciles de depurar.

Eficaces herramientas Do-It-Yourself

Mientras una secuencia de comandos como ésta no es ningún reemplazo para un sistema de administración de configuración eficaz como System Center Configuration Manager, proporciona una manera fácil información de selección de inventario de un conjunto de equipos remotos. Esta secuencia de comandos es un buen ejemplo de una de las cosas que Windows PowerShell es mejor: proporcionar una solución rápida y ad hoc a problemas que Microsoft no imaginar al crear Windows o cualquier otro producto estás utilizando.

Dado que esta secuencia de comandos en particular utiliza WMI, que funciona con equipos todos la forma de Windows NT 4.0, incluso aunque Windows PowerShell no puede instalarse en un equipo que antiguo. Y, ya que muchos productos de Microsoft exponen información de administración a través de WMI, puede recopilar información de diversos productos. Deseo usar (un libre uno está en una herramienta de explorador WMI ScriptingAnswers.com en la " Herramientas de zona") para examinar la información de WMI disponible de un equipo y, a continuación, utilice una secuencia de comandos como la he mostrado aquí para recopilar esa información de varios equipos.

Don Jones un asociado de tecnología concentró y coautor de Windows PowerShell: TFM (Press SAPIEN). Obtenga sugerencias de Windows PowerShell semanales y póngase en contacto con Don, en ConcentratedTech.com.