Búsqueda de sitios web

Los 10 principales comandos de PowerShell para solucionar problemas


Permítanme comenzar dando algunos antecedentes sobre mí, ya que espero que ayude a darle contexto y legitimidad a esta publicación. Tengo experiencia como desarrollador de software, escribí mi primer código en 1980, pero en 1995 me involucré con productos de una compañía llamada Citrix y he estado solucionando problemas con ellos, o más precisamente, principalmente con las aplicaciones entregadas en encima de ellos, desde entonces.

Esto solía ser un asunto manual que es tedioso, aburrido y propenso a errores, por lo que, siendo la persona inherentemente perezosa que soy, he estado tratando de simplificar, acelerar y automatizar la resolución de problemas siempre que sea posible y práctico, mediante el uso de PowerShell.

Este artículo comparte algunos de mis éxitos en esta área y espero que lo anime a solucionar problemas de manera más eficiente para que tenga más tiempo disponible para cosas divertidas (aunque para mí personalmente, eso a menudo implica más solución de problemas o desarrollo de PowerShell). !

A continuación, presento una lista de los comandos de PowerShell para solucionar problemas que encuentro más útiles y uso con más frecuencia.

Obtener-CimInstance

WMI, o CIM (pronunciado “See Eye Em”) como se transformaron los cmdlets de PowerShell en la versión 3.0, es un método excelente pero simple y genérico para obtener información sobre todo tipo de cosas desde una o más computadoras.

Por ejemplo, puede obtener información detallada sobre procesos, servicios, discos, redes, memoria, procesadores, baterías, etc, etc. Además, algunas empresas, como Citrix, añaden sus propios proveedores WMI para dar acceso a información que de otro modo no estaría disponible. Necesita una API propietaria o un ejecutable para recuperarlos.

Por ejemplo, este comando obtendrá detalles del sistema operativo y la hora de instalación y del último inicio (fig. 1):

Get-CimInstance -ClassName win32_operatingsystem -ComputerName grl-dc03,grl-sql01,grl-sql03 | select PSComputerName,caption,version,installdate,LastBootUpTime | Format-Table -AutoSize

Fig. 1: El comando Get-CimInstance entrega como salida información sobre los sistemas operativos, que se muestran en forma de tabla

Muchos de mis trabajos de consultoría incluyen la verificación del estado de varios componentes. La forma en que recopilo una gran cantidad de información sobre los escritorios y servidores que estoy comprobando, que puedo usar cuando no estoy en el sitio o no tengo acceso a los sistemas del cliente, es usar un script que escribí y que consulta casi cincuenta clases CIM de una lista de computadoras especificadas en la línea de comando o mediante un archivo de texto. Puedes descargar el script de forma gratuita desde mi repositorio de GitHub.

El script escribe los resultados en archivos csv, lo que facilita la comparación de resultados de diferentes máquinas, p. para comprobar la coherencia y ayudar a detectar anomalías.

Evento Obtener-Ganar

Puede haber información increíblemente útil en el registro de eventos de Windows a la hora de solucionar problemas como el inicio de sesión lento.

Pero saber dónde buscar puede ser problemático, ya que en los sistemas operativos recientes hay más de 300 registros de eventos activos diferentes donde se podría ocultar información crucial, no solo en los registros de eventos del sistema o de la aplicación como en los viejos tiempos.

Usando PowerShell, podemos buscar fácilmente eventos específicos

  • a través de identificación
  • en un cierto rango de tiempo
  • que contiene texto específico o
  • Una combinación de lo anterior

lo cual es mucho más fácil, rápido y escalable que ejecutar manualmente el visor de eventos y rastrear una gran cantidad de eventos.

Por ejemplo, aquí se muestra un ejemplo del uso de un argumento de tabla hash, también conocido como diccionario, para recuperar eventos de bloqueo de cuentas en las últimas doce horas desde un controlador de dominio remoto, incluida la computadora desde donde se provocó el bloqueo. (figura 2 y 3):

