Windows PowerShellCreación de un herramienta de inventario de software

Don Jones

Contenido

Buscar la información
Prototipos
Leer nombres de equipo
Modularizing
Funciones de canalización

En esta entrega de la columna de Windows PowerShell, voy a mostrar un uso muy práctico: creará una herramienta que el número de versión del sistema operativo (una de las mejores formas para determinar la versión del sistema operativo) de inventarios y service pack número de versión de una lista de comput­ers.Pero no sólo me va a proporcionarle la solución outright.Voy para que recorra el proceso de que usar para desarrollar una secuencia de comandos como ésta.

Aunque esto es obviamente una herramienta útil, CREO que el proceso por el que desarrolle la herramienta es aún más importante.Una vez que entender y puede reutilizar en este proceso de desarrollo para las propias tareas, estará bien en la forma para resolver casi cualquier problema administrativo uso de Windows PowerShell.(Como el antiguo diciendo llega, si impartir un hombre para crear una herramienta …) Por lo que vamos a empezar.

Buscar la información

La primera y a menudo más difícil, tarea consiste en averiguar donde puede realmente encontrar el sistema operativo y los números de versión service pack.Podría estar tentado para ir de análisis en el registro.El registro es a veces, la respuesta para información como ésta, pero es normalmente la opción de último recurso porque el registro puede ser un poco complicado trabajar con.

Las palabras "recuperar" y "información de" activan inmediatamente una respuesta posible en mi mente: Instrumental de administración de Windows (WMI).Otra palabra clave que me pensar en WMI es "remoto", ya que en la versión 1 de Windows PowerShell, WMI es sobre la opción sólo para realizar cualquier tipo de operación de inventario o de administración de información remoto.

Desafortunadamente, hay decenas de miles de clases WMI en la mayoría de los sistemas de Windows, y esto puede dificultar buscar el uno que contiene la información que necesita.A suelen comenzar con un motor de búsqueda Web y elementos de las perforación en una frase, como "WMI service pack versión número. Tenga en cuenta que se necesita una frase de búsqueda bastante larga como para generar resultados más específicos.

Incluso quizás tenga que intente algunos distintos términos de búsqueda, pero no se tentado a abreviar ("WMI sp versión" no proporcionar resultados muy útiles).Considere la posibilidad de términos alternativos.Por ejemplo, lo que puede llamar a "las revisiones, llame " otros al "revisiones" y, llame todavía otros usuarios al ellos" rápida reparar ingeniería" o revisiones de qfe. Tratar todos los términos puede ser necesario para buscar los resultados de la derecho.

Si desea buscar en algo relacionados con el núcleo del sistema OPERATIVO Windows o de hardware del equipo, agregar "Win32" a la frase de búsqueda puede ayudar a, dado que la mayoría de las clases WMI relevantes comienzan con un prefijo "win32_".Sin duda agregando "Win32" a la búsqueda actual genera los mejores resultados.Veo varios resultados con "Win32_OperatingSystem" de los títulos, eso es un nombre de clase WMI.

Ahora, el truco importante es de hacer clic en cualquiera de los resultados de búsqueda.De esta forma reside madness. En primer lugar desea encontrar las páginas de documentación real para la clase, para que empezar con una nueva búsqueda usando sólo el nombre de clase que descubren.Hacerlo producirán generalmente un vínculo a lamsdn.microsoft.comSitio Web en el primer par de resultados y que debe lleva a un poco directamente a la página de documentación de clase.

La figura 1 muestra una parte de esa página.Ha desplaza a una tabla especialmente importante en esa página, que enumera las versiones del sistema OPERATIVO con el que funcionará la clase.No sé cuántas veces ha labored sobre algo, intenta obtener para trabajar, sólo para detectar que lo que ha intentando hacer no existe realmente en la versión de Windows estaba utilizando.Ahora Tengo la costumbre de primera comprobación de esta tabla.

fig01.gif

La figura 1 consultar información acerca de la clase WMI (haga clic en la imagen de una vista más grande)

Desplazarse hasta la página un poco, observa que hay dos propiedades Estoy interesado en: BuildNumber y ServicePack­MajorVersion.De hecho, ServicePackMinorVersion puede ser útil, demasiado, aunque nunca ha visto un número de 2.1 service pack de Microsoft.No obstante, probablemente merece que va a revisarse si sólo a se completa.

Cmdlet del mes: CliXML para exportar e importar de CliXML

Windows PowerShell tiene la capacidad para almacenar una instantánea estática de objetos en un formato especial de XML, lo que permite la información en esos objetos para almacenarse en un archivo y cargar en memoria para su examen posterior.Sólo puede canalizar objetos para exportar-CliXML para guardar los objetos en un archivo:

Get-Process | Export-CliXML c:\processes.xml

Al importar dichos objetos en el shell más adelante, puede examinarlos sólo como cualquier otro objeto. No está "reales" objetos, pero lo habilite más opciones informes. Supongamos que ha programado una secuencia de comandos que exporta todos los procesos en un servidor determinado a las 3: 00 A.M. Cuando se está ejecutando alguna tarea de mantenimiento. Cuando llegue a trabajar, puede cargar los procesos y buscar en ellos, quizás ordenarlos en su consumo de memoria virtual, así:

Import-CliXML c:\processes.xml | Sort VM -descending

Prototipos

No deseo ir cualquier más sin hacer que estas propiedades hacer lo que esperaba. Windows PowerShell, es muy fácil hacer esto. SE inicia mediante la comprobación de esta información en el equipo local:

Get-WmiObject Win32_OperatingSystem | Select
BuildNumber,ServicePackMajorVersion,ServicePack­MinorVersion

