Buscar y recopilar información
Introducción
Como administrador, a menudo tendrá que recopilar información en los puestos de trabajo que ejecutan los scripts. Saber recopilar información, pero sobre todo saber dónde encontrarla, es primordial, pues sirve, por ejemplo, para implementar estructuras condicionales (If, ElseIf, Else) en un script. En efecto, en función de una o varias condiciones, puede hacer que el script no ejecute las mismas líneas de comandos.
La recopilación de información también puede servir para auditar los puestos de trabajo, y así recuperar información sobre los distintos componentes de hardware que los componen. Esto puede permitir, por ejemplo, reparar el conjunto de equipos que posean un componente que el fabricante haya declarado como defectuoso, y llevar a cabo rápidamente su sustitución.
Tras la lectura de este capítulo, sabrá cómo recuperar la mayoría de la información, tanto sobre el hardware como sobre el software. Esto le permitirá realizar correctamente el conjunto de tareas que quiera llevar a cabo en función de la máquina que ejecuta las líneas de comandos PowerShell.
Buscar archivos
Windows integra de manera nativa una herramienta de búsqueda de archivos accesible desde el Explorador de archivos. Con Windows PowerShell, es posible realizar este tipo de búsqueda, únicamente con el cmdlet Get-Child Item, visto anteriormente. La búsqueda está cada vez más presente en Windows, y la cantidad de datos es cada vez mayor. Conviene saber realizar búsquedas avanzadas con Windows PowerShell.
1. Buscar archivos en función de sus propiedades
Comenzaremos por una búsqueda en función del tipo de archivo, por ejemplo los archivos de datos de Outlook, cuya extensión es .pst. Para buscar la existencia de estos archivos en el conjunto del disco C:, escriba:
Ejemplo:
PS C:\Windows\system32> Get-ChildItem C:\ -Filter *.pst -Recurse
Directory: C:\CopiaDeSeguridad
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 24/03/2014 17:53 190989312 Archive2013.pst
Directory: C:\Users\Julien\Outlook
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 11/12/2011 13:45 1527792640 Archive2013.pst
-a--- 29/01/2012 15:21 1003635712 Outlook.PST
De este modo, puede buscar todos los tipos de archivo, desde el punto del árbol seleccionado. En efecto, resulta inútil buscar en una partición completa los datos si uno sabe dónde se encuentran: esto...
Comparar objetos
Compare-Object permite comparar dos objetos entre sí: el primero se indica mediante el parámetro -ReferenceObject, mientras que el segundo se indica con el parámetro -DifferenceObject. De este modo, es posible comparar el contenido de dos archivos de texto, registros, etc. Compare-Object está bien adaptado para comparar el contenido de dos elementos que contengan texto, o propiedades de objetos.
1. Comparar dos archivos de texto
El resultado devuelto por Compare-Object es un indicador para cada elemento comparado. Así, todo elemento correspondiente a la referencia se indica con el símbolo <=, y todo elemento correspondiente a la diferencia, con el símbolo =>. Especificando el parámetro -IncludeEqual, todo lo que sea común a ambos objetos de referencia y de diferencia se mostrará por pantalla con el indicador ==.
Ejemplo 1: comparación de dos archivos de texto
PS C:\Windows\system32> Compare-Object -ReferenceObject (Get-Content
C:\Temp\ref.txt) -DifferenceObject (Get-Content C:\Temp\dif.txt)
InputObject SideIndicator
----------- -------------
Este archivo se llama dif.txt, y es el objeto de diferencia. =>
Este archivo se llama ref.txt, y es el objeto de referencia. <=
Ambos archivos solo se diferencian en una línea. Así, el símbolo devuelto por SideIndicator indica con claridad qué línea está únicamente presente en función del objeto de referencia o de diferencia.
Si retomamos el ejemplo anterior, agregando el parámetro -IncludeEqual, verá que se muestran otras líneas de los archivos de texto:
PS C:\Windows\system32> Compare-Object -ReferenceObject (Get-Content
C:\Temp\ref.txt) -DifferenceObject (Get-Content C:\Temp\dif.txt)
-IncludeEqual
InputObject ...
Recuperar la información general del equipo
Es posible recuperar la información general del equipo a través del cmdlet Get-ComputerInfo. El conjunto de información devuelto por este cmdlet es una consolidación de diversos elementos que pueden recuperarse a través de consultas WMI: información acerca del hardware (procesador, tarjeta de red, etc.), la BIOS, el sistema operativo, incluyendo su configuración del sistema (nombre, dominio, etc.), y también parámetros regionales (reloj, idioma y región).
Si bien el uso de consultas WMI se explica en la sección Obtener información gracias a las clases WMI, Get-ComputerInfo permite recuperar rápidamente información genérica relativa al sistema, sin necesidad de poseer conocimientos previos acerca de las clases WMI.
Get-ComputerInfo solo permite mostrar información, de modo que puede utilizarse sin ningún parámetro.
Sin embargo, el cmdlet puede recibir un parámetro para filtrar las propiedades devueltas por el cmdlet.
Parámetro |
Descripción |
-Property<String[]> |
Permite recuperar las propiedades correspondientes a la cadena de caracteres especificada. Se admite el uso del carácter comodín * (wildcard). |
He aquí un ejemplo completo de la información que se obtiene con Get-ComputerInfo en una máquina Hyper-V:
PS C:\Users\Administrador> Get-ComputerInfo
WindowsBuildLabEx : 17763.1.amd64fre.rs5_release.180914-1434
WindowsCurrentVersion : 6.3
WindowsEditionId : ServerStandardEval
WindowsInstallationType :...
Las variables de entorno
Como ha visto en el capítulo Las unidades de Windows PowerShell, existe una unidad que permite leer las variables de entorno (Env:). Contiene las variables de entorno propias del sistema operativo y de la sesión del usuario actual.
Estas variables dinámicas y globales al sistema permiten pasar información entre los distintos procesos ejecutados por Windows. Proporcionan información en función de la configuración de Windows en el puesto de trabajo.
Tomemos un ejemplo sencillo, con la variable $env:USERPROFILE: esta variable indica la ruta de acceso al perfil del usuario que tiene la sesión abierta. Si se autentica con otra cuenta de usuario, la ruta de acceso es diferente.
Así, para un script PowerShell que pueda ejecutarse sobre puestos de trabajo con configuraciones completamente diferentes, conviene utilizar siempre que sea posible las variables de entorno.
Estas variables se definen automáticamente cuando se inicia una sesión de PowerShell. Para ver el conjunto de variables de entorno y obtener un resumen, puede ejecutar el siguiente comando:
PS C:\Windows\System32> Get-ChildItem Env:
Name Value
---- -----
ALLUSERSPROFILE C:\ProgramData
APPDATA C:\Users\Administrador\AppData\Roaming
CommonProgramFiles C:\Program Files\Common Files
CommonProgramFiles(x86) C:\Program Files (x86)\Common Files
CommonProgramW6432 C:\Program Files\Common Files
COMPUTERNAME WIN-F750E8ANLO4
ComSpec C:\Windows\system32\cmd.exe ...
Obtener información gracias a las clases WMI
Los objetos WMI permiten buscar información. Información que puede estar vinculada con la máquina (BIOS, configuración del hardware, etc.) y con Windows (configuración, aplicaciones instaladas, etc.), todo ello accesible a través de un único cmdlet: Get-WmiObject.
WMI (Windows Management Instrumentation) es una API (Application Programming Interface) creada en 1998 por Microsoft. Su objetivo es simplificar la administración en un entorno distribuido, para facilitar el intercambio de información en un entorno compuesto de equipos no homogéneos.
La base WMI está compuesta de clases, que representan una familia de elementos. Cada una de estas clases contiene información que es fácil de explotar con Windows PowerShell. También es posible interactuar con el sistema operativo, el hardware y las aplicaciones a través de WMI a través de métodos, aunque este no es el objetivo de este capítulo. Veremos un conjunto de clases y sus propiedades para recuperar información y, a continuación, explotar estos datos en función de sus objetivos.
La lista de clases es extensa, muy extensa; para hacerse una idea, puede ejecutar el siguiente comando:
PS C:\Windows\system32> Get-WmiObject -List
NameSpace: ROOT\cimv2
Name Methods Properties
---- ------- ----------
CIM_Indication {} {CorrelatedIndic
CIM_ClassIndication {} {ClassDefinition
CIM_ClassDeletion {} {ClassDefinition
CIM_ClassCreation {} {ClassDefinition ...
Actualizaciones
Otro aspecto importante en un puesto de trabajo es poder conocer las actualizaciones instaladas. Están todas referenciadas por un número de KB (Knowlegde Base). Microsoft despliega generalmente parches de seguridad el segundo martes de cada mes (Patch Tuesday), con el objetivo de que los administradores informáticos puedan comprobar y validar estos correctivos antes de aplicarlos de manera más generalizada en la infraestructura de una empresa. Sin embargo, Microsoft puede publicar parches de seguridad en cualquier momento.
Tenga en cuenta que las actualizaciones propuestas por Windows Update no lo son solamente para el sistema operativo Windows. Entre ellas podemos encontrar parches de seguridad para la suite Office así como para otros productos.
1. Mostrar las actualizaciones instaladas
Gracias a PowerShell, es fácil recuperar la lista de actualizaciones instaladas. Con un único comando, se muestra diversa información: el identificador de la revisión (número de KB), la cuenta de usuario que ha realizado la actualización, así como la fecha de instalación. Se utiliza el cmdlet Get-HotFix.
He aquí los parámetros:
Parámetro |
Descripción |
-ComputerName<String[]> |
Especifica uno o varios equipos remotos. |
-Credential<PSCredential> |
Especifica una cuenta de usuario que posee permisos para ejecutar esta acción. El valor por defecto es el usuario actual. |
-Description<String[]> |
Obtiene únicamente las revisiones con una descripción concreta. Se admiten los caracteres comodín. |
-Id<String[]> |
Obtiene únicamente las revisiones con los ID de revisión específicos. |
Ejemplo: recupera la lista de KB instaladas en el equipo local
PS C:\Windows\System32> Get-HotFix
Source Description HotFixID InstalledBy InstalledOn
------ ----------- -------- ----------- ----------- ...