Compartilhar via


Carregar imagens de perfil de usuário exemplo de Suplemento do SharePoint

O exemplo Core.ProfilePictureUploader mostra como fazer um upload em massa de dados de perfil de usuário de um compartilhamento de arquivo ou URL do SharePoint Online e como vincular propriedades de perfil de usuário a imagens carregadas.

Use este exemplo para aprender a:

  • Migre as fotos de perfil de um usuário do SharePoint Server local para o SharePoint Online.
  • Corrija problemas que ocorrem quando a ferramenta Azure Active Directory Sync (dirsync) falha ao sincronizar as imagens de perfil de um usuário com o SharePoint Online.
  • Substitua imagens de perfil de usuário de má qualidade no SharePoint Online.

Este exemplo usa um aplicativo de console para fazer o seguinte:

  • Leia os nomes de usuário e os caminhos de arquivo de imagem ou URLs de um arquivo de mapeamento do usuário.
  • Buscar e carregar uma ou três imagens em uma biblioteca de imagens no host Meu Site.
  • Defina as propriedades do perfil do usuário para vincular as imagens carregadas ao perfil de um usuário.
  • Atualize propriedades de perfil de usuário adicionais (opcionais).

Antes de começar

Para começar, baixe o suplemento de exemplo Core.ProfilePictureUploader do projeto Office 365 Padrões e Práticas do Desenvolvedor no GitHub.

Observação

The code in this article is provided as-is, without warranty of any kind, either express or implied, including any implied warranties of fitness for a particular purpose, merchantability, or non-infringement.

Antes de executar este exemplo de código

  • Armazene suas imagens de usuário que você pretende carregar no SharePoint Online em um compartilhamento de arquivos ou servidor Web.
  • Edite o arquivo userlist.csv para incluir o seguinte:
    • Uma linha de cabeçalho que contém o valor UserPrincipalName, SourceURL.
    • Para cada usuário, adicione uma nova linha contendo a conta organizacional do usuário (ou nome da entidade de usuário) e o caminho do arquivo ou URL da imagem a ser carregada.

Execute este exemplo do Visual Studio

Configure o projeto Core.ProfilePictureUploader com os seguintes argumentos de linha de comando: onde: -SPOAdmin Username -SPOAdminPassword Password -Configuration filepath

  • Nome de usuário é o nome de usuário do administrador do Office 365.
  • A senha é a senha do administrador do Office 365.
  • Filepath é o caminho do arquivo do arquivo configuration.xml.

Defina os argumentos de linha de comando no projeto Core.ProfilePictureUploader

  1. Em Gerenciador de Soluções, abra o menu de atalho (clique com o botão direito do mouse) para as Propriedades do projeto >Core.ProfilePictureUploader.

  2. Escolha Depurar.

  3. Em Argumentos de linha de comando, insira os argumentos de linha de comando listados anteriormente.

Configurar o processo de carregamento para atender aos seus requisitos

Edite o arquivo configuration.xml inserindo os seguintes valores:

  • O nome do locatário Office 365 no elemento tenantName. Por exemplo: <tenantName>contoso.onmicrosoft.com</tenantName>

  • O caminho do arquivo de mapeamento do usuário no elemento pictureSourceCsv . Por exemplo: <pictureSourceCsv>C:\temp\userlist.csv</pictureSourceCsv>

  • Instruções de carregamento de imagem usando o elemento polegar . Edite os seguintes atributos no elemento polegar:

    • aupload3Thumbs - Defina como true se você quiser carregar três imagens para cada usuário ou definir como false se quiser carregar apenas uma imagem.

    • createSMLThumbs - Defina como true se quiser criar três imagens de tamanho diferentes (pequenas, médias e grandes) da imagem de origem ou definidas como false se você quiser carregar três imagens do mesmo tamanho.

  • Propriedades adicionais a serem definidas no perfil do usuário usando o elemento adicionalProfileProperties . Por exemplo, o XML a seguir especifica uma propriedade de perfil de usuário adicional chamada SPS-PictureExchangeSyncState que deve ser definida como zero no perfil do usuário quando o exemplo de código for executado.

      <additionalProfileProperties>
           <property name="SPS-PictureExchangeSyncState" value="0"/>
      </additionalProfileProperties>
    
  • O caminho do arquivo de log no elemento logfile , conforme mostrado no exemplo a seguir. <logFile path="C:\temp\log.txt" enableLogging="true" loggingLevel="verbose" />

  • O atraso de carregamento em milissegundos entre o upload de arquivos de imagem diferentes usando o elemento uploadDelay . A configuração recomendada para uploadDelay é de 500 milissegundos.

