rss logo

Microsoft Entra : Comment automatiser les tâches de Microsoft 365 et AzureAD avec PowerShell en activant l'authentification sans mot de passe ?

Microsoft 365 Logo

Dans le milieu professionnel, de plus en plus de services Microsoft sont externalisés vers leurs solutions cloud internes : Microsoft365/Azure/Entra. Cela peut sembler indigeste, mais c'est un fait. L'utilisation de PowerShell pour administrer ces services est presque obligatoire, et pour ouvrir une console d'administration powershell il faut généralement s'authentifier avec un identifiant, un mot de passe et également le logiciel microsoft authenticator. Mais comment exécuter des scripts qui doivent être lancés automatiquement et nécessiteront donc une authentification sans aucune interaction humaine? Eh bien, c'est exactement ce que je vais expliquer dans cet article : comment s'authentifier à ExchangeOnlineManagement et AzureAD avec PowerShell sans mot de passe!

Prérequis

  • Prérequis :
    • .Net : 4.7.2
    • Tls : 1.2

Il faudra s'assurer que l'on dispose d'une version de .Net au moins égale à 4.7.2 et de Tls en version 1.2. Par exemple, à partir d'un serveur Windows 2016, j'ai dû mettre à jour ma version de .Net et activer Tls à 1.2.

  • Afficher la version actuelle de Tls :
PS C:\> [Net.ServicePointManager]::SecurityProtocol Ssl3, Tls
  • Définir la version Tls en 1.2 pour le contexte actuel de la session :
