Migrar propriedades de perfil de usuário Suplemento do SharePoint de exemplo

Importante

Os suplementos do SharePoint atingiram o fim da vida útil no SharePoint Online em 2 de abril de 2026. Os suplementos hospedados no SharePoint e hospedados pelo provedor foram desativados e não funcionam mais no SharePoint Online, incluindo nuvens governamentais. As diretrizes de desenvolvimento, implantação e uso de suplementos são mantidas para referência histórica e para cenários aplicáveis do Servidor do SharePoint, não para novas soluções do SharePoint Online.

Os suplementos do Servidor do SharePoint implantados por meio de um catálogo de aplicativos local não são desativados por essa alteração. A aquisição de Suplementos do SharePoint do marketplace público terminou em 2 de abril de 2026 para o Servidor do SharePoint.

Essa desativação não desativa APIs REST do SharePoint, CSOM, JSOM ou SPFx (Estrutura do SharePoint). Para o SharePoint Online, use SPFx para extensões de interface do usuário e o Microsoft Entra ID para autenticação para aplicativos externos. Consulte o anúncio de desativação e as diretrizes de migração de suplemento.

O exemplo Core.ProfileProperty.Migration mostra como migrar dados de perfil de usuário do Servidor do SharePoint para o SharePoint Online.

Este exemplo inclui dois aplicativos de console. Ambos usam o serviço Web userprofileservice.asmx para extrair dados de perfil de usuário de valores únicos e múltiplos para um arquivo XML e para importar os dados extraídos para o serviço de perfil de usuário no SharePoint Online.

Use este exemplo de código se quiser:

  • Extraia dados de perfil de usuário no Servidor do SharePoint.
  • Importe dados de perfil de usuário para o SharePoint Online.

Antes de começar

Para começar, baixe o suplemento de exemplo Core.ProfileProperty.Migration do projeto Padrões e Práticas do Desenvolvedor do Office 365 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.

O exemplo de código contém dois projetos:

  • Contoso.ProfileProperty.Migration.Extract
  • Contoso.ProfileProperty.Migration.Import

Projeto Contoso.ProfileProperty.Migration.Extract

Como este exemplo de código usa o modelo de objeto do lado do servidor, verifique se você está executando o projeto em um servidor com o Servidor do SharePoint instalado.

  • Use uma conta que tenha permissões de administrador de farm do SharePoint.
  • Edite o arquivo App.config usando as informações de configuração listadas na Tabela 1.
  • Para todos os usuários, verifique se a propriedade Perfil de usuário de email de trabalho não está vazia. Se o valor da propriedade Perfil de usuário de email de trabalho estiver vazio, o processo de extração terminará prematuramente.

Este exemplo de código extrai perfis de usuário do Servidor do SharePoint 2010. Se você estiver extraindo perfis de usuário do Servidor do SharePoint 2013, faça o seguinte:

  1. Abra o menu de atalho (clique com o botão direito do mouse) paraas PropriedadesContoso.ProfileProperty.Migration.Extract>.

  2. Em Aplicativo, em Estrutura de destino, escolha .NET Framework 4.

  3. Escolha Sim e, em seguida, Salvar.

Tabela 1. Definições de configuração do arquivo App.config

Nome da definição de configuração Descrição Exemplo
MYSITEHOSTURL URL de Meu Site no farm de origem do Servidor do SharePoint. http://my.contoso.com
PROPERTYSEPARATOR O caractere usado para separar vários valores em uma propriedade de perfil de usuário de valores múltiplos.
USERPROFILESSTORE O caminho do arquivo XML a ser usado para gravar dados de perfil de usuário extraídos. C:\temp\ProfileData.xml
ARQUIVO DE LOG O caminho do arquivo XML a ser usado para gravar dados de perfil de usuário extraídos. C:\temp\Extract.log
REGISTRO EM LOG DE ATIVAÇÃO Habilita o registro em log de disco. Verdadeiro
EXECUÇÃO DE TESTE Executa uma extração de teste para confirmar se as definições de configuração no App.config estão corretas. Defina TESTRUN=true se você está realizando uma extração de teste. A execução de teste extrai apenas um usuário do serviço de perfil de usuário.

Defina TESTRUN=false se você está extraindo todos os usuários do serviço de perfil de usuário.