No arquivo App.config, altere o elemento valor da configuração ProfilePictureUploader_UPSvc_UserProfileService para incluir uma referência ao serviço de perfil de usuário no centro de administração do SharePoint Online, conforme mostrado no exemplo a seguir.

<Contoso.Core.ProfilePictureUploader.Properties.Settings>
      <setting name="ProfilePictureUploader_UPSvc_UserProfileService"
            serializeAs="String">
            <value>https://contoso-admin.sharepoint.com/_vti_bin/userprofileservice.asmx</value>
      </setting>
 </Contoso.Core.ProfilePictureUploader.Properties.Settings>

Importante

Conectar-se ao serviço Web userprofileservice.asmx no centro de administração do SharePoint Online permite atualizar as propriedades do perfil de usuário de outros usuários. Ao executar esse exemplo de código, use uma conta de administrador Office 365 que tenha permissões para gerenciar perfis de usuário.

Usando o suplemento de exemplo Core.ProfilePictureUploader

Este exemplo de código é executado como um aplicativo de console. Quando o exemplo de código é executado, o método Main em Program.cs faz o seguinte:

  • Inicializa o aplicativo de console usando SetupArguments e InitializeConfiguration.

  • Chama InitializeWebService para se conectar ao serviço de perfil de usuário no SharePoint Online.

  • Itera por meio do arquivo userlist.csv para ler o UPN (nome da entidade de usuário) para o usuário e o local do arquivo de imagem do usuário.

  • Busca a imagem de um usuário usando objetos WebRequest e WebResponse no GetImagefromHTTPUrl.

  • Chama UploadImageToSpo para carregar a imagem do usuário no SharePoint Online.

  • Chama SetMultipleProfileProperties para definir as propriedades de perfil de usuário PictureURL e SPS-PicturePlaceholderState para o usuário.

  • Chama SetAdditionalProfileProperties para definir propriedades adicionais no perfil do usuário depois que o arquivo de imagem for carregado.

static void Main(string[] args)
        {
            int count = 0;

            if (SetupArguments(args)) // Checks if args passed are valid 
            {

                if (InitializeConfiguration()) // Check that the configuration file is valid
                {
                    if (InitializeWebService()) // Initialize the web service end point for the SharePoint Online user profile service.
                    {
                        
                        using (StreamReader readFile = new StreamReader(_appConfig.PictureSourceCsv))
                        {
                            string line;
                            string[] row;
                            string sPoUserProfileName;
                            string sourcePictureUrl;

                            while ((line = readFile.ReadLine()) != null)
                            {
                                if (count > 0)
                                {
                                    row = line.Split(',');
                                    sPoUserProfileName = row[0]; 
                                    sourcePictureUrl = row[1]; 

                                    LogMessage("Begin processing for user " + sPoUserProfileName, LogLevel.Warning);

                                    // Get source picture from source image path.
                                    using (MemoryStream picturefromExchange = GetImagefromHTTPUrl(sourcePictureUrl))
                                    {
                                        if (picturefromExchange != null) // If we got image, upload to SharePoint Online
                                        {
                                            // Create SharePoint naming convention for image file.
                                            string newImageNamePrefix = sPoUserProfileName.Replace("@", "_").Replace(".", "_");
                                            // Upload source image to SharePoint Online.
                                            string spoImageUrl = UploadImageToSpo(newImageNamePrefix, picturefromExchange);
                                            if (spoImageUrl.Length > 0)// If upload worked:
                                            {
                                                string[] profilePropertyNamesToSet = new string[] { "PictureURL", "SPS-PicturePlaceholderState" };
                                                string[] profilePropertyValuesToSet = new string[] { spoImageUrl, "0" };
                                                // Set these two required user profile properties - path to uploaded image, and pictureplaceholder state.
                                                SetMultipleProfileProperties(_sPOProfilePrefix + sPoUserProfileName, profilePropertyNamesToSet, profilePropertyValuesToSet);
                                                // Set additional user profile properties based on your requirements.
                                                SetAdditionalProfileProperties(_sPOProfilePrefix + sPoUserProfileName);
                                            }
                                        }
                                    }

                                    LogMessage("End processing for user " + sPoUserProfileName, LogLevel.Warning);

                                    int sleepTime = _appConfig.UploadDelay;
                                    System.Threading.Thread.Sleep(sleepTime); // A pause between uploads is recommended. 
                                }
                                count++;
                            }
                        }
                    }
                }
            }


            LogMessage("Processing finished for " + count + " user profiles", LogLevel.Information);
         } 