PS C:\> [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 PS C:\> [Net.ServicePointManager]::SecurityProtocol Tls12
  • Alternativement, on pourra exécuter ce script PowerShell afin d'activer Tls 1.2 de façon permanente :
If (-Not (Test-Path 'HKLM:\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v4.0.30319')) { New-Item 'HKLM:\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v4.0.30319' -Force | Out-Null } New-ItemProperty -Path 'HKLM:\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v4.0.30319' -Name 'SystemDefaultTlsVersions' -Value '1' -PropertyType 'DWord' -Force | Out-Null New-ItemProperty -Path 'HKLM:\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v4.0.30319' -Name 'SchUseStrongCrypto' -Value '1' -PropertyType 'DWord' -Force | Out-Null If (-Not (Test-Path 'HKLM:\SOFTWARE\Microsoft\.NETFramework\v4.0.30319')) { New-Item 'HKLM:\SOFTWARE\Microsoft\.NETFramework\v4.0.30319' -Force | Out-Null } New-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\.NETFramework\v4.0.30319' -Name 'SystemDefaultTlsVersions' -Value '1' -PropertyType 'DWord' -Force | Out-Null New-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\.NETFramework\v4.0.30319' -Name 'SchUseStrongCrypto' -Value '1' -PropertyType 'DWord' -Force | Out-Null If (-Not (Test-Path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server')) { New-Item 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server' -Force | Out-Null } New-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server' -Name 'Enabled' -Value '1' -PropertyType 'DWord' -Force | Out-Null New-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server' -Name 'DisabledByDefault' -Value '0' -PropertyType 'DWord' -Force | Out-Null If (-Not (Test-Path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client')) { New-Item 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client' -Force | Out-Null } New-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client' -Name 'Enabled' -Value '1' -PropertyType 'DWord' -Force | Out-Null New-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client' -Name 'DisabledByDefault' -Value '0' -PropertyType 'DWord' -Force | Out-Null

Création d'un certificat auto-signé

Nous aurons besoin d'un certificat comme moyen d'authentification pour nos scripts. Nous allons donc en créer un nouveau sur la machine sur laquelle nous souhaitons lancer nos scripts.

  • Depuis une console PowerShell ouverte avec les droits administrateur, créer un certificat auto-signé, ici valable pour une durée de 10 ans dans le magasin Ordinateur Local\Personnel :
PS C:\> $cert = New-SelfSignedCertificate -CertStoreLocation Cert:\LocalMachine\My -NotAfter (Get-Date).AddYears(10) -Subject "CN=Office365Automation" -KeySpec KeyExchange
  • Utiliser la commande certlm.msc pour ouvrir la console de Gestion de certificats et vérifier la présence du certificat précédement créé :
console de gestionnaire de certificats
  • Exporter le certificat auto-signé vers le fichier mycert.cer dans C:\ :
PS C:\> $cert = Get-ChildItem -Path Cert:\LocalMachine\My | Where-Object { $_.Subject -eq "CN=Office365Automation" } PS C:\> Export-Certificate -Cert $cert -FilePath "C:\mycert.cer"

Microsoft Entra

Page d'authentification Microsoft Entra

Inscription de l'application

  • Chercher le terme inscription d'applications dans la barre de recherche :
Barre de recherche Microsoft Entra
  • Cliquer sur Nouvelle inscription:
Microsoft Entra, menu Inscription d'applications avec nouvelle inscription encadré en rouge
  • Entrer un Nom, choisir Locataire unique et cliquer sur S'inscrire :
Microsoft Entra, menu Inscrire une application
  • Aller dans le menu API autorisées et cliquer sur Ajouter une autorisation :
Microsoft Entra, menu API autorisées avec ajouter une autorisation entouré en rouge
  • Depuis l'onglet API utilisées par mon organisation, rechercher le terme Office 365 Exchange (ou directement l'id: 00000002-0000-0ff1-ce00-000000000000) et cliquer sur Office 365 Exchange Online :
Microsoft Entra, menu demander des autorisations d'api, avec l'entrée Office 365 Exchange encadré en rouge
  • Choisir Autorisation d'applicaiton puis cocher les cases full_access_as_app et Exchange.ManageAsApp puis cliquer sur Ajouter des autorisations :
Microsoft Entra, menu demander des autorisations d'api, Ajouter des autorisations pour Office 365 Exchange
  • Faire de même avec Microsoft Graph (ou directement l'id: 00000003-0000-0000-c000-000000000000):
Microsoft Entra, menu Demander des autorisations d'API, sélectionner l'api Windows Azure Active Directory
  • Rechercher l'autorisation Directory.ReadWrite.All (et Mail.Send si l'on a besoin de pouvoir envoyer des mails depuis notre script), cocher la case associée et cliquer sur Ajouter des autorisations :
Microsoft Entra, menu Demander des autorisations d'API, sélection de l'autorisation Directory.ReadWrite.All permission
  • Depuis le menu API autorisées, cliquer sur Accorder un consentement d'administrateur :
Microsoft Entra, menu API autorisées avec le bouton Accorder un consentement encadré en rouge

Importer le certificat

  • Dans le menu Certificats & secrets, cliquer sur l'onglet Certificats puis sur Télécharger le certificat :
Microsoft Entra, menu certificats et secrets
  • Importer le certificat précédement créé et cliquer sur Ajouter :
Microsoft Entra, menu certificats et secrets, télécharger le certificat
  • Une fois importé, le certificat devrait apparaitre :
vue sur les certificats importés dans le menu certificats et secrets du portail microsoft entra
  • Depuit le menu Vue d'ensemble, récupérer les informations sur ID d'application, ID de l'objet et ID de l'annuaire :
microsoft entra, menu Vue d'ensemble

Microsoft Entra rôles et administrateurs

  • Depuis la barre de recherche, chercher rôles et administrateurs Microsoft Entra :
Recherche du terme rôles et administrateurs, dans la barre de recherche Microsoft Entra
  • Depuis Tous les rôles chercher Administrateur Exchange et éditer le rôle (⚠️cela donnera les droits administrateur complet à l'application pour Exchange, envisagez de donner des droits plus restreints⚠️) :
microsoft entra, menu Tous les rôles
  • Cliquer sur Ajouter des affectations :
microsoft entra, menu Administrateur Exchange, Affectations
  • Chercher le nom de l'Application précédemment créé :
Ajouter des affectations depuis les affectations de microsoft entra
  • Toujours depuis le menu Tous les rôles, chercher Administrateur général (⚠️cela donnera les droits administrateur complet à l'application pour AzureAD, envisager de donner des droits plus restreints⚠️) :
microsoft entra, menu tous les rôles, recherche sur le terme Administrateur général
  • Comme pour le rôle Administrateur Exchange, cliquer sur Ajouter des affectations :
microsoft entra, édition des affectations pour le role Administrateur général
  • Rechercher le nom de l'Application précédemment définie :
microsoft entra, Ajouter des affectations au role

Connexion avec PowerShell

Logo PowerShell

Maintenant que tout a été configuré dans le portail Entra, on peut ouvrir une console PowerShell (avec les droits administrateur) afin de se connecter aux environnements de gestion Exchange Online Management et AzureAd sans mot de passe.

Les Modules PowerShell

  • Installer les modules PowerShell pour ExchangeOnlineManagement et Microsoft Graph :
PS C:\> Install-Module -name ExchangeOnlineManagement PS C:\> Install-Module -name Microsoft.Graph
  • Vérifier que l'on peut importer les modules et entrer la commande powershell.exe -ExecutionPolicy Unrestricted si l'erreur suivante apparait :
PS C:\> Import-Module ExchangeOnlineManagement Import-Module : File C:\Program Files\WindowsPowerShell\Modules\ExchangeOnlineManagement\3.4.0\netFramework\ExchangeOnlineManagement.psm1 cannot be loaded because running scripts is disabled on this system. For more information, see about_Execution_Policies at https:/go.microsoft.com/fwlink/?LinkID=135170. At line:1 char:1 + Import-Module ExchangeOnlineManagement + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : SecurityError: (:) [Import-Module], PSSecurityException + FullyQualifiedErrorId : UnauthorizedAccess,Microsoft.PowerShell.Commands.ImportModuleCommand PS C:\> PowerShell.exe -ExecutionPolicy Unrestricted PS C:\> Import-Module ExchangeOnlineManagement PS C:\> Import-Module Microsoft.Graph

Connexion aux services

  • Récupérer l'empreinte du certificat :
PS C:\> Get-ChildItem -Path Cert:\LocalMachine\My | Where-Object { $_.Subject -eq "CN=Office365Automation" } | Select-Object Thumbprint Thumbprint ---------- 05E5C016FA061E38265D863F04C6CAFC674C84B0
  • Les arguments :
    • CertificateThumbprint : Empreinte du certificat autosigné
    • AppId ou ApplicationId : Application ID
    • Organization or TenantDomain : le nom du compte au format XXX.onmicrosoft.com ou le nom de domaine
  • Se connecter à ExchangeOnline avec les informations précédemment collectées :
PS C:\> Connect-ExchangeOnline -CertificateThumbprint "05E5C016FA061E38265D863F04C6CAFC674C84B0" -AppId "0fe06d0b-XXXXXX-XXXX-XXXX-XXXXXXXXXXXX" -Organization "XXX.onmicrosoft.com" -ShowBanner:$false
  • Se connecter à Microsoft Graph :
PS C:\> Connect-MgGraph -CertificateThumbprint "05E5C016FA061E38265D863F04C6CAFC674C84B0" -ApplicationId "0fe06d0b-XXXXXX-XXXX-XXXX-XXXXXXXXXXXX" -Tenant "XXX.onmicrosoft.com" -NoWelcome

Tests

Une fois connecté, et grace aux droits définis précédemment, on devrait être capable de créer un compte Office365 et définir des droits AzureAD.

  • Par exemple ici, avec la création d'une Boite aux lettres et l'obkgation donnée à l'utilisateur de changer son mot de passe à la première connexion :
PS C:\> New-Mailbox -Name "Jane Doe" -DisplayName "Jane Doe" -MicrosoftOnlineServicesID "jane.doe@STD.onmicrosoft.com" -Password (ConvertTo-SecureString -String "P@ssW0rDSuXX" -AsPlainText -Force) -FirstName "Jane" -LastName "Doe" PS C:\> Set-Mailbox -Identity "Jane Doe" -Office "In Hell To Pay" PS C:\> Update-MgUser -UserId "jane.doe@STD.onmicrosoft.com" -PasswordProfile @{ Password = "P@ssW0rDSuXX"; ForceChangePasswordNextSignIn= $true } -Department "In Hell To Pay" -UsageLocation "FR"
Creative Commons License
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.

Contact :

contact mail address