Teams-Webhooks a través de PowerShell – parte 3
Tarjetas adaptables de Teams: monitoreo de certificados de
con PowerShell
Si usted es uno de los administradores que nunca tuvo problemas o tiempos de inactividad debido a un certificado caducado, entonces tiene mucha suerte o tiene un muy buen control de la gestión de certificados. En muchas empresas surgen de vez en cuando problemas con certificados caducados, cuya validez sólo se comprueba cuando ya han caducado y el servicio ya no es accesible.
Para evitar que esto le suceda (más), le daré un script de PowerShell que verifica los servidores en busca de certificados vencidos. Es cierto que el guión para leer los certificados carece de interés, es casi irrelevante. Porque mucho más interesante e importante es la forma en que se le notifica la caducidad de los certificados. En las partes anteriores de esta serie, le mostré cómo puede enviar fácilmente notificaciones o alertas a los equipos a través de PowerShell (puede leer sobre eso aquí: parte 1, parte 2). Sin embargo, siempre nos centramos en el nivel puramente informativo, que en muchos casos es suficiente. En este artículo quiero mostrarte cómo enviar las llamadas "Tarjetas Adaptativas". Estos tienen la ventaja de que puedes agregar botones a los mensajes, lo que te brinda posibilidades nuevas y elegantes para reaccionar ante las alarmas.
¿La memoria de tu servidor está llena? ¡Ningún problema! ¡Reciba notificaciones a través de PowerShell e implemente un botón para ampliar la memoria! Puedes pulsar este botón desde tu smartphone mientras esperas en la máquina de café o llevas a tu hijo al colegio.
- ¿Quieres convertir automáticamente alertas en tickets? Agregue un botón a la Tarjeta de Teams que le permita crear nuevas entradas en su sistema de tickets a través de una solicitud HTTP y agregar la información del mensaje de Teams.
- ¿Un servidor en Azure se detuvo inesperadamente? Reciba notificaciones y reinícielo con un clic en Teams.
Como puede ver, existen varios casos de uso en los que una respuesta directa del mensaje puede resultar útil. En este artículo, creamos un script que lee los certificados en varios servidores y verifica si caducarán en los próximos 100 días, enviando un mensaje a Teams. Este mensaje tiene un botón que nos llevará directamente a la configuración del certificado del servidor respectivo en el Windows Admin Center, permitiéndonos así realizar cambios.
El mensaje que diseñaremos se ve así:
Ejemplo de mensaje con un botón
Preparación
Nuevamente, necesitamos un canal de Teams que pueda recibir WebHooks. (En las partes anteriores de esta serie de artículos, la configuración se describió con más detalle). Si eres un experto, puedes, por supuesto, diseñar el mensaje de Teams usando JSON. Sin embargo, como se trata de un requisito bastante sencillo, podemos hacernos la vida mucho más fácil: el módulo PSTeams permite diseñar la tarjeta con cmdlets sencillos de PowerShell, para que no tengas que torturarte con JSON. En nuestro caso, por supuesto, todavía se requiere la instalación del Windows Admin Center; pero, por supuesto, eres libre de qué acción quieres reaccionar a la alerta sobre el botón, si no utilizas el WAC. El comando para mostrarnos todos los certificados de un servidor que caducan en los próximos 100 días es:
Get-Childitem Cert: -Recurse -ExpiringInDays 100 |
Select-Object FriendlyName, Issuer, Thumbprint, NotBefore, NotAfter, PSParentPath
Ahora tenemos toda la información que necesitamos para comenzar a diseñar la AdaptiveCard. El código al comienzo del script se ve así:
# Array with Computers, that should be monitored
$TargetComputers = @("Server01")
# TeamsID - URL generated by Teams
$TeamsID = ""
# URL of Windows Admin Center
$WACURL = "<https://localhost:6516/>"
# ModuleCheck: Installs PSTeams if not available
if(-not (Get-Module -ListAvailable PSTeams)) {
Install-Module -Name PSTeams -Force
}
else {
Write-Verbose "PSTeams is already installed."
}
Diseñando la tarjeta Teams con PSTeams
Tres objetos de PSTeams son relevantes para nosotros: Secciones, Hechos y Botones. Las secciones sirven para la delimitación lógica y visual, a ellas están subordinados tanto los hechos como los botones. Los hechos contienen toda la información que queremos mostrar sobre los equipos. Los botones abren sitios web o realizan solicitudes HTTP.
En nuestro caso, los atributos del certificado son hechos. El nombre descriptivo de un certificado, así como la huella digital, etc., se representan como un hecho y se subordinan a una sección. Una sección siempre contiene exactamente un certificado. Un mensaje de equipo siempre se refiere a un solo servidor, por lo tanto, solo necesitamos un botón en toda la tarjeta, lo que nos lleva a la entrada del servidor en el Centro de administración de Windows. Este botón tiene su propia sección.
Así que ahora tenemos que consultar todos los servidores de la matriz "$TargetComputers"; hacemos esto con un bucle foreach, para que podamos obtener los datos del certificado correspondiente del servidor respectivo. inmediatamente después:
$scriptBlock = {
Get-ChildItem Cert:\\LocalMachine -Recurse -ExpiringInDays 100 |
Select-Object FriendlyName, Issuer, Thumbprint, NotBefore, NotAfter, PSParentPath
}
foreach ($computer in $TargetComputers) {
# Getting all certificates of specified computer, that will expire in the next 100 days
[array]$ExpiringCerts = Invoke-Command -ComputerName $computer -Credential $cred -ScriptBlock $scriptBlock
}
La variable $ExpiringCertificates ahora contiene todos los certificados que caducan en los próximos 100 días. Ahora tienes que distribuir esta información en las diferentes secciones como se describe arriba. Para hacer esto, crea una matriz vacía, que llenamos con secciones una por una. Dentro del bucle ForEach ya descrito creamos otro bucle ForEach, que itera sobre todos los certificados, crea una nueva sección por certificado, llena esta sección con los hechos (es decir, los atributos del certificado actual) y luego agrega la sección recién creada a la sección formación. Entonces, al final, ahora tenemos una matriz con toda la información (dividida en Secciones) y podemos enviarla directamente a Teams. Pero antes de eso, creamos una última Sección que contiene el botón del Centro de administración de Windows. Modificamos el enlace que llama el botón para cada servidor, porque en la URL podemos definir qué computadora/servidor se debe abrir en el Centro de administración. Entonces nuestro código ahora se ve así:
# Array with Computers, that should be monitored
$TargetComputers = @("Server01")
# TeamsID - URL generated by Teams
$TeamsID = ""
# URL of Windows Admin Center
$WACURL = "<https://localhost:6516/>"
# ModuleCheck: Installs PSTeams if not available
if(-not (Get-Module -ListAvailable PSTeams)) {
Install-Module -Name PSTeams -Force
}
else {
Write-Verbose "PSTeams is already installed."
}
# Iterating through every computer in $TargetComputers
foreach ($computer in $TargetComputers) {
# Getting all certificates of specified computer, that will expire in the next 100 days
[array]$ExpiringCerts = Invoke-Command -ComputerName $computer -Credential $cred -ScriptBlock {
Get-ChildItem Cert:\\LocalMachine -Recurse -ExpiringInDays 100 |
Select-Object FriendlyName, Issuer, Thumbprint, NotBefore, NotAfter, PSParentPath
}
# Checking, whether there are any certificates expiring in the specified timespan before proceeding
if ($ExpiringCerts.Count -gt 0){
# Creating Sections with embedded Facts (Certificate Information) for Teams
$Sections = @()
foreach ($cert in $ExpiringCerts) {
$facts = @()
$cert |
Get-Member |
Where-Object MemberType -eq NoteProperty |
ForEach-Object {
$facts += New-TeamsFact -Name $_.Name -Value "**$($cert.($_.Name))**"
}
$Sections += New-TeamsSection -ActivityDetails $facts
}
# Gets server-URL within Windows Admin Center and Teams-Button to access it
$WACURLServer = $WACURL + "servermanager/connections/server/" + $computer + "/tools/certificates"
$Button = New-TeamsButton -Name 'Edit Certificates' -Link $WACURLServer -Type 'ViewAction'
$Section = New-TeamsSection -Buttons $Button
# Send Card
$Sections += $Section
$Count = $ExpiringCerts.count
Send-TeamsMessage -URI $TeamsID -Color Red -Sections $Sections `
-MessageTitle "Alert: $count Certificates on $computer expire within the next 100 days!"
}
}
Conclusión
Entonces, cuando ejecutamos este código y hay certificados que vencen en las máquinas, obtenemos la tarjeta de equipo que se muestra arriba. Ahora ha creado sus propias alertas para sus certificados en solo unos minutos ?
Notas adicionales:
Si todos los certificados de su organización se emitieron a través de una CA central, tiene más sentido no consultar cada servidor individual para obtener sus certificados, sino ejecutar una consulta central en la CA. Los 100 días indicados no son una recomendación por mi parte, ya que en mi opinión este número es demasiado grande. Elegí los 100 días sólo con fines de demostración, para tener algunos resultados en cualquier caso. En mi opinión, se recomienda un período de seguimiento de 15 a 30 días, aunque, por supuesto, esto debe evaluarse de forma diferente de un entorno a otro.

