PowerShell: una guía completa – parte 3

Te damos la bienvenida a la parte 3 de 3 de PowerShell: una guía completa. Haz clic en el siguiente enlace para consultar la parte 1 y la parte 2.

En este artículo final combinaremos los conceptos aprendidos hasta ahora y mostraremos algunos usos prácticos de PowerShell. El shell de Microsoft puede hacer que la vida de un administrador de TI sea más sencilla, al permitir administrar su infraestructura con poco esfuerzo. PowerShell es una herramienta muy potente que ayuda a simplificar la administración del servidor, recopilar información sobre el mismo y mostrarla en distintos formatos.

Esta última parte de la guía presentará varios conceptos nuevos. Tómate tu tiempo y examina cada parte detenidamente.

¿Qué software tengo instalado en mi sistema?

Escribe Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* | Select-Object DisplayName, DisplayVersion, Publisher, InstallDate | Format-Table –AutoSize

List Available programs

El comando anterior mostrará las aplicaciones instaladas en tu sistema. Si descompones los comandos, te darás cuenta de que la estructura es bastante compleja:

  • Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*  – Esta parte del comando ordena al PowerShell que busque en HKLM y navegue hasta la ruta \Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall para recopilar todas las propiedades actuales. ¡HKLM es el sistema de archivos de PowerShell para el registro!
  • El resto del comando solamente recopila datos específicos (DisplayName, DisplayVersion, Publisher, InstallDate) y los reproduce en una tabla.

También puedes navegar por el registro directamente desde el shell escribiendo cd HKLM:\ y luego moviéndote por HKLM como con el Símbolo del sistema entre las carpetas de Windows.

¿Qué actualizaciones de Windows están instaladas en mi sistema?

Encontrar información sobre revisiones y actualizaciones (KB) era muy complicado con PowerShell. Microsoft ha introducido recientemente el comando cmdlet Get-Hotfix: una potente herramienta para consultar la infraestructura y averiguar qué parches y actualizaciones de Windows Update están instalados y para verificar si hay una actualización específica presente.

Piensa en el caso en el que se descubre una vulnerabilidad que hace que Microsoft lance un parche de seguridad: para garantizar la protección de la infraestructura, es esencial comprobar que está presente y, si no es así, instalar el parche. Con este cmdlet, una vez que se haya preparado la secuencia de comandos, solo llevará unos minutos producir una lista de servidores vulnerables.

Escribe Get-Hotfix | Format-table -autosize

Get-Hotfix

Esto producirá una lista de las KB instaladas en tu sistema.

Ahora podemos aprovechar la potencia del shell para interactuar con múltiples máquinas. Para hacer esto, presentaremos el PowerShell ISE (integrated scripting environment: entorno de scripting integrado).

Abre PowerShell ISE y escribe lo siguiente en el panel de los scripts. A continuación, pulsa el botón de reproducción para ejecutar el script. Necesitarás un archivo de texto con tus servidores como el creado en la parte 2 de la guía. Como recordatorio, aquí está el contenido que habíamos creado:

test file - hostnames

Ahora escribe en el PowerShell ISE:

$servers =  get-content c:\temp\test.txt
foreach ($server in $servers)
{Get-HotFix -ComputerName $server | Select-Object PSComputername, HOTFIXiD, Installedon  | Sort-Object -Property InstalledOn -Descending}

Introducing ISE

Esto devolverá todas las KB instaladas en los servidores The-Solving-N1, The-Solving-N2 y The-Solving-N3:

Es necesario comprobar si hay una KB específica, por ejemplo KB2977629, y se debe añadir el cmdlet Where-object HotfixID -eq “KB2977629” al script.

Escribe:

$servers =  get-content c:\temp\test.txt
foreach ($server in $servers)
{Get-HotFix -ComputerName $server | Where-object HotfixID -eq “KB2977629” | Select-Object PSComputername, HOTFIXiD, Installedon  | Sort-Object -Property InstalledOn -Descending}

¿Cómo puedo buscar errores en el Visor de eventos?

El Visor de eventos es una herramienta fundamental para descubrir errores del sistema. PowerShell puede mejorar mucho la eficacia de búsqueda en el visor.

Escribe Get-Eventlog system -Newest 30 | Where-Object {$_.entryType -Match “Error”} | format-table -AutoSize

Query Sytem log

