Use Azure Automation y PowerShell para automatizar las tareas de Office 365

Azure Automation es una de las herramientas más populares para ejecutar scripts de PowerShell en la nube.

No solo puede administrar su entorno de Azure con los runbooks, sino también su inquilino de Microsoft Office 365, por ejemplo.

La automatización es una parte clave de TI y como administrador de sistemas, debe esforzarse por automatizar la mayoría de sus tareas diarias/manuales.

Escribir un guión puede tomar algo de tiempo al principio, pero le ahorrará mucho tiempo a largo plazo.

En este artículo, explicaré cómo configurar su cuenta de Azure Automation y cómo crear su primer runbook de PowerShell en Azure.

Requisitos de automatización de Azure

Solo hay algunos requisitos para comenzar a ejecutar su script de PowerShell en Azure:

  • Suscripción de Azure (pago por uso)
  • Cuenta de automatización de Azure

Puedes empezar con un prueba gratis de la suscripción de Azure, pero una suscripción de pago por uso tampoco es realmente costosa.

Precios de automatización de Azure

El precio de Azure Automation se basa en la cantidad de minutos que se ejecuta un trabajo.

Con cada suscripción, obtiene 500 minutos de tiempo de ejecución de trabajo y 744 horas para los observadores de forma gratuita por mes.

Unidades gratis al mes Precio unidades extra
Tiempo de ejecución del trabajo 500 minutos 0.002€ por minuto
Vigilantes 744 horas 0.002€ por hora

Para darle una idea, una secuencia de comandos simple que verifica el estado de MFA de todos los usuarios en mi inquilino solo toma 1 minuto.

Crear un sitio de grupo de SharePoint y aplicarle una plantilla lleva 30 segundos en total.

Entonces, con los 500 minutos gratis, deberías poder automatizar la mayoría de tus tareas diarias 😉 Y cada hora más cuesta solo 0.12€.

Introducción a Azure Automation

Para comenzar con Azure Automation, necesitaremos crear un Cuenta de Azure Automation e instalar el correcto Módulos de PowerShell.

  1. Inicie sesión en el Portal Azure

    Vaya a https://portal.azure.com/ e inicie sesión con sus credenciales de Office 365.

  2. Ir a Servicios de cuentas de automatización

    Use la barra de búsqueda para encontrar los servicios de cuentas de automatización

  3. Crear una nueva cuenta de automatización

    Haga clic en Crear para crear una nueva cuenta de automatización.
    – Déle un nombre a su cuenta de automatización
    – Seleccione su suscripción (prueba gratuita o pago por uso)
    – Crear o seleccionar un grupo de recursos

    Pueden pasar un par de minutos hasta que se cree el grupo de recursos.

    Cuenta de automatización de Azure

  4. Abra su cuenta de automatización de Azure

    Seleccione su nueva cuenta de automatización después de crearla.

  5. Instalar módulos de PowerShell

    Antes de que podamos comenzar a crear nuestro primer runbook, primero debemos instalar los módulos de PowerShell necesarios.

    Seleccione módulos y haga clic en Examinar galería

    Instale los siguientes módulos:

    – PnP.PowerShell
    – Azure AD
    – Gestión en línea de Exchange

    módulos de instalación de automatización azul

Ahora hemos creado nuestra cuenta de Azure Automation y podemos comenzar con la creación de nuestro primer Runbook.

Autenticación en Azure Runbook al usar MFA

La autenticación en Azure Runbooks siempre es un desafío. Podría excluir los servicios de Azure de MFA con reglas de acceso condicional, pero eso requeriría que se mantuviera actualizado con todas las direcciones IP.

Otra opción sería excluir la cuenta de servicio de MFA, pero esa no es una buena práctica.

Las cuentas de servicio pueden tener derechos de administrador global, por lo que desea proteger esas cuentas adecuadamente.

Entonces, ¿cómo se autentica en AzureAD o Exchange Online en un Azure Runbook? Bueno, podemos usar la cuenta Azure Run As.

Durante la creación de nuestra cuenta de Azure Automation automáticamente también creamos un Ejecutar como cuenta.

La cuenta Run As proporciona autenticación para Azure Runbooks, Automation y administración de recursos en Azure Resource Manager mediante un certificado autofirmado.

Nota

El certificado solo es válido por un año. Tendrá que asegurarse de que usted renovar el certificado antes de que caduque.

