locked
SPO Powershell - Modifier profil utilisateur - SetSingleValueProfileProperty RRS feed

  • Question

  • Bonjour,

    Contexte = SharePoint Online (Office 365), en tant qu'admin global. J'ai besoin de modifier une propriété de profil pour un lot d'utilisateurs. J'arrive à faire le plus gros, sauf la validation (commit).

    # paramètres à revalider avant lancement 
    $urladmin = "https://TENANT-admin.sharepoint.com/"
    $urlracine = "https://TENANT.sharepoint.com/"
    $userName = "admin@tenant.fr"
    $password = "ppppp"
    $EntreeListeU = "C:\TMP\utilisateurs.csv"
    # ce fichier Entrée ne doit contenir que les identifiants (utilisateur@tenant.fr) à traiter, plus le titre LoginName en première ligne.
    $Propriete = "MasterPageVersion"
    $NouvelleValeur = "2"
    
    # Création de l'environnement
    Import-Module Microsoft.Online.SharePoint.PowerShell -DisableNameChecking;
    #Add references to SharePoint client assemblies and authenticate to Office 365 site - required for CSOM
    Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.dll"
    Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.Runtime.dll"
    Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.UserProfiles.dll"
    
    $securePassword = ConvertTo-SecureString $password –AsPlainText –force
    $Creds = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($username,$securePassword)
    $O365Credential = New-Object System.Management.Automation.PsCredential($username, $securePassword)
    Connect-SPOService –url $urladmin –Credential $O365Credential
    
    $NumberUser = 0
    $allUsers
    #Liste des u_ à traiter
    $allUsers = Import-Csv   $EntreeListeU  -Delimiter ";" -Encoding UTF8
    
    #Create People Manager object to retrieve profile data
    $Context = New-Object Microsoft.SharePoint.Client.ClientContext($urlracine)
    $Context.Credentials = $Creds
    $PeopleManager = New-Object Microsoft.SharePoint.Client.UserProfiles.PeopleManager($Context)
    
    #--- Traitement des Ut.
    Foreach ($User in $allUsers)
    {
           $identifiant = "i:0#.f|membership|"+$User.LoginName
           try
           {
                  $NumberUser = $NumberUser + 1
                  $UserProfile = $PeopleManager.GetPropertiesFor($identifiant)
                  $Context.Load($UserProfile)
                  $Context.ExecuteQuery()
           }
           Catch
           {
                  Write-Host -ForegroundColor white "Retry Suite Erreur, Users :" $NumberUser
                  $UserProfile = $PeopleManager.GetPropertiesFor($identifiant)
                  $Context.Load($UserProfile)
                  $Context.ExecuteQuery()
           }
           #------------- recuperation des propriétés
           If ($UserProfile.Email -ne $null)
           {
               Write-Host -ForegroundColor white "Utilisateur trouvé : " $NumberUser " - " $identifiant      
               # recuperation de la master page version
               $Property ="0"
               $UPP = $UserProfile.UserProfileProperties
               $Property = $UPP[$Propriete]
               Write-Host -ForegroundColor yellow "valeur avant modif :" $Property " - (" $user.loginname ")" 
               # ------------- mise à jour
               $peopleManager.SetSingleValueProfileProperty($identifiant, $Propriete, $NouvelleValeur)
               #Save the profile changes back to the User Profile store            
               $Context.ExecuteQuery()
           }  
    } 

    • le $Context.ExecuteQuery() final ne fonctionne que pour l'utilisateur qui est logué = admin, pour les autres il provoque une erreur : pas d'authorisation sur cette ressource (1)
    • si je mets $urlracine = $urladmin, pas d'erreur, sauf que l'enregistrement final n'est pas fait.

    Merci pour vos conseils.



    mercredi 16 septembre 2015 10:25

Réponses

  • Finalement c'est le "context" qui était mauvais ; il ne faut pas ouvrir la collection racine, mais rester sur le tenant-admin. La solution qui marche est donc

    #Get the Client Context and Bind the Site Collection
    $context = New-Object Microsoft.SharePoint.Client.ClientContext($site)
     
    #Authenticate
    $credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($admin , $password)
    $context.Credentials = $credentials
     
    #Create an Object [People Manager] to retrieve profile information
    $people = New-Object Microsoft.SharePoint.Client.UserProfiles.PeopleManager($context)
    
    # Liste des u_ à traiter
    $allUsers = Import-Csv   $EntreeListeU  -Delimiter ";" -Encoding UTF8
    $allUsers
     
    ForEach($user in $allUsers){
            $identifiant = "i:0#.f|membership|"+$User.LoginName
            $userprofile = $people.GetPropertiesFor($identifiant)
            $context.Load($userprofile)
            $context.ExecuteQuery()
        
        If($userprofile.Email -ne $null) { 
        $userprofile.AccountName
        $people.SetSingleValueProfileProperty($userprofile.AccountName, $Propriete, $NouvelleValeur)
        $context.ExecuteQuery()
        }
    }

    • Marqué comme réponse JF FUSTEC vendredi 25 septembre 2015 07:56
    vendredi 25 septembre 2015 07:55