El comando que se muestra arriba aparecerá en el registro SISTEMA y mostrará los 30 errores más recientes. Puedes cambiar fácilmente el Visor de eventos a Aplicación o Seguridad.

PowerShell y Active Directory

PowerShell puede interactuar con cualquier subsistema de Windows. Es particularmente útil cuando se utiliza para consultar Active Directory. A continuación encontrarás una selección de scripts interesantes, pero, antes de verlos, deberás comprobar que el módulo de Active Directory esté habilitado en el shell. La forma más sencilla es ejecutar estos comandos en el controlador de dominio, pero si esto no es posible, también puedes agregar el rol a tu sistema, aunque deberá formar parte del dominio desde el que se desea extraer la información.

Escribe Add-WindowsFeature RSAT-AD-PowerShell

Add-WindowsFeature RSAT-AD-PowerShell

Una vez se ha completado la instalación, puedes usar el shell para recopilar información y modificar el dominio de Active Directory. Hazlo con cuidado si estás trabajando en un entorno de producción.

Como la lista de comandos es bastante grande, hemos agrupado por categorías los cmdlets que consideramos más útiles. Siempre puedes ejecutar el comando get-help para obtener más información sobre estos cmdlets.

Consulta de usuarios

Consultar las cuentas de usuario es muy sencillo en PowerShell. Los comandos de la tabla siguiente explican cómo buscar usuarios, identificar aquellos con contraseñas no compatibles, bloqueados, deshabilitados, etc.

Comando PowerShell Qué hace Categoría
Get-ADUser -Filter * -Properties * | where { $_.whenCreated -ge $week } | select Name,whenCreated | Sort Name Usuarios creados en la última semana, ordenados por nombre USERS
Get-ADUser -Filter * -Properties PasswordNeverExpires | where { $_.PasswordNeverExpires -eq $true } | select Name | sort Name Usuarios con contraseña configurada “sin caducidad”, ordenados por nombre USERS
Get-ADUser -Filter “Enabled -eq ‘$false'” | Select Name, UserPrincipalName | Sort name Usuarios con cuentas INACTIVAS, muestra los nombres y los FQN (nombres certificados), ordenados por nombre USERS
Search-ADAccount -AccountDisabled -UsersOnly | FT Name,ObjectClass -A Usuarios con cuentas DESHABILITADAS, muestra los nombres y los FQN, ordenados por nombre USERS
Search-ADAccount -LockedOut | Format-Table name,lastlogondate, lockedout, objectclass, passwordexpired, passwordneverexpires Encuentra usuarios con la cuenta bloqueada USERS
Search-ADAccount -AccountInactive -TimeSpan 90.00:00:00 -UsersOnly |Sort-Object | FT Name,ObjectClass -A Encuentra las cuentas de usuarios que no han sido utilizadas durante 90 días USERS
Get-ADuser -Filter {name -like “*”} -properties *|select @{N=”Account”;E={$_.name}},@{N=”Name”;E={$_.givenname}},@{N=”LastName”;E={$_.surname}},@{N=”Mail”;E={$_.mail}},@{N=”AccountEnabled”;E={$_.enabled}},@{N=”MemberOf”;E={(Get-ADPrincipalGroupMembership $_).name -join (“`r`n”,”,,,,,”)}} | Sort-Object “Account” | FT -AutoSize Grupos de pertenencia para todos los usuarios. Ordena los datos en forma de tabla. Usa Export-CSV para devolver un archivo CSV. USERS
Get-ADUser -Filter * -Properties LastLogonDate | ? { $_.LastLogonDate -eq $null } | Select name,samaccountname

 

Encuentra los usuarios que no han iniciado nunca la sesión USERS

 

 

Consulta de grupos

La pertenencia a un grupo de Active Directory tiene importantes repercusiones en la seguridad. Por esta razón, es muy útil poder determinar rápidamente la presencia en grupos para cada usuario, con el fin de garantizar el cumplimiento de las políticas de seguridad internas.

Comando Qué hace Categoría
get-adgroup -filter * -Properties GroupCategory | Select name, groupcategory | FT -A Todos los grupos presentes en Active Directory GROUPS
Get-ADGroupMember -identity “Administrators” -recursive | select name Todos los usuarios del grupo Administradores de dominio (Domain Administrators) GROUPS
Get-ADPrincipalGroupMembership -identity Turbogeek | Sort-object | FT -property name, samaccountname -AutoSize Encuentra los grupos a los que pertenece un usuario GROUPS
Get-ADGroupMember -Identity Domain Admins” -Recursive | %{Get-ADUser -Identity $_.distinguishedName -Properties Enabled | ?{$_.Enabled -eq $false}} | Select DistinguishedName,Enabled Encuentra los usuarios deshabilitados en el grupo Administradores de dominio GROUPS

 

