【问题标题】:Getting ALL users from SharePoint online tenant and set userprofile property via Powershell从 SharePoint 在线租户获取所有用户并通过 Powershell 设置 userprofile 属性
【发布时间】:2016-04-20 03:28:57
【问题描述】:

更新:

Vadim 在下面有一个很好的答案,但我就是这样做的:

namespace UserProfile.Manipulation.CSOM.Console
{
    class Program
    {
        static void Main(string[] args)
        {
            searchAllUsers();

        }

        private static void searchAllUsers()
        {
            string siteCollectionUrl = "https://tenant.sharepoint.com/sites/intranet";
            string tenantAdminLoginName = "adminlogin";
            string tenantAdminPassword = "Password";

            using (ClientContext clientContext = new ClientContext(siteCollectionUrl))
            {
                SecureString passWord = new SecureString();

                foreach (char c in tenantAdminPassword.ToCharArray()) passWord.AppendChar(c);

                clientContext.Credentials = new SharePointOnlineCredentials(tenantAdminLoginName, passWord);

                KeywordQuery keywordQuery = new KeywordQuery(clientContext);
                keywordQuery.QueryText = "*";
                keywordQuery.SourceId = new Guid("B09A7990-05EA-4AF9-81EF-EDFAB16C4E31");
                keywordQuery.TrimDuplicates = false;


                keywordQuery.RowLimit = 500;
//startrow changed 3 times since 500 limitations.
                keywordQuery.StartRow = 1001;

                SearchExecutor searchExecutor = new SearchExecutor(clientContext);
                ClientResult<ResultTableCollection> results = searchExecutor.ExecuteQuery(keywordQuery);
                clientContext.ExecuteQuery();

                foreach (var resultRow in results.Value[0].ResultRows)
                {
                    SetSingleValueProfileProperty(resultRow["AccountName"].ToString());

                }

            }

        }

        private static void SetSingleValueProfileProperty(string accountName)
        {

            string tenantAdministrationUrl = "https://tentnatname-admin.sharepoint.com";
            string tenantAdminLoginName = "adminlogin";
            string tenantAdminPassword = "password";

            string UserAccountName = accountName;

            using (ClientContext clientContext = new ClientContext(tenantAdministrationUrl))
            {
                SecureString passWord = new SecureString();

                foreach (char c in tenantAdminPassword.ToCharArray()) passWord.AppendChar(c);

                clientContext.Credentials = new SharePointOnlineCredentials(tenantAdminLoginName, passWord);

                PeopleManager peopleManager = new PeopleManager(clientContext);

                peopleManager.SetSingleValueProfileProperty(UserAccountName, "SPS-PicturePlaceholderState", "1");

                clientContext.ExecuteQuery();
            }
        }


    }

}

我需要为租户内的所有用户配置文件设置一个属性。

似乎无法通过 CSOM 和 powershell 从“UPA”获取所有用户配置文件!?

它可能(理论上)循环遍历所有站点集合并将所有用户添加到某个数组中,然后只从该数组中选择唯一的(以删除重复项):

$sites = Get-SPOSite | select *
foreach ($site in $sites) {

Get-SPOUser -Site $site

...等等

然后循环遍历该数组并使用 csom:

$pMAn = New-Object Microsoft.SharePoint.Client.UserProfiles.PeopleManager($context)

$userProfile = $pMan.GetPropertiesFor($user.LoginName)
$ctx.Load($userProfile)

$ctx.ExecuteQuery()
$pMan.SetSingleVlueProfileProperty($userProfile.AccountName, "property", $value)

$ctx.ExecuteQuery()

谁能想到更聪明的解决方案?

【问题讨论】:

    标签: sharepoint sharepoint-2013 sharepoint-online


    【解决方案1】:

    正如您所提到的,没有直接的方法可以使用 SharePoint Online CSOM API 在 SharePoint 租户中获取所有用户配置文件。但您可以考虑以下方法:

    示例

    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"
    
    
    
    Function Get-SPOContext([string]$Url,[string]$UserName,[string]$Password)
    {
       $context = New-Object Microsoft.SharePoint.Client.ClientContext($Url)
       $context.Credentials = Get-SPOCredentials -UserName $UserName -Password $Password
       return $context
    }
    
    
    Function Get-SPOCredentials([string]$UserName,[string]$Password)
    {
       $SecurePassword = $Password | ConvertTo-SecureString -AsPlainText -Force
       return New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($UserName, $SecurePassword)
    }
    
    
    
    Function Print-UserProfileInfo([Microsoft.SharePoint.Client.UserProfiles.PeopleManager]$PeopleManager,[string]$AccountName){
       $ctx = $PeopleManager.Context
       $accountName = "i:0#.f|membership|" + $AccountName  #claim format  
       $userProfile = $PeopleManager.GetPropertiesFor($AccountName)
       $ctx.Load($userProfile)
       $ctx.ExecuteQuery()
       Write-Host $userProfile.PersonalUrl
    }
    
    
    
    
    $tenantUrl = "https://contoso.sharepoint.com/"
    $userName = "jdoe@contoso.onmicrosoft.com" 
    $password = "password"
    
    $secPassword = ConvertTo-SecureString $password -AsPlainText -Force
    $cred = New-Object System.Management.Automation.PSCredential ($userName, $secPassword)
    Connect-MsolService -Credential $cred
    $allUsers = Get-MsolUser
    
    
    
    
    $Context = Get-SPOContext -Url $tenantUrl -UserName $userName -Password $password
    $peopleManager = New-Object Microsoft.SharePoint.Client.UserProfiles.PeopleManager($Context)
    $allUsers |  % { Print-UserProfileInfo -PeopleManager $peopleManager -AccountName $_.UserPrincipalName }
    $Context.Dispose()
    

    【讨论】:

    • 感谢瓦迪姆!我没有及时看到这个回复。我会用我所做的来更新我的问题
    • 在倒数第二行中,当我认为您的意思是 $allUsers 时,您使用管道 $users
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多