BIEN, la versión secundaria era cero, lo que era lo que esperaba, por lo que voy a se olvide de. La información de otra es también es lo que esperaba, un número de generación de 6001 para mi equipo de Windows Server 2008 y una versión del service pack 1.

Ahora hará una prueba similar en un equipo remoto, que se sabe soy administrador en:

Get-WmiObject Win32_OperatingSystem –computer Server2 | 
Select BuildNumber,ServicePackMajorVersion

Si esta prueba no funciona, es necesario detener y averiguar por qué antes de que puede pasar cualquier aún más. Los problemas son probablemente relacionados con conectividad, servidores de seguridad o permisos, que son todos los fuera del ámbito de Windows PowerShell propio. Una vez que tenemos todo lo que funciona correctamente, puede continuar con el paso siguiente en mi problema: cómo obtener un conjunto de nombres de equipo fuera de un archivo.

Leer nombres de equipo

Suponiendo que la lista de nombres de equipo es de un archivo de texto y hay una nombre de equipo aparecen en cada línea, la forma más sencilla de hacerlo es utilizar el cmdlet Get-Content. (No se preocupe si los nombres de equipo no están en un archivo de texto o muestran una por línea, abordaré las técnicas para tratar con diferentes circunstancias en una columna de seguimiento.)

Cada nombre se devuelve como un objeto de cadena independiente. Y una característica útil de la Get-WmiObjectcmdlet es que su parámetro –computerName acepta una colección de nombres de equipo, para esto debe bastar:

$names = Get-Content c:\computernames.txt
Get-WmiObject Win32_OperatingSystem –comp $names | Select
BuildNumber,ServicePackMajorVersion

El problema es ahora que el resultado es una lista de números con ninguna indicación de que va número con el equipo. Afortunadamente, la clase Win32_OperatingSystem sucede con otra propiedad, CSName, que incluye el nombre de equipo. Para que puede agregar dicha propiedad a la salida y obtengo un inventario interesante:

$names = Get-Content c:\computernames.txt
Get-WmiObject Win32_OperatingSystem –comp $names | Select
CSName,BuildNumber,ServicePackMajorVersion

Modularizing

Todo eso podría ser un poco demasiado para que un técnico con menos experiencia utilizar, por lo que el paso final consiste en modularize todo esto en una función. Una forma es escribir una función que acepta un nombre de archivo y que la realice el trabajo de función:

Function Get-SPInventory ([string]$filename) {
  $names = Get-Content $filename
  Get-WmiObject Win32_OperatingSystem –comp  $names | Select   CSName,BuildNumber,ServicePackMajorVersion
}

Como puede ver, simplemente ha ajusta mi código de trabajo en una función denominada Get-SPInventory. Ha definido con un parámetro de entrada denominado $ nombre del archivo, por lo que sólo se puede llamado como éste:

Get-SPInventory c:\computernames.txt

Todavía se pueden canalizar los resultados a un archivo CSV, convierte a HTML o un formato diferente, con comandos de Windows PowerShell normales, así:

Get-SPInventory c:\computernames.txt | 
Export-CSV SPInventory.csv

Esto no todavía es perfecta, sin embargo. ¿Qué ocurre si también deseaba alguna información que no se incluirá en la clase Win32_OperatingSystem, como el número de serie del BIOS para cada equipo de inventario? Que sería útil dado que las bases de muchos configuración de administración de datos (CMDBs) utiliza el número de serie del BIOS como identificador único para los equipos.

Es posible que también deseo el resultado de la función para ser un poco más flexibles, quizás lo que permite que ordenar o filtrar los resultados más fácilmente. A continuación, por ejemplo, puede optar por incluir sólo los equipos de Windows Server 2003 con una versión anterior del service pack en el resultado final para crear una lista de equipos que se necesita para actualizar.

Funciones de canalización

Ahora desea volver a escribir mi función que un Reproductor mejor en la canalización de Windows PowerShell. En concreto, deseo que la función para aceptar directamente los nombres de equipo desde la canalización, de este modo, puede decidir que desea obtener los nombres de equipo desde cada vez que use la función. Los nombres de equipo pueden en un archivo o pueden ser en Active Directory y se desea que la función para trabajar bien cualquier forma. Por lo tanto, ésta es la función volver a escribir de la canalización:

Function Get-SPInventory {
  PROCESS {
    $wmi = Get-WmiObject Win32_OperatingSystem       –comp $_ | Select     CSName,BuildNumber,ServicePackMajorVersion
    Write-Output $wmi
  }
}

Este tipo especial de función utiliza un bloque de script PROCESS, que se ejecutará una vez para cada objeto de canalización canalizar a la función. (Los lectores dedicados se recuerde que he explicado el bloque de secuencias de comandos de proceso de la entrega de 2008 de julio de esta columna, disponible en technet.microsoft.com/Magazine/cc644947.aspx.) La variable especial $ _ se rellenará automáticamente con la canalización de entrada, siempre que me canalizar en los nombres de equipo, le funcionan bien. La nueva función se utiliza como éste:

Get-Content c:\computernames.txt | Get-SPInventory

Como puede ver, esto ofrece más flexibilidad para obtener los nombres de equipo desde orígenes diferentes. Sólo reemplace la parte de Get-Content del comando el comando es necesario para recuperar los nombres de equipo. Tenga en cuenta que ha también configurar, para que pueden crear resultados más robusta mediante consultas a diferentes clases WMI (o cualquier otro origen de datos) antes de construir la salida.

Pero eso no es el final de la discusión. Próximo mes le expandir esta función para incluir el número de serie del BIOS en los resultados.

Don Jones es cofundador de tecnología concentró y autor de numerosos libros de INFORMÁTICA. Leer sus sugerencias de Windows PowerShell semanales o póngase en contacto con él en www.ConcentratedTech.com.