Consulta de la infraestructura de Active Directory

Estos comandos proporcionan información sobre la infraestructura.

Comando Qué hace Categoría
Get-ADDomainController -Filter * | Format-table name,domain, forest,site, ipv4address, operatingsystem Encuentra el controlador de dominio del dominio DC
Get-ADDomainController -Filter {IsGlobalCatalog -eq $true} | Select-Object Name,ipv4address,isglobalcatalog, operatingsystem | FT -A Encuentra el servidor de catálogo global en el dominio, útil si tienes más de un controlador de dominio DC
Get-ADDomainController -Filter {IsReadOnly -eq $true} Encuentra el controlador de dominio de solo lectura si existe en la infraestructura (Branch Servers) DC
Get-ADComputer -Filter ‘Name -like “The-Solving-N1*”‘ -Properties canonicalName, CN, created, IPv4Address, objectclass, OperatingSystem, OperatingSystemServicePack | FT -A Encuentra el ordenador en el dominio como “The-Solving-N1”, muestra información útil en forma de tabla DC
Get-ADForest | Select-Object -ExpandProperty ForestMode Obtiene el nivel del bosque de Active Directory DC
Get-ADDomain | Select-Object -ExpandProperty domainmode Obtiene el nivel de domino de Active Directory DC
Get-ADReplicationConnection -Filter {AutoGenerated -eq $true} Obtiene detalles sobre la respuesta del dominio. Los datos se devolverán solo si hay más de un controlador de dominio presente. DC
$datecutoff = (Get-Date)
Get-ADComputer -Filter {LastLogonTimestamp -lt $datecutoff} -Properties Name,LastLogonTimeStamp| Select Name,@{N=’LastLogonTimeStamp’; E={[DateTime]::FromFileTime($_.LastLogonTimeStamp)}}
Ejecuta este script desde PowerShell ISE. Configura el $datecutoff y esto indicará el horario del último inicio de sesión de un ordenador. DC

 

Modifica Active Directory

También puedes utilizar PowerShell para modificar el dominio de Active Directory. Usa estos comandos con precaución, especialmente si eres principiante en PowerShell.

Comando Qué hace Categoría
Disable-ADaccount -identity The-Solving Deshabilita la cuenta The-Solving USERS
Enable-ADaccount -identity The-Solving Habilita la cuenta The-Solving USERS
Set-ADAccountExpiriation -Identity The-Solving -datetime “07/01/2019” Configura la cuenta The-Solving para que expire el 7 de enero de 2019 USERS
Clear-ADAccountExpiration -identity The-Solving Deshabilita la fecha de caducidad de la cuenta USERS
Set-ADAccountPassword -identity The-Solving -reset -newpassword (Convertto-Securestring -asplaintext “Passw0rd123!” -Force) Cambia la contraseña de usuario cifrando la transmisión – esencial USERS
Unlock-ADAccount -identity The-Solving Desbloquea la cuenta The-Solving USERS
New-AdGroup -Name “Test Users” -SamAccountName TestUser -GroupCategory Security -GroupScope Global -displayname ‘Test Users’ -Path “OU=Groups, OU=Resources, DC=TEST, DC=UK -Description “All Test Users” Crea un grupo de seguridad llamado Test Users en OU Groups > Resources GROUPS
Set-ADGroup -Identity ‘Test Users’ -groupcategory Distribution -groupscope Universal -Managedby ‘TurboGeek’ Modifica el grupo Test Users y lo convierte en un grupo universal de distribución, administrado por ti GROUPS
search-adaccount -lockedout | unlock-adaccount -passthru -confirm Encuentra y desbloquea todas las cuentas “locked” en Active Directory. Una solución sencilla y eficaz para desbloquear un grupo. USERS

Con esto hemos finalizado nuestra Guía completa de PowerShell. Un viaje corto pero intenso que nos ha llevado a arañar la superficie de esta vasta y potente herramienta que es PowerShell. Sigue atento, pronto saldrán más guías sobre este tema.

Share: Facebook Twitter Linkedin

Comments