Vamos a asignar a la cuenta Ejecutar como el permisos correctos para acceder a AzureAD, Exchange Online y SharePoint.

Para empezar, primero tenemos que encontrar el ID de objeto de la cuenta

  1. Seleccione Ejecutar como cuentas en tus Cuenta de automatización de Azure.
  2. Nota la Id. de objeto principal de servicio

Vamos a agregar los permisos correctos uno por uno. Puedes encontrar el guión completo. eso establecerá todos los permisos en una sola ejecución.

Conexión a AzureAD desde un Azure Runbook

Primero otorgaremos a nuestra cuenta principal de servicio el permiso correcto para acceder a AzureAD.

Asegúrese de tener el módulo AzureAD instalado localmente y abra PowerShell.

Primero conéctese a Azure AD y reemplace la identificación del objeto de la entidad de servicio con su propia identificación del objeto.

# Connect to Azure AD
Connect-AzureAD

# Get the Service Principal based on the object Id
$servicePrincipalObjectId = "6dgw124-0000-1111-1337-abc123def456"

Si solo necesita leer datos de AzureAD, puede otorgar a la entidad de servicio la función Lector de directorio.

Add-AzureADDirectoryRoleMember -ObjectId (Get-AzureADDirectoryRole | where-object {$_.DisplayName -eq "Directory Reader"}).Objectid -RefObjectId $servicePrincipalObjectId

Otra opción es convertirlo en Administrador global para que pueda administrar completamente su Active Directory:

Add-AzureADDirectoryRoleMember -ObjectId (Get-AzureADDirectoryRole | where-object {$_.DisplayName -eq "Company Administrator"}).Objectid -RefObjectId $servicePrincipalObjectId

Puede enumerar todos los roles disponibles en su inquilino con el siguiente cmd

Get-AzureADDirectoryRole

Ahora puede conectarse a AzureAD con el siguiente código en sus Runbooks de PowerShell.

# Get the service principal connection details
$spConnection = Get-AutomationConnection -Name AzureRunAsConnection

# Connect AzureAd
Connect-AzureAD -TenantId $spConnection.TenantId -ApplicationId $spConnection.ApplicationID -CertificateThumbprint $spConnection.CertificateThumbprint | No-Output

# Test connection:
"User count:" 
(Get-AzureADUser).count

Conéctese a Exchange Online desde un Azure Runbook

Se necesita un paso adicional para otorgar a la cuenta principal de servicio acceso a Exchange Online. Tenemos que darle el rol de Administrador de Exchange y los permisos de API apropiados.

# Connect to Azure AD
Connect-AzureAD

# Get the Service Principal based on the object Id
$servicePrincipalObjectId = "6dgw124-0000-1111-1337-abc123def456"

# Assign the Exchange Administrator Role
Add-AzureADDirectoryRoleMember -ObjectId (Get-AzureADDirectoryRole | where-object {$_.DisplayName -eq "Exchange Administrator"}).Objectid -RefObjectId $servicePrincipalObjectId

Si no tiene la función de administrador de Exchange en su arrendatario, puede habilitarla con el siguiente código:

if (Get-AzureADDirectoryRole | where-object {$_.DisplayName -eq "Exchange Administrator"} -eq $null) { 
	Enable-AzureADDirectoryRole -RoleTemplateId (Get-AzureADDirectoryRoleTemplate | Where-Object {$_.DisplayName -eq "Exchange Administrator"}).Objectid
}

Para los permisos de la API de Exchange Online podemos usar el siguiente código:

# Get the Office 365 Exchange Online App
$EXOApp = (Get-AzureADServicePrincipal -Filter "AppID eq '00000002-0000-0ff1-ce00-000000000000'")
$servicePrincipal = Get-AzureADServicePrincipal -ObjectId $servicePrincipalObjectId

# Get the roles
$permission = $EXOApp.AppRoles | Where-Object { $_.Value -eq 'Exchange.ManageAsApp' }

# Create the permission object
$apiPermission = [Microsoft.Open.AzureAD.Model.RequiredResourceAccess]@{
    ResourceAppId  = $EXOApp.AppId ;
    ResourceAccess = [Microsoft.Open.AzureAD.Model.ResourceAccess]@{
        Id   = $permission.Id ;
        Type = "Role"
    }
}
$Application = Get-AzureADApplication | Where-Object {$_.AppId -eq $servicePrincipal.AppId}
$Application | Set-AzureADApplication -ReplyUrls 'http://localhost'
$Application | Set-AzureADApplication -RequiredResourceAccess $apiPermission

