Microsoft Entra : Comment automatiser les tâches de Microsoft 365 et AzureAD avec PowerShell en activant l'authentification sans mot de passe ?
- Mise à jour le 21 sept. 2024
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éé :

- 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
- Se connecter depuis l'adresse https://entra.microsoft.com, au portail Microsoft Entra avec un compte administrateur :

Inscription de l'application
- Chercher le terme inscription d'applications dans la barre de recherche :

- Cliquer sur Nouvelle inscription:

- Entrer un Nom, choisir Locataire unique et cliquer sur S'inscrire :

- Aller dans le menu API autorisées et cliquer sur Ajouter une autorisation :

- 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 :

- Choisir Autorisation d'applicaiton puis cocher les cases full_access_as_app et Exchange.ManageAsApp puis cliquer sur Ajouter des autorisations :

- Faire de même avec Microsoft Graph (ou directement l'id: 00000003-0000-0000-c000-000000000000):

- 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 :

- Depuis le menu API autorisées, cliquer sur Accorder un consentement d'administrateur :

Importer le certificat
- Dans le menu Certificats & secrets, cliquer sur l'onglet Certificats puis sur Télécharger le certificat :

- Importer le certificat précédement créé et cliquer sur Ajouter :

- Une fois importé, le certificat devrait apparaitre :

- 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 rôles et administrateurs
- Depuis la barre de recherche, chercher rôles et administrateurs 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⚠️) :

- Cliquer sur Ajouter des affectations :

- Chercher le nom de l'Application précédemment créé :

- 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⚠️) :

- Comme pour le rôle Administrateur Exchange, cliquer sur Ajouter des affectations :

- Rechercher le nom de l'Application précédemment définie :

Connexion avec 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"