Partilhar via


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

O exemplo Core.ProfileProperty.Migration mostra como migrar dados de perfil de usuário do SharePoint Server 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 único e multivalido 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 do perfil do usuário no SharePoint Server.
  • Importar 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 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.

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

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

Projeto Contoso.ProfileProperty.Migration.Extract

Como esse exemplo de código usa o modelo de objeto do lado do servidor, certifique-se de que você está executando o projeto em um servidor com o SharePoint Server 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 de perfil de usuário de email de trabalho não está vazia. Se o valor da propriedade de 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 SharePoint Server 2010. Se você estiver extraindo perfis de usuário do SharePoint Server 2013, faça o seguinte:

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

  2. Em Aplicativo, na estrutura De destino, escolha .NET Framework 4.

  3. Escolha Sim e escolha Salvar.

Tabela 1. Configuração de configuração para App.config arquivo

Nome da configuração Descrição Exemplo
MYSITEHOSTURL URL do Meu Site no farm do SharePoint Server de origem. http://my.contoso.com
PROPERTYSEPARATOR O caractere usado para separar vários valores em uma propriedade de perfil de usuário multivalorizado.
USERPROFILESSTORE O caminho do arquivo XML a ser usado para gravar dados de perfil de usuário extraídos. C:\temp\ProfileData.xml
LOGFILE O caminho do arquivo XML a ser usado para gravar dados de perfil de usuário extraídos. C:\temp\Extract.log
ENABLELOGGING Habilita o log em disco. Verdadeiro
TESTRUN Executa uma extração de teste para confirmar se as configurações no App.config estão corretas. Defina TESTRUN=true se você estiver executando 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ê estiver extraindo todos os usuários do serviço de perfil de usuário.

Projeto Contoso.ProfileProperty.Migration.Import

  • Verifique se os perfis de usuário existem em Office 365.

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

  • No arquivo App.config, altere o elemento 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 configurações listadas na Tabela 2.

Tabela 2. App.config configuração de arquivo

Nome da configuração Descrição Exemplo
tenantName 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 multivalorizado.
USERPROFILESSTORE O arquivo XML a ser usado para ler dados de perfil de usuário extraídos. C:\temp\ProfileData.xml
LOGFILE Arquivo de log usado para log de eventos. C:\temp\Extract.log
ENABLELOGGING Habilita o log em disco. Verdadeiro
SPOAdminUserName Um nome de usuário do administrador Office 365. Não aplicável.
SPOAdminPassword Uma senha do administrador 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 o exemplo de código é executado, a função Principal 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 do serviço de perfil de usuário, ele faz o seguinte:
    • Usa GetSingleValuedProperty para copiar as propriedades do 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 do arquivo especificado em 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 com valor único. GetSingleValuedProperty faz o seguinte, conforme mostrado no próximo exemplo de código:

  • Obtém o objeto de propriedade para extrair dados do uso de spuser[userProperty].
  • Retorna o primeiro valor no UserProfileValueCollection se o valor não for 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 multivalorizado. GetMultiValuedProperty faz o seguinte, conforme mostrado no próximo exemplo de código:

  • Obtém o objeto de propriedade de perfil de usuário para atualizar 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 o exemplo de código é executado, 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 do 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 em propriedades de 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;
                
                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 multivalorizado, como SPS-Responsibility, fazendo o seguinte:

  • Dividir 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.

  • Criando 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 só tem um elemento porque apenas uma propriedade de perfil de usuário multivalued será importada.

Os dados são gravados no serviço de perfil de usuário usando ModifiUserPropertyByAccountName no serviço Web userprofileservice.asmx no centro de administração do SharePoint Online. O usuário que executa esse exemplo de código deve ser um administrador 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 com 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