Get-WinEvent -ComputerName grl-dc03 -FilterHashtable @{LogName = 'Security';Id = 4740;StartTime = (Get-Date).AddHours( -12) } -ErrorAction SilentlyContinue | Select TimeCreated,@{n='User';e={$_.Properties[0].value}},@{n='From';e={$_.Properties[1].Value}}

Fig. 2: El comando Get-WinEvent entrega como salida información sobre los eventos de bloqueo de cuentas en las últimas doce horas desde un controlador de dominio remoto, que se muestran en forma de tabla

Fig. 3: Captura de pantalla de las propiedades del evento de Windows

Observe en el comando cómo usamos la matriz "Propiedades" devuelta por Get-WinEvent para extraer campos específicos de modo que no tengamos que analizar el texto completo de la entrada del registro de eventos (figura 4).

Fig. 4: El comando Get-WinEvent descrito en el texto selecciona solo el primer campo [0] y el segundo [1] del conjunto EventData

Nuevamente, hay un script que uso casi a diario para recuperar todos los eventos de todos los registros de eventos habilitados en un período de tiempo determinado, como el inicio de sesión de un usuario, para buscar pistas/razones de errores o rendimiento lento. Puedes descargarlo desde mi repositorio de GitHub.

Enter-PSSession

Considere el escenario en el que los usuarios de una computadora específica se quejan de un rendimiento deficiente, pero cuando intenta acceder de forma remota a esa máquina con mstsc o similar, su inicio de sesión se bloquea.

¿No sería bueno tener un método de bajo costo para conectarse remotamente a ese dispositivo para la resolución de problemas interactiva o automatizada, como se puede hacer con telnet o ssh a máquinas *nix (por ejemplo, usando la excelente herramienta gratuita PuTTY)?

Al ingresar el comando PowerShell Enter-PSSession se obtiene una interfaz de línea de comando en la computadora remota, es decir, si la comunicación remota de PowerShell está habilitada a través de GPO o manualmente mediante “winrm quickconfig” o Enable-PSRemoting -Force.

Esto permite solucionar y remediar problemas, como buscar los mayores consumidores de CPU o memoria mediante Get-Process (alias ps) y finalizarlos si es apropiado mediante Stop-Process ( alias matar).

Prueba-NetConnection

¿Cómo se prueba si un servidor web específico está en funcionamiento? ¿Silbido? ¡No! Ping simplemente prueba si las respuestas ICMP están habilitadas e indirectamente prueba la resolución de nombres si no se utiliza una dirección IP; no confirma si hay un proceso escuchando en un puerto específico en la máquina remota y los firewalls permiten la conexión.

En los días anteriores a PowerShell, usaba telnet.exe para probar este puerto, pero ahora PowerShell proporciona el comando Test-NetConnection (alias tnc) que permite verificar un puerto específico en una máquina (y también rastrear rutas). ), como se muestra en la figura 5:

Test-NetConnection -ComputerName grl-dc03 -Port 443 -InformationLevel Quiet

Fig. 5: Test-NetConnection se puede utilizar para consultar información sobre un puerto específico en una máquina

Además, debido a que devuelve un objeto PowerShell o un valor booleano, es fácil de incorporar en scripts sin tener que analizar la salida de comandos como ping.exe, lo que solíamos hacer en los viejos tiempos.

Obtener-ADUser

Este es el extraño en esta lista porque no está disponible de forma predeterminada: hay que tener instalado el módulo ActiveDirectory PowerShell, aunque eso es muy sencillo a través de “Add-WindowsFeature RSAT-AD-PowerShell”. comando (ejecutar elevado).

Muchos proveedores tienen módulos PowerShell que le permiten interactuar y automatizar su tecnología; yo uso los de VMware y Citrix a diario, por ejemplo.

Get-ADUser y los cmdlets asociados, como Get-ADGroupMember, nos permiten verificar y cambiar la información de AD y es particularmente útil para consultar una gran cantidad de objetos y producir un informe (ver Exportar-CSV más adelante).

A continuación se muestra un ejemplo de cómo contar cuántas cuentas tienen una unidad de inicio configurada en "H:", que podríamos necesitar si estamos realizando algún mantenimiento; podríamos cambiar la unidad de inicio con la misma facilidad (figura 6):