InitializeWebService se conecta ao SharePoint Online e define uma referência do serviço de perfil de usuário para uma variável de instância. Outros métodos neste exemplo de código usam essa variável de instância para aplicar atualizações às propriedades do perfil de usuário. Para administrar o perfil de usuário, este exemplo de código usa o serviço Web userprofileservice.asmx no centro de administração do SharePoint Online.

static bool InitializeWebService()
        {
            try
            {
                string webServiceExt = "_vti_bin/userprofileservice.asmx";
                string adminWebServiceUrl = string.Empty;

                // Append the web service (ASMX) URL onto the admin website URL.
                if (_profileSiteUrl.EndsWith("/"))
                    adminWebServiceUrl = _profileSiteUrl + webServiceExt;
                else
                    adminWebServiceUrl = _profileSiteUrl + "/" + webServiceExt;

                LogMessage("Initializing SPO web service " + adminWebServiceUrl, LogLevel.Information);

                // Get secure password from clear text password.
                SecureString securePassword = GetSecurePassword(_sPoAuthPasword);

                // Set credentials from SharePoint Client API, used later to extract authentication cookie, so can replay to web services.
                SharePointOnlineCredentials onlineCred = new SharePointOnlineCredentials(_sPoAuthUserName, securePassword);

                // Get the authentication cookie by passing the URL of the admin website. 
                string authCookie = onlineCred.GetAuthenticationCookie(new Uri(_profileSiteUrl));

                // Create a CookieContainer to authenticate against the web service. 
                CookieContainer authContainer = new CookieContainer();

                // Put the authenticationCookie string in the container. 
                authContainer.SetCookies(new Uri(_profileSiteUrl), authCookie);

                // Set up the user profile web service. 
                _userProfileService = new UPSvc.UserProfileService();

                // Assign the correct URL to the admin profile web service. 
                _userProfileService.Url = adminWebServiceUrl;

                // Assign previously created authentication container to admin profile web service. 
                _userProfileService.CookieContainer = authContainer;
               // LogMessage("Finished creating service object for SharePoint Online Web Service " + adminWebServiceUrl, LogLevel.Information);
                return true;
            }
            catch (Exception ex)
            {
                LogMessage("Error initiating connection to profile web service in SPO " + ex.Message, LogLevel.Error);
                return false;

            }

            
        }


O método Main em Program.cs chama UploadImageToSpo para carregar a imagem de perfil do usuário no SharePoint Online. Todas as fotos de perfil de usuários são armazenadas em uma biblioteca de imagens no host Meu Site. UploadImageToSpo executa as seguintes tarefas:

  • Conecta-se ao SharePoint Online.
  • Determina o número de imagens a serem carregadas para cada usuário.
    • Se você configurou o aplicativo para carregar uma imagem por usuário, a imagem será carregada na biblioteca de imagens.
    • Se você configurou o aplicativo para carregar três imagens por usuário, o aplicativo verificará o valor de createSMLThumbs no arquivo de configuração para determinar se são necessárias três imagens de tamanho diferentes. Se forem necessárias três imagens de tamanho diferentes, o aplicativo usará ResizeImageSmall e ResizeImageLarge para criar três imagens de tamanho diferentes da imagem de origem. Em seguida, o aplicativo carrega as imagens redimensionadas na biblioteca de imagens. Se três imagens de tamanho diferentes não forem necessárias, o aplicativo carregará três imagens do mesmo tamanho na biblioteca de imagens.