Projeto Contoso.ProfileProperty.Migration.Import

  • Certifique-se de que os perfis de usuário existam no Office 365.

  • Verifique se o endereço de email de trabalho do usuário é o mesmo no Servidor do SharePoint local e no serviço de perfil de usuário do Office 365.

  • No arquivo App.config, altere o elemento de valor da configuração Contoso_ProfileProperty_Migration_Import_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.

      <applicationSettings>
      <Contoso.ProfileProperty.Migration.Import.Properties.Settings>
      <setting name="Contoso_ProfileProperty_Migration_Import_UPSvc_UserProfileService" serializeAs="String">
      <value>https://contoso-admin.sharepoint.com/_vti_bin/userprofileservice.asmx</value>
      </setting>
      </Contoso.ProfileProperty.Migration.Import.Properties.Settings>
      </applicationSettings>
    
  • Edite o arquivo App.config usando as definições de configuração listadas na Tabela 2.

Tabela 2. App.config definições de configuração do arquivo

Nome da definição de configuração Descrição Exemplo
nome do locatário Esse é o nome do locatário. Se a URL do locatário for http://contoso.onmicrosoft.com, insira contoso como seu nome de locatário.
PROPERTYSEPARATOR O caractere usado para separar valores em uma propriedade de perfil de usuário de valores múltiplos.
USERPROFILESSTORE O arquivo XML a ser usado para ler os dados de perfil de usuário extraídos. C:\temp\ProfileData.xml
ARQUIVO DE LOG Arquivo de log usado para registro de eventos. C:\temp\Extract.log
REGISTRO EM LOG DE ATIVAÇÃO Habilita o registro em log de disco. Verdadeiro
SPOAdminUserName Um nome de usuário de administrador do Office 365. Não aplicável.
SPOAdminPassword Uma senha de administrador do Office 365. Não aplicável.

Usando o suplemento de exemplo Core.ProfileProperty.Migration

Este exemplo de código é executado como um aplicativo de console. Quando a amostra de código é executada, a função Main em Program.cs executa as seguintes tarefas:

  • Conecta-se ao host Meu Site e usa UserProfileManager para se conectar ao serviço de perfil de usuário. UserProfileManager pertence ao assemblyMicrosoft.Office.Server.UserProfiles.dll .
  • Cria uma lista chamada pData para armazenar dados de perfil de usuário extraídos.
  • Para todos os usuários no serviço de perfil de usuário, ele faz o seguinte:
    • Usa GetSingleValuedProperty para copiar as propriedades de perfil de usuário WorkEmail e AboutMe para um objeto UserProfileData chamado userData.
    • Usa GetMultiValuedProperty para copiar a propriedade de perfil de usuário SPS-Responsibility para userData.
    • Usa UserProfileCollection.Save para serializar userData em um arquivo XML. O arquivo XML é salvo no caminho de arquivo especificado no App.config.