Get-ADUser -Filter "HomeDrive -eq 'H:'" | Measure-Object

Fig. 6: Get-ADUser se puede utilizar para recuperar fácilmente información sobre los usuarios en Active Directory

También lo encuentro muy útil cuando estoy en sistemas de clientes y no me han dado acceso a usuarios y computadoras de AD, pero necesito verificar las propiedades de un usuario, como la membresía de un grupo.

Obtener proceso

Con frecuencia necesitamos comprobar que se están ejecutando procesos críticos o investigar procesos que no reconocemos. Si bien el Administrador de tareas y SysInternals Process Explorer son herramientas útiles, podemos verificar y solucionar muchos problemas con el cmdlet Get-Process (alias ps).

A continuación se muestra un ejemplo que muestra todos los procesos que se ejecutan desde carpetas que tienen "Citrix" en el nombre, ordenados en tiempos de inicio ascendentes de ese proceso, lo que nos permite determinar si el proceso se inició en el inicio, inicio de sesión del usuario, etc. (figura 7):

Get-process | Where Path -match 'Citrix' | Select Name,Id,StartTime,Path | Sort StartTime | Format-Table -AutoSize

Fig. 7: Get-Process se puede utilizar para filtrar procesos que contienen "Citrix" en su nombre y para mostrar información específica sobre ellos

Aquí hay un comando similar que busca "VMware" en el nombre de la empresa en los recursos de versión de los archivos .exe de todos los procesos en ejecución (figuras 8 y 9):

Get-Process | Get-itemProperty -EA Silent | Select -ExpandProperty VersionInfo | Where CompanyName -match 'VMware' | Select FileVersion,ProductName,FileName

Fig. 8: Get-Process se puede utilizar para filtrar procesos que contienen "VMware" en el nombre de su empresa y para mostrar información específica sobre ellos

Fig. 9: El nombre de la empresa normalmente se puede encontrar en los detalles de propiedad de un archivo .exe en la entrada "Copyright"

Get-ChildItem

Lo más probable es que haya estado usando este comando sin siquiera darse cuenta, especialmente si viene desde un símbolo del sistema, si ha estado usando "dir" en un símbolo del sistema de PowerShell, ya que es un alias para Get-ChildItem.

Como sugiere el nombre, Get-ChildItem nos brinda información sobre los elementos secundarios, sus hijos, etc., si especificamos -recurse, de un padre donde el padre podría estar. una carpeta del sistema de archivos local o remoto, una clave de registro, un almacén de certificados, etc. (sugerencia: ejecute Get-PSDrive para ver qué unidades PowerShell están disponibles).

A continuación se muestra un ejemplo que muestra detalles en la carpeta dada y en los elementos secundarios, incluidos los ocultos que -force habilita, para cualquier archivo que supere los 100 MB de tamaño, ordenados en orden de tamaño descendente.

Get-ChildItem -Force -Recurse -File | Where Length -gt 100MB | Sort Length -Descending | Select fullname, CreationTime, @{n='Size (MB)'; e={[math]::Round($_.Length / 1MB , 2)}}}

Fig. 10: Recuperar detalles en una carpeta determinada y elementos secundarios de cualquier archivo que supere los 100 MB de tamaño, ordenados en orden descendente de tamaño con el comando Get-ChildItem

Consigue ayuda

Este es ligeramente diferente a los demás que he presentado hasta ahora en el sentido de que no ayuda directamente a solucionar problemas, pero lo que sí nos brinda es ayuda detallada, como el uso, los parámetros y ejemplos de cmdlets, que cubren tanto los módulos integrados como los que se pueden usar posteriormente. instalar.

Esto, junto con Get-Command para ver qué comandos se proporcionan con un módulo específico o están relacionados con redes, unidades, etc., permite utilizar comandos desconocidos rápidamente sin tener que recurrir a la búsqueda web favorita. motor.

Normalmente lo uso con -ShowWindow para mostrar la ayuda en una ventana de texto separada y -Online es útil para ir a una página web con la información más reciente que a veces también tiene información adicional. información y enlaces a artículos relacionados.