Todo lo que necesitas hacer ahora es conceder el consentimiento del administrador por los permisos que le hemos asignado.

  1. Abre tu Directorio activo de Azure
  2. Elegir registros de aplicaciones
  3. Haga clic en Todas las aplicaciones y seleccione su cuenta de Automatización
  4. Ir Permisos de API
  5. Hacer clic Otorgar consentimiento de administrador
otorgar consentimiento de administrador azure api

Tu puedes ahora conectarse a Exchange en línea en su Azure Runbook con el siguiente código de PowerShell:

# Get the service principal connection details
$spConnection = Get-AutomationConnection -Name AzureRunAsConnection

# Set your tenant name
$tenantName = "contoso.onmicrosoft.com"

# Connect to ExchangeOnline
Connect-ExchangeOnline -CertificateThumbprint $spConnection.CertificateThumbprint -AppId $spConnection.ApplicationID -Organization $tenantName

# Test connection
(Get-ExoMailbox).count

Conéctese a SharePoint/PnPOnline desde Azure Runbook

Si desea usar PnPOnline en su Azure Runbook, deberá otorgar acceso a la API de SharePoint y tal vez incluso a Graph.

Uso un par de permisos para crear automáticamente sitios de SharePoint y aplicar plantillas con carpetas predeterminadas.

Es posible que no necesite todos los permisos, pero esto le da una idea de cómo configurarlos.

# Get Office 365 SharePoint Online App
$spApp = (Get-AzureADServicePrincipal -Filter "AppID eq '00000003-0000-0ff1-ce00-000000000000'")

# Get the roles
# All sites full control
$spSitesControl = $SPApp.AppRoles | Where-Object { $_.Value -eq 'Sites.FullControl.All' }

# User read write
$spUserControl= $SPApp.AppRoles | Where-Object { $_.Value -eq 'User.ReadWrite.All' }

# TermStore
$spTermControl= $SPApp.AppRoles | Where-Object { $_.Value -eq 'TermStore.ReadWrite.All' }

# NOTE: If you format the code below nicely, and copy-paste it, it will make typeID from the Id attribute :s

$spPermission = [Microsoft.Open.AzureAD.Model.RequiredResourceAccess]@{
    ResourceAppId  = $spApp.AppId ;
    ResourceAccess = [Microsoft.Open.AzureAD.Model.ResourceAccess]@{Id   = $spSitesControl.Id;Type = "Role";},
				[Microsoft.Open.AzureAD.Model.ResourceAccess]@{Id   = $spUserControl.Id;Type = "Role";},
				[Microsoft.Open.AzureAD.Model.ResourceAccess]@{Id   = $spTermControl.Id ;Type = "Role";}
}

$Application = Get-AzureADApplication | Where-Object {$_.AppId -eq $servicePrincipal.AppId}
$Application | Set-AzureADApplication -ReplyUrls 'http://localhost'
$Application | Set-AzureADApplication -RequiredResourceAccess $spPermission

Nuevamente, deberá otorgar el consentimiento del administrador para los permisos:

  1. Abre tu Directorio activo de Azure
  2. Elegir registros de aplicaciones
  3. Haga clic en Todas las aplicaciones y seleccione su cuenta de Automatización
  4. Ir Permisos de API
  5. Hacer clic Otorgar consentimiento de administrador

Para conectarse a PnPOnline, puede usar el siguiente código en su Azure Runbook:

# Get the service principal connection details
$spConnection = Get-AutomationConnection -Name AzureRunAsConnection

# Connect to PnPOnline
Connect-PnPOnline -ClientId $spConnection.ApplicationID -Url "https://contoso.sharepoint.com" -Tenant contoso.onmicrosoft.com -Thumbprint $spConnection.CertificateThumbprint

# Test connection
(get-pnptenantsite).count

También necesitaba acceso a Graph, así que agregué los permisos de API para eso también para:

#
# Get Graph App
#
$graphApp = (Get-AzureADServicePrincipal -Filter "AppID eq '00000003-0000-0000-c000-000000000000'")

# Group read write
$graphGroupControl = $graphApp.AppRoles | Where-Object { $_.Value -eq 'Group.ReadWrite.All' }

# User read write
$graphUserControl = $graphApp.AppRoles | Where-Object { $_.Value -eq 'User.ReadWrite.All' }