static void Main(string[] args)
        {
            int userCount = 1;

            try
            {

                if (Convert.ToBoolean(ConfigurationManager.AppSettings["TESTRUN"]))
                {
                    LogMessage(string.Format("******** RUNNING IN TEST RUN MODE **********"), LogLevel.Debug);
                }
                
                LogMessage(string.Format("Connecting to My Site host: '{0}'...", ConfigurationManager.AppSettings["MYSITEHOSTURL"]), LogLevel.Info);
                using (SPSite mySite = new SPSite(ConfigurationManager.AppSettings["MYSITEHOSTURL"]))
                {
                    LogMessage(string.Format("Connecting to My Site host: '{0}'...Done!", ConfigurationManager.AppSettings["MYSITEHOSTURL"]), LogLevel.Info);

                    LogMessage(string.Format("getting Service Context..."), LogLevel.Info);
                    SPServiceContext svcContext = SPServiceContext.GetContext(mySite);
                    LogMessage(string.Format("getting Service Context...Done!"), LogLevel.Info);

                    LogMessage(string.Format("Connecting to Profile Manager..."), LogLevel.Info);
                    UserProfileManager profileManager = new UserProfileManager(svcContext);
                    LogMessage(string.Format("Connecting to Profile Manager...Done!"), LogLevel.Info);

                    // Size of the List is set to the number of profiles.
                    List<UserProfileData> pData = new List<UserProfileData>(Convert.ToInt32(profileManager.Count));
                    
                    // Initialize Serialization Class.
                    UserProfileCollection ups = new UserProfileCollection();

                    foreach (UserProfile spUser in profileManager)
                    {
                        // Get profile information.
                        LogMessage(string.Format("processing user '{0}' of {1}...", userCount,profileManager.Count),LogLevel.Info);                       
                        UserProfileData userData = new UserProfileData();
                        
                        userData.UserName = GetSingleValuedProperty(spUser, "WorkEmail");
                        
                        if (userData.UserName != string.Empty)
                        {
                            userData.AboutMe = GetSingleValuedProperty(spUser, "AboutMe");
                            userData.AskMeAbout = GetMultiValuedProperty(spUser, "SPS-Responsibility");
                            pData.Add(userData);
                            // Add to Serialization Class List of Profiles.
                            ups.ProfileData = pData;
                        }
                        
                        LogMessage(string.Format("processing user '{0}' of {1}...Done!", userCount++, profileManager.Count), LogLevel.Info);

                        // Only process the first item if we are in test mode.
                        if (Convert.ToBoolean(ConfigurationManager.AppSettings["TESTRUN"]))
                        {
                            break;
                        }

                    }
                    
                    // Serialize profiles to disk.
                    ups.Save();

                }
            }
            catch(Exception ex)
            {
                LogMessage("Exception trying to get profile properties:\n" + ex.Message, LogLevel.Error);
            }

O método GetSingleValuedProperty usa userprofileservice.asmx para recuperar uma propriedade de perfil de usuário de valor único. GetSingleValuedProperty faz o seguinte, conforme mostrado no exemplo de código a seguir:

  • Obtém o objeto de propriedade para extrair dados usando spuser[userProperty].
  • Retorna o primeiro valor em UserProfileValueCollection se o valor não é nulo.
private static string GetSingleValuedProperty(UserProfile spUser,string userProperty)
        {
            string returnString = string.Empty;
            try
            {
                UserProfileValueCollection propCollection = spUser[userProperty];

                if (propCollection[0] != null)
                {
                    returnString = propCollection[0].ToString();
                }
                else
                {
                    LogMessage(string.Format("User '{0}' does not have a value in property '{1}'", spUser.DisplayName, userProperty), LogLevel.Warning);                       
                }
            }
            catch 
            {
                LogMessage(string.Format("User '{0}' does not have a value in property '{1}'", spUser.DisplayName, userProperty), LogLevel.Warning);                       
            }


            return returnString;
            
        }

O método GetMultiValuedProperty usa userprofileservice.asmx para recuperar uma propriedade de perfil de usuário de vários valores. GetMultiValuedProperty faz o seguinte, conforme mostrado no exemplo de código a seguir:

  • Obtém o objeto de propriedade de perfil de usuário a ser atualizado usando spuser[userProperty].
  • Cria uma cadeia de caracteres de valores de propriedade de perfil de usuário separados pelo PROPERTYSEPARATOR especificado no arquivo App.config.
private static string GetMultiValuedProperty(UserProfile spUser, string userProperty)
        {
            StringBuilder sb = new StringBuilder("");
            string separator = ConfigurationManager.AppSettings["PROPERTYSEPARATOR"];

            string returnString = string.Empty;
            try
            {

                UserProfileValueCollection propCollection = spUser[userProperty];

                if (propCollection.Count > 1)
                {
                    for (int i = 0; i < propCollection.Count; i++)
                    {
                        if (i == propCollection.Count - 1) { separator = ""; }
                        sb.AppendFormat("{0}{1}", propCollection[i], separator);
                    }
                }
                else if (propCollection.Count == 1)
                {
                    sb.AppendFormat("{0}", propCollection[0]);
                }

            }
            catch
            {
                LogMessage(string.Format("User '{0}' does not have a value in property '{1}'", spUser.DisplayName, userProperty), LogLevel.Warning);
            }

            return sb.ToString();

        }

Usando o suplemento de exemplo Contoso.ProfileProperty.Migration.Import

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

  • Inicializa o aplicativo de console usando InitializeConfiguration e InitializeWebService.
  • Desserializa o arquivo XML que contém os dados de perfil de usuário extraídos.
  • Para todos os usuários no arquivo XML, ele faz o seguinte:
    • Extrai a propriedade UserName do arquivo XML.
    • Usa SetSingleMVProfileProperty para definir SPS-Responsibility no perfil do usuário.
    • Usa SetSingleMVProfileProperty para definir AboutMe no perfil do usuário.

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 gravar valores nas propriedades do perfil do usuário. Para administrar o perfil de usuário, esta amostra 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;
                
                if (_profileSiteUrl.EndsWith("/"))
                    adminWebServiceUrl = _profileSiteUrl + webServiceExt;
                else
                    adminWebServiceUrl = _profileSiteUrl + "/" + webServiceExt;

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

                SecureString securePassword = GetSecurePassword(_sPoAuthPasword);
                SharePointOnlineCredentials onlineCred = new SharePointOnlineCredentials(_sPoAuthUserName, securePassword);

                string authCookie = onlineCred.GetAuthenticationCookie(new Uri(_profileSiteUrl));

                CookieContainer authContainer = new CookieContainer();
                authContainer.SetCookies(new Uri(_profileSiteUrl), authCookie);

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

                // Assign previously created auth container to admin profile web service. 
                _userProfileService.CookieContainer = authContainer;
                return true;
            }
            catch (Exception ex)
            {
                LogMessage("Error initiating connection to profile web service in SPO " + ex.Message, LogLevel.Error);
                return false;

            }
            
        }