Recuerde que puede desplazarse por los argumentos disponibles o utilizar el espacio Ctrl para mostrarlos todos y que los autores de scripts como yo agregaremos los comentarios necesarios a nuestros scripts para que Get-Help también funcione con ellos.

Vista fuera de la red

Este cmdlet en Windows PowerShell permite que los datos de objetos generados por cmdlets, funciones o scripts de PowerShell se presenten fácilmente en una vista de cuadrícula en pantalla que luego se puede ordenar y filtrar sin necesidad de instalar ningún software que no sea PowerShell (y .NET).

Incluso puede devolver los elementos seleccionados para su uso posterior en scripts, p. para elegir un elemento de una lista, o simplemente enviarlo al portapapeles (a través del argumento -passthru).

Aquí hay una frase que uso con frecuencia para obtener el archivo de registro de IIS actual en una vista de cuadrícula, de modo que pueda buscar errores, tiempos de respuesta lentos, etc.:

Get-Content -Path "C:\inetpub\logs\logfiles\w3svc3\$(Get-Date -Format 'u_exyyMMdd.lo\g')"|Where-Object { $_ -match '^(\d|#Fields)' } | ForEach-Object { $_ -replace '^#Fields: ' } |ConvertFrom-Csv -Delimiter ' '|Where-Object cs-uri-stem -NotMatch 'monitor.aspx$' |Select-Object -Property *,@{name='Duration';expression={([int]$_.'time-taken')}} |Out-GridView

Fig. 11: El comando Out-GridView le permite formatear los datos que consultó con PowerShell en una cuadrícula clara

Y la figura 12 muestra la línea que seleccioné cuando hice clic en el botón "Aceptar" en la vista de cuadrícula que Set-Clipboard (alias scb) colocó en el portapapeles para que pueda pegarse en mis notas de solución de problemas/verificación de estado (¿qué hace? (Quieres decir, ¡todavía usas lápiz y papel!).

Fig. 12: Salida del comando antes mencionado.

Exportar-CSV

Por último, pero no menos importante, Export-CSV es un cmdlet integrado que nos permite escribir cualquier objeto de PowerShell, como la salida de cmdlets presentados anteriormente como Get-Process, a un archivo CSV con el formato correcto para que puedan examinarse, filtrarse, ordenarse, etc. en Microsoft Excel, Google Sheets o incluso devolverse a PowerShell a través de Import-CSV para su posterior procesamiento.

\\tsclient\c\temp\allprocesses.$env:COMPUTERNAME.csv

Fig. 13: Exportar datos recuperados con PowerShell a un archivo .csv

Tenga en cuenta el uso de -NoTypeInformation, que evita que se envíe una línea de tipos de propiedades al csv, lo que confunde a Excel, aunque se elimina fácilmente. También puedes usar -Append para agregar nuevos objetos a un archivo csv existente, aunque las columnas deben coincidir entre las antiguas y las nuevas.

Utilizo mucho Export-Csv para "informes de pobres", donde los scripts de PowerShell que se ejecutan a través de tareas programadas regulares recopilan datos de varias fuentes, producen archivos CSV y los envían por correo electrónico a las partes "interesadas" a través de Enviar mensaje de correo ( que requiere acceso a un servidor de correo SMTP).

Por último, si estás usando una configuración regional holandesa, probablemente quieras usar -delimiter ';' ya que usan punto y coma en sus archivos de valores separados por comas, un hecho que me tomó ¡Me toma un tiempo descubrir cuándo trabajar para una empresa con sede en Holanda!

Conclusión

Bueno, eso es todo por ahora amigos. Tenga en cuenta: no hay ningún orden en esta lista, que es muy arbitraria, de la misma manera que no habría un orden para las herramientas en la caja de herramientas de su trabajador; si necesita desatornillar un tornillo, es poco probable que saque un martillo. primera opción (a menos que seas Jeremy Clarkson, por supuesto).

¡Feliz solución de problemas!

Artículos relacionados