Toutes les réponses

  • bonjour,

    il faut peut etre elevé les autorisations ..

    $cred = [System.Net.CredentialCache]::DefaultCredentials;

    [System.Net.WebRequest]::DefaultWebProxy.Credentials = $cred

    à la place de

    #$Creds = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($username,$securePassword

    • Proposé comme réponse fred.le.bricoleur mercredi 16 septembre 2015 13:42
    • Non proposé comme réponse JF FUSTEC samedi 19 septembre 2015 06:05
    mercredi 16 septembre 2015 13:07
  • il faut exécuter cettetâche en tant qu'utilisateur qui a une politique avec toutes les autorisations necessaires.     

    • Proposé comme réponse fred.le.bricoleur mercredi 16 septembre 2015 13:42
    • Non proposé comme réponse JF FUSTEC samedi 19 septembre 2015 06:05
    mercredi 16 septembre 2015 13:41
  • Merci, c'est quoi une politique sur Office 365 quand on est admin global ?


    Quand je suis dans le navigateur je tape sur tous les profils utilisateurs sans restriction, je ne comprends pas pourquoi le PS ne reconnait pas mes droits.
    • Modifié JF FUSTEC mercredi 16 septembre 2015 14:13
    mercredi 16 septembre 2015 14:10
  • J'ai testé la proposition :

    $cred = [System.Net.CredentialCache]::DefaultCredentials;

    [System.Net.WebRequest]::DefaultWebProxy.Credentials = $cred

    J'obtiens exactement la même erreur :

    Exception lors de l'appel de «ExecuteQuery» avec «0» argument(s): «Accès refusé. Vous n’êtes pas autorisé à effectuer cette action ou à accéder à cette ressource

    ... quand je modifie un profil autre que le mien.


    • Modifié JF FUSTEC mercredi 16 septembre 2015 21:02
    mercredi 16 septembre 2015 20:58
  • bonjour,

    il faut peut etre

    Configurer OAuth sur HTTP  donc ajouter ces lignes

    $serviceConfig = Get-SPSecurityTokenServiceConfig
    $serviceConfig.AllowOAuthOverHttp = $true
    $serviceConfig.Update()

    jeudi 17 septembre 2015 07:55
  • Get-SPSecurityTokenServiceConfig n'est pas une cmdlet reconnue par SharePoint Online.

    J'aimerais arrêter de bricoler...

    jeudi 17 septembre 2015 09:46
  • utilise cette commande:

    Import-Module -Name OfficeWebApps

    http://technet.microsoft.com/en-us/library/ee890080.aspx

    jeudi 17 septembre 2015 11:50
  • ajoute aussi

    Add-PSSnapin Microsoft.SharePoint.Powershell

    jeudi 17 septembre 2015 12:05
  • Après recherche c'est un problème de visibilité de la propriété. C'est une propriété personnalisée, avec l'attribut Visibility="Moi seul". C'est donc logiquement que Moi seul peut toucher à la valeur de mon profil, et que je ne touche pas à celle des autres. Mais si je passe à la Visibility = "Tout le monde", aucun utilisateur ne peut plus modifier sa valeur par programmation : le message devient "seul un administrateur peut..." (même si je suis admin).

    samedi 19 septembre 2015 06:05
  • Finalement c'est le "context" qui était mauvais ; il ne faut pas ouvrir la collection racine, mais rester sur le tenant-admin. La solution qui marche est donc

    #Get the Client Context and Bind the Site Collection
    $context = New-Object Microsoft.SharePoint.Client.ClientContext($site)
     
    #Authenticate
    $credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($admin , $password)
    $context.Credentials = $credentials
     
    #Create an Object [People Manager] to retrieve profile information
    $people = New-Object Microsoft.SharePoint.Client.UserProfiles.PeopleManager($context)
    
    # Liste des u_ à traiter
    $allUsers = Import-Csv   $EntreeListeU  -Delimiter ";" -Encoding UTF8
    $allUsers
     
    ForEach($user in $allUsers){
            $identifiant = "i:0#.f|membership|"+$User.LoginName
            $userprofile = $people.GetPropertiesFor($identifiant)
            $context.Load($userprofile)
            $context.ExecuteQuery()
        
        If($userprofile.Email -ne $null) { 
        $userprofile.AccountName
        $people.SetSingleValueProfileProperty($userprofile.AccountName, $Propriete, $NouvelleValeur)
        $context.ExecuteQuery()
        }
    }

    • Marqué comme réponse JF FUSTEC vendredi 25 septembre 2015 07:56
    vendredi 25 septembre 2015 07:55