static string UploadImageToSpo(string PictureName, Stream ProfilePicture)
        {
            try
            {

                string spPhotoPathTempate = "/User Photos/Profile Pictures/{0}_{1}Thumb.jpg"; // Path template to picture library on the My Site host.
                string spImageUrl = string.Empty;

                // Create SharePoint Online Client context to My Site host.
                ClientContext mySiteclientContext = new ClientContext(_mySiteUrl);
                SecureString securePassword = GetSecurePassword(_sPoAuthPasword);
                // Provide authentication credentials using Office 365 authentication.
                mySiteclientContext.Credentials = new SharePointOnlineCredentials(_sPoAuthUserName, securePassword);
                                
                if (!_appConfig.Thumbs.Upload3Thumbs) // Upload a single input image only to picture library, no resizing necessary.
                {
                    spImageUrl = string.Format(spPhotoPathTempate, PictureName, "M");
                    LogMessage("Uploading single image, no resize, to " + spImageUrl, LogLevel.Information);
                    Microsoft.SharePoint.Client.File.SaveBinaryDirect(mySiteclientContext, spImageUrl, ProfilePicture, true);
                }
                else if (_appConfig.Thumbs.Upload3Thumbs &amp;&amp; !_appConfig.Thumbs.CreateSMLThumbs)// Upload three images of the same size. 
                {
                    // The following code is not optimal. Upload the same source image three times with different names.
                    // No resizing of images necessary.
                    LogMessage("Uploading threes image to SPO, no resize", LogLevel.Information);

                    spImageUrl = string.Format(spPhotoPathTempate, PictureName, "M");
                    LogMessage("Uploading medium image to " + spImageUrl, LogLevel.Information);
                    Microsoft.SharePoint.Client.File.SaveBinaryDirect(mySiteclientContext, spImageUrl, ProfilePicture, true);

                    ProfilePicture.Seek(0, SeekOrigin.Begin);
                    spImageUrl = string.Format(spPhotoPathTempate, PictureName, "L");
                    LogMessage("Uploading large image to " + spImageUrl, LogLevel.Information);
                    Microsoft.SharePoint.Client.File.SaveBinaryDirect(mySiteclientContext, spImageUrl, ProfilePicture, true);
                    
                    ProfilePicture.Seek(0, SeekOrigin.Begin);
                    spImageUrl = string.Format(spPhotoPathTempate, PictureName, "S");
                    LogMessage("Uploading small image to " + spImageUrl, LogLevel.Information);
                    Microsoft.SharePoint.Client.File.SaveBinaryDirect(mySiteclientContext, spImageUrl, ProfilePicture, true);

                    
                }
                else if (_appConfig.Thumbs.Upload3Thumbs &amp;&amp; _appConfig.Thumbs.CreateSMLThumbs) //Generate 3 different sized images.
                {
                    LogMessage("Uploading threes image to SPO, with resizing", LogLevel.Information);
                    // Create three images based on recommended sizes for SharePoint Online.
                    // Create small-sized image.
                    using (Stream smallThumb = ResizeImageSmall(ProfilePicture, _smallThumbWidth))
                    {
                        if (smallThumb != null)
                        {
                            spImageUrl = string.Format(spPhotoPathTempate, PictureName, "S");
                            LogMessage("Uploading small image to " + spImageUrl, LogLevel.Information);
                            Microsoft.SharePoint.Client.File.SaveBinaryDirect(mySiteclientContext, spImageUrl, smallThumb, true);                            
                        }
                    }

                    // Create medium-sized image.
                    using (Stream mediumThumb = ResizeImageSmall(ProfilePicture, _mediumThumbWidth))
                    {
                        if (mediumThumb != null)
                        {
                            spImageUrl = string.Format(spPhotoPathTempate, PictureName, "M");
                            LogMessage("Uploading medium image to " + spImageUrl, LogLevel.Information);
                            Microsoft.SharePoint.Client.File.SaveBinaryDirect(mySiteclientContext, spImageUrl, mediumThumb, true);
                           
                        }
                    }

                    // Create large-sized image. This image is shown when you open the user's OneDrive for Business. 
                    using (Stream largeThumb = ResizeImageLarge(ProfilePicture, _largeThumbWidth))
                    {
                        if (largeThumb != null)
                        {

                            spImageUrl = string.Format(spPhotoPathTempate, PictureName, "L");
                            LogMessage("Uploading large image to " + spImageUrl, LogLevel.Information);
                            Microsoft.SharePoint.Client.File.SaveBinaryDirect(mySiteclientContext, spImageUrl, largeThumb, true);
                            
                        }
                    }
                  
                   
                }
                // Return URL of the medium-sized image to set properties on the user profile.
                return _mySiteUrl + string.Format(spPhotoPathTempate, PictureName, "M");                
                
            }
            catch (Exception ex)
            {
                LogMessage("User Error: Failed to upload thumbnail picture to SPO for " + PictureName + " " + ex.Message, LogLevel.Error);
                return string.Empty;
            }

        }


