reseau:cloud:azure:configurerapppoursharepoint
Différences
Ci-dessous, les différences entre deux révisions de la page.
| Prochaine révision | Révision précédente | ||
| reseau:cloud:azure:configurerapppoursharepoint [2026/04/05 22:08] – créée techer.charles_educ-valadon-limoges.fr | reseau:cloud:azure:configurerapppoursharepoint [2026/04/10 22:24] (Version actuelle) – [Utilisation d'un certificat] techer.charles_educ-valadon-limoges.fr | ||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| - | ==== Infrastructure réalisée | + | ====== Configurer une application enregistrée dans Entra ID pour gérer une équipe Sharepoint ====== |
| - | Documenso | + | ===== Inscription d'une application ===== |
| - | <WRAP center round info> | ||
| - | La création d’applications pour Microsoft 365, pour accéder aux données et services de Microsoft 365, ou pour permettre aux utilisateurs de se connecter à l' | ||
| - | |||
| - | L' | ||
| Une inscription d’application dans Entra se fait : | Une inscription d’application dans Entra se fait : | ||
| * depuis le **portail Azure**, | * depuis le **portail Azure**, | ||
| * en **CLI/ | * en **CLI/ | ||
| - | </ | + | |
| ===== Installer le module Microsoft.Graph de Powershell===== | ===== Installer le module Microsoft.Graph de Powershell===== | ||
| Ligne 18: | Ligne 14: | ||
| ==== Installer Microsoft.Graph de Powershell ==== | ==== Installer Microsoft.Graph de Powershell ==== | ||
| - | + | | |
| - | | + | |
| * permissions API (Microsoft Graph) : Sites.Selected (Application) | * permissions API (Microsoft Graph) : Sites.Selected (Application) | ||
| - | | + | |
| < | < | ||
| Ligne 35: | Ligne 30: | ||
| * Portail Azure => Entra ID | * Portail Azure => Entra ID | ||
| * Inscription d' | * Inscription d' | ||
| - | * Nom : minio-S3 | + | * Nom : app |
| * Locataire unique seulement | * Locataire unique seulement | ||
| * S' | * S' | ||
| Ligne 42: | Ligne 37: | ||
| * Tenant ID | * Tenant ID | ||
| * Client ID | * Client ID | ||
| - | * Ajouter un secret Client | + | * l' |
| * Ajouter la permission Microsoft Graph : | * Ajouter la permission Microsoft Graph : | ||
| * Autorisations d' | * Autorisations d' | ||
| * Sites.Selected | * Sites.Selected | ||
| - | * Sites.FullControl.All (temporaire pour attribuer l' | ||
| - | * Files.Read.All | ||
| - | * Files.ReadWrite.All | ||
| - | |||
| <WRAP center round> | <WRAP center round> | ||
| - | Les permissions **Files.Read.All** et **Files.ReadWrite.All** donnent l’accès à toutes les bibliothèques pour lesquelles l'App est autorisée, mais la permission **Sites.Selected** restreint l' | + | La permission **Sites.Selected** restreint l' |
| </ | </ | ||
| <WRAP center round info> | <WRAP center round info> | ||
| - | Une autorisation d' | + | Une autorisation d' |
| * L' | * L' | ||
| * Nécessite un consentement administrateur. | * Nécessite un consentement administrateur. | ||
| </ | </ | ||
| - | * Grant admin consent. | + | * Demander le consentement de l'administrateur. |
| - | + | ||
| - | * Adresse email 0365 utilisée pour l’envoi | + | |
| ==== En CLI ==== | ==== En CLI ==== | ||
| Ligne 85: | Ligne 74: | ||
| < | < | ||
| - | $app = New-MgApplication -DisplayName "Minio-Sharepoint" | + | $app = New-MgApplication -DisplayName "Application" |
| </ | </ | ||
| Ligne 94: | Ligne 83: | ||
| </ | </ | ||
| ===== Autoriser l'app enregistrée à mettre à jour les dossiers de l' | ===== Autoriser l'app enregistrée à mettre à jour les dossiers de l' | ||
| - | Cela ne peut se faire depuis l' | + | Cela ne peut pas se faire depuis l' |
| Ligne 103: | Ligne 92: | ||
| < | < | ||
| $cert = New-SelfSignedCertificate ` | $cert = New-SelfSignedCertificate ` | ||
| - | -Subject "CN=minio-s3" ` | + | -Subject "CN=applicaton" ` |
| - | -CertStoreLocation " | + | -CertStoreLocation " |
| -KeySpec Signature ` | -KeySpec Signature ` | ||
| -KeyUsage DigitalSignature ` | -KeyUsage DigitalSignature ` | ||
| - | -KeyExportPolicy | + | -KeyExportPolicy |
| -HashAlgorithm SHA256 ` | -HashAlgorithm SHA256 ` | ||
| -KeyLength 2048 ` | -KeyLength 2048 ` | ||
| -NotAfter (Get-Date).AddYears(4) | -NotAfter (Get-Date).AddYears(4) | ||
| - | |||
| - | $cert.Thumbprint | ||
| - | |||
| - | |||
| - | |||
| </ | </ | ||
| - | * Notez l' | + | * Notez l' |
| < | < | ||
| Ligne 124: | Ligne 108: | ||
| </ | </ | ||
| - | * Vérifier que le certificat est BIEN présent au BON endroit dans Cert:\LocalMachine\My | + | * Vérifier que le certificat est BIEN présent au BON endroit dans Cert:\CurrentUser\My |
| < | < | ||
| - | Get-Item " | + | Get-Item " |
| </ | </ | ||
| Ligne 133: | Ligne 117: | ||
| < | < | ||
| - | $cert = Get-Item " | + | $cert = Get-Item " |
| $cert.HasPrivateKey | $cert.HasPrivateKey | ||
| </ | </ | ||
| Ligne 139: | Ligne 123: | ||
| $cert.HasPrivateKey doit renvoyer True | $cert.HasPrivateKey doit renvoyer True | ||
| - | * exporter le certificat | + | === Export du certificat |
| < | < | ||
| + | Export-Certificate ` | ||
| + | -Cert " | ||
| + | -FilePath " | ||
| + | </ | ||
| - | Export-PfxCertificate ` | + | * importer le certificat dans l' |
| - | -Cert $cert ` | + | |
| - | -FilePath " | + | |
| - | -Password (ConvertTo-SecureString -String " | + | |
| - | </ | + | |
| - | + | ||
| - | | + | |
| < | < | ||
| - | Import-PfxCertificate | + | Connect-MgGraph |
| - | -FilePath | + | -TenantId |
| - | -CertStoreLocation Cert: | + | -ClientId "< |
| - | -Password (ConvertTo-SecureString -String | + | -CertificateThumbprint |
| + | |||
| + | => Résultat attendu | ||
| + | Plain TextWelcome To Microsoft Graph! | ||
| </ | </ | ||
| - | * vérifier | + | |
| < | < | ||
| - | Get-ChildItem Cert:\CurrentUser\My | | + | Get-MgContext |
| - | Where-Object Thumbprint -eq "<THUMBPRINT>" | + | |
| + | => on doit voir : | ||
| + | |||
| + | ClientId | ||
| + | TenantId | ||
| + | Scopes | ||
| + | AuthType | ||
| + | TokenCredentialType | ||
| + | CertificateThumbprint | ||
| </ | </ | ||
| - | * Export du certificat | + | === Exporter le certificat |
| < | < | ||
| - | Export-Certificate ` | + | $thumb = " |
| - | -Cert " | + | |
| - | -FilePath "minio-s3.cer" | + | $cert = Get-Item " |
| + | |||
| + | Export-PfxCertificate ` | ||
| + | -Cert $cert ` | ||
| + | -FilePath "graph-auth.pfx" | ||
| + | -Password (ConvertTo-SecureString -String " | ||
| </ | </ | ||
| - | ==== Installer PowerShell 7 ==== | + | === Importer un PFX sur une autre machine |
| - | ==== Installer le module Microsoft.Graph ==== | + | < |
| - | * prérequis | + | Import-PfxCertificate ` |
| - | * permissions API (Microsoft Graph) : Sites.Selected (Application) | + | |
| + | -CertStoreLocation Cert:\CurrentUser\My ` | ||
| + | -Password | ||
| + | </ | ||
| - | * ouvrir | + | === Générer |
| + | |||
| + | * Recharger le PFX | ||
| < | < | ||
| - | Install-Module Microsoft.Graph | + | $pfxPath = " |
| - | Import-Module Microsoft.Graph | + | $pfxPassword = " |
| + | |||
| + | $cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2( | ||
| + | $pfxPath, | ||
| + | $pfxPassword, | ||
| + | [System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]:: | ||
| + | ) | ||
| </ | </ | ||
| + | * Récupérer la clé privée RSA | ||
| - | * script Powershell pour se conncter t etest la création d'un dossier | + | < |
| + | $rsa = $cert.PrivateKey | ||
| + | </ | ||
| - | <WRAP center round important> | + | * Exporter la clé AU FORMAT PKCS#8 |
| - | Il est important de se connecter en tant qu' | + | |
| - | </ | + | |
| < | < | ||
| - | ############################################################ | + | # Récupère les paramètres |
| - | # CONFIGURATION pour l' | + | $params = $rsa.ExportParameters($true) |
| - | ############################################################ | + | |
| - | $TenantId | + | # Crée un RSA moderne |
| - | $AppId | + | $rsa2 = [System.Security.Cryptography.RSA]:: |
| + | $rsa2.ImportParameters($params) | ||
| - | $Thumbprint | + | # Export PKCS#8 |
| + | $pkcs8 = $rsa2.ExportPkcs8PrivateKey() | ||
| - | $SitePath | + | $base64 |
| - | $NewFolderName = " | + | $pkcs8, |
| + | [System.Base64FormattingOptions]:: | ||
| + | ) | ||
| + | $pem = @" | ||
| + | -----BEGIN PRIVATE KEY----- | ||
| + | $base64 | ||
| + | -----END PRIVATE KEY----- | ||
| + | "@ | ||
| - | $SitePath = "/ | + | $pem | Set-Content ` |
| - | $NewFolderName = "Test-SitesSelected-OK" | + | -Path C: |
| + | | ||
| + | </ | ||
| - | ############################################################ | + | === Résumé .cer .pfx === |
| - | # ÉTAPE 1 – OBTENIR UN TOKEN D’APPLICATION (CLIENT CREDENTIALS) | + | |
| - | ############################################################ | + | |
| - | Write-Host " | + | <WRAP center round info> |
| + | Un fichier .cer contient uniquement la **clé publique du certificat**. Cela permet : | ||
| + | * de déclarer le certificat dans Entra ID | ||
| + | * permet à Microsoft de vérifier les signatures | ||
| - | $cert = Get-Item "Cert: | + | La clé privée est déjà stockée dans Windows : |
| + | * dans **Cert: | ||
| + | * aucun PFX n’est nécessaire tant que l'on se connecte depuis le PC où se trouve la clé privée. En indiquant l' | ||
| - | $assertion = [Microsoft.Identity.Client.ConfidentialClientApplicationBuilder]:: | + | Un fichier |
| - | | + | * de s’authentifier |
| - | WithCertificate($cert). | + | * de signer |
| - | | + | |
| - | $tokenResult = $assertion.AcquireTokenForClient(@(" | + | Un fichier |
| - | | + | * la clé publique |
| + | * la clé privée | ||
| + | * (optionnel) la chaîne de certificats | ||
| + | * et est protégé par une passphrase | ||
| - | $Headers = @{ | + | C’est le seul format portable qui permet : |
| - | | + | * d’importer un certificat avec clé privée |
| - | } | + | * d’authentifier une application sur une autre machine |
| + | * d’utiliser le certificat sur Linux / AWX / Docker / CI/CD | ||
| - | Write-Host "Token d' | + | ^ Format |
| + | |.cer|clé publique|Entra ID, SharePoint| | ||
| + | |.pfx|clé publique + clé privée|Authentification| | ||
| + | |.pfx + mdp|portable sécurisé|Serveur, | ||
| + | </ | ||
| - | ############################################################ | + | ==== Donner accès à l' |
| - | # ÉTAPE 2 – RÉCUPÉRER LE SITE SHAREPOINT PAR SON URL | + | |
| - | ############################################################ | + | |
| - | Write-Host " | + | * l' |
| - | $site = Invoke-RestMethod ` | + | < |
| - | | + | # deconnexion |
| - | -Uri " | + | Disconnect-MgGraph |
| - | -Headers $Headers | + | |
| - | $SiteId = $site.id | + | # Connexion admin |
| + | Connect-MgGraph -Scopes "Sites.FullControl.All" | ||
| - | Write-Host "Site trouvé : $($site.displayName)" | + | # Récupérer le site |
| - | Write-Host "SiteId | + | $site = Get-MgSite -SiteId |
| - | ############################################################ | + | # Donner accès controle total à l' |
| - | # ÉTAPE 3 – ATTRIBUER LA PERMISSION WRITE | + | New-MgSitePermission ` |
| - | ############################################################ | + | |
| + | -Roles " | ||
| + | -GrantedToIdentities @{ | ||
| + | Application = @{ | ||
| + | Id = "ID application" | ||
| + | DisplayName = " | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | * Se reconnecter en AppOnly : | ||
| - | Write-Host "Attribution de la permission WRITE à l' | + | < |
| + | Connect-MgGraph ` | ||
| + | | ||
| + | | ||
| + | | ||
| + | </ | ||
| - | $permissionBody = @{ | + | * Puis Tester l’accès au site précis: |
| - | roles = @(" | + | |
| - | grantedToIdentities = @( | + | |
| - | @{ | + | |
| - | application = @{ | + | |
| - | id = $AppId | + | |
| - | } | + | |
| - | } | + | |
| - | ) | + | |
| - | } | ConvertTo-Json -Depth 5 | + | |
| - | Invoke-RestMethod ` | + | < |
| - | -Method POST ` | + | Get-MgSite |
| - | | + | </code> |
| - | | + | |
| - | -Body $permissionBody ` | + | |
| - | -ContentType " | + | |
| - | Write-Host " | ||
| - | ############################################################ | + | ==== Créer un dossier dans le site SharePoint ==== |
| - | # ÉTAPE 4 – TEST : CRÉATION D’UN DOSSIER DANS SHAREPOINT | + | |
| - | ############################################################ | + | |
| - | Write-Host "Test : création d’un dossier | + | * Identifier le site SharePoint |
| - | $folderBody | + | < |
| - | name = $NewFolderName | + | $site = Get-MgSite -SiteId " |
| - | folder = @{} | + | $site.Id |
| - | } | ConvertTo-Json | + | |
| - | Invoke-RestMethod ` | + | => Afficher le GUID du site du type : |
| - | -Method POST ` | + | xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx |
| - | | + | </code> |
| - | | + | |
| - | | + | |
| - | | + | |
| - | Write-Host " | + | * Récupérer |
| + | < | ||
| + | $drive = Get-MgSiteDrive -SiteId $site.Id | ||
| + | $drive.Id | ||
| + | |||
| + | => Affiche un DriveId | ||
| + | Type : documentLibrary | ||
| </ | </ | ||
| - | * Donner accès à l' | + | * Créer un dossier À LA RACINE (test simple). |
| < | < | ||
| - | Grant-MgSitePermission | + | New-MgDriveRootChild ` |
| + | | ||
| + | | ||
| + | | ||
| + | " | ||
| + | " | ||
| + | | ||
| - | Grant-MgSitePermission ` | ||
| - | -SiteId $site.Id ` | ||
| - | -Roles " | ||
| - | -GrantedToIdentities @{ application = @{ id = " | ||
| + | => Résultat attendu | ||
| + | Id : 01ABCDEF.... | ||
| + | Name : Test-Dossier | ||
| + | => Dossier créé avec succès à vérifier dans SharePoint | ||
| </ | </ | ||
| - | * Tester l’accès avec Microsoft Graph (avec client secret) | + | * lister les dossier à la racine |
| - | Variables requises | ||
| < | < | ||
| - | $tenantId | + | $items = Get-MgDriveRootChild -DriveId |
| - | $clientId | + | |
| - | $clientSecret = "< | + | |
| - | $siteId | + | |
| </ | </ | ||
| - | * Obtenir un token avec l’application | + | * Récupérer le dossier General |
| < | < | ||
| - | $tokenBody | + | $parent |
| - | client_id | + | $parent.Id |
| - | scope = " | + | </ |
| - | | + | |
| - | | + | |
| - | } | + | |
| - | * | + | * création du sous-dossier |
| < | < | ||
| - | $headers = @{ Authorization = " | + | New-MgDriveItemChild ` |
| - | $body = ' | + | -DriveId |
| - | + | -DriveItemId $parent.Id ` | |
| - | Invoke-RestMethod ` | + | -AdditionalProperties |
| - | -Uri "https:// | + | " |
| - | -Headers $headers ` | + | |
| - | -Method POST ` | + | "@microsoft.graph.conflictBehavior" |
| - | -Body $body ` | + | } |
| - | -ContentType | + | |
| </ | </ | ||
| - | |||
| ==== Installer le module module PnP.PowerShell ==== | ==== Installer le module module PnP.PowerShell ==== | ||
| PnP.PowerShell supporte : | PnP.PowerShell supporte : | ||
reseau/cloud/azure/configurerapppoursharepoint.1775419739.txt.gz · Dernière modification : 2026/04/05 22:08 de techer.charles_educ-valadon-limoges.fr