O método SetSingleMVProfileProperty define uma propriedade de perfil de usuário de vários valores, como SPS-Responsibility, fazendo o seguinte:

  • Dividindo PropertyValue em uma matriz de cadeia de caracteres chamada arrs para armazenar valores de propriedade de perfil de usuário. A cadeia de caracteres é dividida usando a configuração PROPERTYSEPARATOR especificada em App.config.

  • Atribuindo os valores de arrs a uma matriz ValueData no serviço de perfil de usuário.

  • Criação de uma matriz PropertyData no serviço de perfil de usuário. O nome da propriedade de perfil de usuário e a matriz ValueData são passados para propriedades no objeto PropertyData . Essa matriz tem apenas um elemento porque apenas uma propriedade de perfil de usuário de valores múltiplos será importada.

Os dados são gravados no serviço de perfil de usuário usando ModifyUserPropertyByAccountName no serviço Web userprofileservice.asmx no centro de administração do SharePoint Online. O usuário que executa esta amostra de código deve ser um administrador do Office 365.

static void SetSingleMVProfileProperty(string UserName, string PropertyName, string PropertyValue)
        {

            try
            {
                string[] arrs = PropertyValue.Split(ConfigurationManager.AppSettings["PROPERTYSEPARATOR"][0]);
                
               UPSvc.ValueData[] vd = new UPSvc.ValueData[arrs.Count()];
               
               for (int i=0;i<=arrs.Count()-1;i++)
               {
                    vd[i] = new UPSvc.ValueData();
                    vd[i].Value = arrs[i];
                }
               
                UPSvc.PropertyData[] data = new UPSvc.PropertyData[1];
                data[0] = new UPSvc.PropertyData();
                data[0].Name = PropertyName;
                data[0].IsValueChanged = true;
                data[0].Values = vd;
                               
                _userProfileService.ModifyUserPropertyByAccountName(string.Format(@"i:0#.f|membership|{0}", UserName), data);

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

        }


O método SetSingleValuedProperty define propriedades de perfil de usuário de valor único, como AboutMe. SetSingleValuedProperty implementa a mesma técnica que SetSingleMVProfileProperty, mas usa uma matriz ValueData com apenas um elemento.

static void SetSingleProfileProperty(string UserName, string PropertyName, string PropertyValue)
        {

            try
            {
                UPSvc.PropertyData[] data = new UPSvc.PropertyData[1];
                data[0] = new UPSvc.PropertyData();
                data[0].Name = PropertyName;
                data[0].IsValueChanged = true;
                data[0].Values = new UPSvc.ValueData[1];
                data[0].Values[0] = new UPSvc.ValueData();
                data[0].Values[0].Value = PropertyValue;
                _userProfileService.ModifyUserPropertyByAccountName(UserName, data);
            }
            catch (Exception ex)
            {
                LogMessage("Exception trying to update profile property " + PropertyName + " for user " + UserName + "\n" + ex.Message, LogLevel.Error);
            }

        }

Confira também