SetMultipleProfileProperties define várias propriedades de perfil de usuário em uma única chamada de método. Neste exemplo de código, SetMultipleProfileProperties define as seguintes propriedades de perfil de usuário para um usuário:

  • PictureURL - Defina como a URL da imagem carregada de tamanho médio na biblioteca de imagens no host Meu Site.

  • SPS-PicturePlaceholderState - Definido como zero para indicar que o SharePoint Online deve mostrar a imagem carregada para o usuário.

static void SetMultipleProfileProperties(string UserName, string[] PropertyName, string[] PropertyValue)
        {

            LogMessage("Setting multiple SPO user profile properties for " + UserName, LogLevel.Information);

            try
            {
                int arrayCount = PropertyName.Count();

                UPSvc.PropertyData[] data = new UPSvc.PropertyData[arrayCount];
                for (int x = 0; x < arrayCount; x++)
                {
                    data[x] = new UPSvc.PropertyData();
                    data[x].Name = PropertyName[x];
                    data[x].IsValueChanged = true;
                    data[x].Values = new UPSvc.ValueData[1];
                    data[x].Values[0] = new UPSvc.ValueData();
                    data[x].Values[0].Value = PropertyValue[x];
                }

                _userProfileService.ModifyUserPropertyByAccountName(UserName, data);
                // LogMessage("Finished setting multiple SharePoint Online user profile properties for " + UserName, LogLevel.Information);

            }
            catch (Exception ex)
            {
                LogMessage("User Error: Exception trying to update profile properties for user " + UserName + "\n" + ex.Message, LogLevel.Error);
            }
        }


SetAdditionalProfileProperties define todas as propriedades adicionais do perfil de usuário que você deseja atualizar depois de carregar os arquivos de imagem. Você pode especificar propriedades adicionais para atualizar no arquivo configuration.xml.

static void SetAdditionalProfileProperties(string UserName)
        {
            if (_appConfig.AdditionalProfileProperties.Properties == null) // If there are no additional properties to update. 
                return;

            int propsCount = _appConfig.AdditionalProfileProperties.Properties.Count();
            if (propsCount > 0)
            {
                string[] profilePropertyNamesToSet = new string[propsCount];
                string[] profilePropertyValuesToSet = new string[propsCount];
                // Loop through each property in configuration file.
                for (int i = 0; i < propsCount; i++)
                {
                    profilePropertyNamesToSet[i] = _appConfig.AdditionalProfileProperties.Properties[i].Name;
                    profilePropertyValuesToSet[i] = _appConfig.AdditionalProfileProperties.Properties[i].Value;
                }

                // Set all properties in a single call.
                SetMultipleProfileProperties(UserName, profilePropertyNamesToSet, profilePropertyValuesToSet);

            }
        }

Confira também