# NOTE: If you format the code below nicely, and copy-paste it, it will make typeID from the Id attribute :s
$graphPermission = [Microsoft.Open.AzureAD.Model.RequiredResourceAccess]@{
    ResourceAppId  = $graphApp.AppId ;
    ResourceAccess = [Microsoft.Open.AzureAD.Model.ResourceAccess]@{Id   = $graphGroupControl.Id;Type = "Role";},
				[Microsoft.Open.AzureAD.Model.ResourceAccess]@{Id   = $graphUserControl.Id;Type = "Role";}
}

$Application = Get-AzureADApplication | Where-Object {$_.AppId -eq $servicePrincipal.AppId}
$Application | Set-AzureADApplication -ReplyUrls 'http://localhost'
$Application | Set-AzureADApplication -RequiredResourceAccess $graphPermission

Nuevamente, otorgue el consentimiento del administrador en Azure AD.

Si ha conectado PnPOnline, puede obtener fácilmente un token de acceso para conectarse a Graph:

# User Graph
$accessToken = Get-PnPAccessToken

$header = @{
  "Content-Type" = "application/json"
  Authorization = "Bearer $accessToken"
}

# Get users to test Graph
Invoke-RestMethod -Uri "https://graph.microsoft.com/v1.0/users/" -Method Get -Headers $header

El resultado con todos los permisos en Azure Active Directory debería verse así:

otorgar permiso a azure api

También puede agregar los permisos en Azure Portal a su cuenta principal de servicio.

Esto puede ser más conveniente si no conoce el nombre de permiso exacto que está buscando.

En el directorio activo de Azure:

  1. Elegir registros de aplicaciones
  2. Haga clic en Todas las aplicaciones y seleccione su cuenta de Automatización
  3. Ir Permisos de API
  4. Hacer clic Agregar un permiso
  5. Elegir la API que necesita, por ejemplo, SharePoint
  6. Seleccione Permisos de aplicación y seleccione los permisos que necesita.
Permisos de la API de Azure

Uso de variables en Runbooks de Azure Automation

Antes de comenzar con la creación de nuestro primer Runbook, primero veremos el uso de variables.

Puede definir variables globales en su cuenta de Automatización que puede usar y cambiar en sus Runbooks.

Puede crear diferentes tipos de variables y también se pueden cifrar.

Si se desplaza hacia abajo en su cuenta de Azure Automation, encontrará las variables en Recursos compartidos.

  1. Abierto Variables
  2. Haga clic en Agregar una variable
  3. Dale a tu variable un nombre
  4. Elegir la escribe (cadena, booleano, fecha y hora, entero, no especificado)
  5. Introduce el valor
  6. Elegir encriptado O no
Variables de automatización de Azure

Creación de un Runbook de Azure

Con la cuenta de Azure Automation configurada y todos los permisos asignados, podemos comenzar a crear nuestro primer Runbook.

En su cuenta de Azure Automation, encontrará Manuales. Ya hay un par de runbooks de Tutorial en su cuenta, pero vamos a crear uno nuevo.

  1. Haga clic en Crear un Runbook
  2. Dale a tu runbook un nombre significativo
  3. Seleccione PowerShell por Tipo de runbook y tal vez una descripción que describa lo que hace el runbook.
  4. Haga clic en Crear
Cree un nuevo runbook de PowerShell en Azure Automation

En este ejemplo, vamos a crear un Runbook que deshabilita la autenticación SMTP para todos los usuarios, excepto un par de cuentas de aplicaciones.

Si desea obtener más información sobre cómo proteger su inquilino de Office 365, asegúrese de leer estos consejos.

Su nuevo Runbook se abre y es básicamente un script de PowerShell en blanco.

En el lado izquierdo, encontrará una descripción general de los CMDlets disponibles, una lista de sus Runbooks (puede activar otros runbooks desde su runbook) y activos.

Los activos pueden ser variables que haya declarado en su cuenta de automatización, conexiones, credenciales almacenadas y certificados.

Para deshabilitar la Autenticación SMTP vamos a conectarnos a Exchange Online. Para hacer esto, necesitaremos Azure Run As Connection y el nombre del arrendatario que agregué a una variable.

Editar runbook de automatización de Azure

Ahora podemos conectarnos a Exchange Online con el siguiente código si ha configurado los permisos como se describe al principio:

# Get the automation account and tenant name
$spConnection  = Get-AutomationConnection -Name 'AzureRunAsConnection'
$tenantName    = Get-AutomationVariable -Name 'tenantName'

# Connect to ExchangeOnline
Connect-ExchangeOnline -CertificateThumbprint $spConnection.CertificateThumbprint -AppId $spConnection.ApplicationID -Organization $tenantName

$exclusions = @("sa_signatureTool",
                "sa_otherImportantTool"
                )

$mailboxes = Get-CASMailbox | Where-Object {$_.SmtpClientAuthenticationDisabled -ne $true -and $_.Identity -notin $exclusions}

$mailboxes

foreach ($mailbox in $mailboxes) {
    try {
        Set-CASMailbox -Identity $mailbox.Identity -SmtpClientAuthenticationDisabled $true

        [PSCustomObject]@{
            UserPrincipalName  = $mailbox.Identity
            SmtpClientAuthenticationDisabled = $true
        }
    }
    catch {
        [PSCustomObject]@{
            UserPrincipalName = $mailbox.Identity
            SmtpClientAuthenticationDisabled = $false
        }
    }
}

# Close the connection
Disconnect-ExchangeOnline -Confirm:$false

Antes de publicar el runbook, puede probarlo primero en el Panel de prueba.

Esto es realmente útil al editar Runbooks existentes, puede probar su edición antes de publicarla, manteniendo la versión en vivo en funcionamiento.

Calendario de automatización de Azure

Puede programar su runbook para que se ejecute automáticamente en un intervalo establecido.

Después de haber publicado su runbook, haga clic en Enlace al horario

programar runbook

Haga clic en Vincular un horario a su runbook para seleccionar (o crear) una programación para su Azure Runbook.

Se puede usar un programa para varios runbooks en su cuenta de Azure Automation.

Tenemos que crear nuestro primer horario:

  1. Haga clic en Agregar un horario
  2. Dale a tu horario un nombre
  3. Selecciona el fecha y hora de inicio
  4. Hazlo periódico (o ejecutarlo solo una vez)
  5. Haga clic en Crear
cronograma de automatización azul

Una vez que haya creado la programación, haga clic en Aceptar para aplicar la programación a su runbook.

Puede agregar múltiples programaciones a su Runbook si lo desea.

Su runbook ahora debería ejecutarse automáticamente de acuerdo con el programa que ha creado.

Verá una descripción general de los trabajos en la pantalla de descripción general del runbook.

Terminando

Cuando esté creando runbooks, siempre asegúrese de cerrar las conexiones cuando finalicen los trabajos.

De lo contrario, puede terminar usando todas las conexiones a Exchange Online, por ejemplo.

Espero que este artículo lo haya ayudado a comenzar a crear sus Azure Runbooks y/o configurar la autenticación en Office 365.

Si tiene alguna pregunta, simplemente deje un comentario a continuación.

Otros artículos relacionados

Cómo agregar o configurar MailboxFolderPermission con PowerShell

Cómo agregar o configurar MailboxFolderPermission con PowerShell

En Exchange Online podemos compartir buzones completos con otros usuarios. Pero, ¿qué sucede si desea compartir solo una carpeta? ¿O ...
Leer Más
GUI de PowerShell - Cómo empezar

GUI de PowerShell – Cómo empezar

He creado muchos scripts de PowerShell durante los últimos años. Todo con un solo propósito para automatizar mi trabajo de ...
Leer Más
Use Azure Automation y PowerShell para automatizar las tareas de Office 365

Use Azure Automation y PowerShell para automatizar las tareas de Office 365

Azure Automation es una de las herramientas más populares para ejecutar scripts de PowerShell en la nube. No solo puede ...
Leer Más
Cómo crear un nuevo usuario local con PowerShell

Cómo crear un nuevo usuario local con PowerShell

Cuando necesite crear un usuario local en Windows 10 u 11, puede usar el panel de control de Cuentas de ...
Leer Más
PSDrive - Cómo usar la alternativa PowerShell Net Use

PSDrive – Cómo usar la alternativa PowerShell Net Use

Todos conocemos el comando Net Use que podemos usar para mapear unidades de red desde la línea de comandos. Aunque ...
Leer Más
Cómo crear un perfil de PowerShell

Cómo crear un perfil de PowerShell

¿Quiere sacar más partido a su PowerShell? Luego, asegúrese de configurar su perfil de PowerShell para mejorar su consola de ...
Leer Más

Deja un comentario