Freigeben über


SharePoint-Add-In zum Migrieren von Benutzerprofileigenschaften

Im Core.ProfileProperty.Migration-Beispiel wird gezeigt, wie Benutzerprofildaten von SharePoint Server zu SharePoint Online migriert werden.

Dieses Beispiel enthält zwei Konsolenanwendungen. Beide verwenden den Webdienst userprofileservice.asmx, um ein- und mehrwertige Benutzerprofildaten in eine XML-Datei zu extrahieren und die extrahierten Daten in den Benutzerprofildienst in SharePoint Online zu importieren.

Verwenden Sie dieses Codebeispiel, wenn Sie Folgendes ausführen möchten:

  • Extrahieren von Benutzerprofildaten in SharePoint Server.
  • Importieren sie Benutzerprofildaten in SharePoint Online.

Bevor Sie beginnen

Laden Sie zunächst das Beispiel-Add-In Core.ProfileProperty.Migration aus dem Projekt Office 365 Developer Patterns and Practices auf GitHub herunter.

Hinweis

Der Code in diesem Artikel wird wie besehen und ohne jegliche Garantie zur Verfügung gestellt, gleich ob ausdrücklich oder konkludent, einschließlich jedweder stillschweigenden Gewährleistung der Eignung für einen bestimmten Zweck, Marktgängigkeit oder Nichtverletzung von Rechten.

Das Codebeispiel enthält zwei Projekte:

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

Contoso.ProfileProperty.Migration.Extract-Projekt

Da in diesem Codebeispiel das serverseitige Objektmodell verwendet wird, stellen Sie sicher, dass Sie das Projekt auf einem Server ausführen, auf dem SharePoint Server installiert ist.

  • Verwenden Sie ein Konto, das über SharePoint-Farmadministratorberechtigungen verfügt.
  • Bearbeiten Sie die App.config-Datei mithilfe der in Tabelle 1 aufgeführten Konfigurationsinformationen.
  • Stellen Sie für alle Benutzer sicher, dass die E-Mail-Benutzerprofileigenschaft Work nicht leer ist. Wenn der Wert der Work-E-Mail-Benutzerprofileigenschaft leer ist, wird der Extraktionsprozess vorzeitig beendet.

In diesem Codebeispiel werden Benutzerprofile aus SharePoint Server 2010 extrahiert. Wenn Sie Benutzerprofile aus SharePoint Server 2013 extrahieren, gehen Sie wie folgt vor:

  1. Öffnen Sie das Kontextmenü (rechtsklick) für Contoso.ProfileProperty.Migration.Extract>Properties.

  2. Wählen Sie unter Anwendung im Zielframework.NET Framework 4 aus.

  3. Wählen Sie Ja und dann Speichern aus.

Tabelle 1. Konfigurationseinstellungen für App.config-Datei

Name der Konfigurationseinstellung Beschreibung Beispiel
MYSITEHOSTURL Meine Website-URL in der SharePoint Server-Quellfarm. http://my.contoso.com
PROPERTYSEPARATOR Das Zeichen, das verwendet wird, um mehrere Werte in einer mehrwertigen Benutzerprofileigenschaft zu trennen.
USERPROFILESSTORE Der XML-Dateipfad, der zum Schreiben extrahierter Benutzerprofildaten verwendet werden soll. C:\temp\ProfileData.xml
LOGFILE Der XML-Dateipfad, der zum Schreiben extrahierter Benutzerprofildaten verwendet werden soll. C:\temp\Extract.log
ENABLELOGGING Aktiviert die Datenträgerprotokollierung. Wahr
TESTRUN Führt eine Testextraktion aus, um zu bestätigen, dass Ihre Konfigurationseinstellungen in App.config korrekt sind. Legen Sie fest TESTRUN=true , wenn Sie eine Testextraktion durchführen. Der Testlauf extrahiert nur einen Benutzer aus dem Benutzerprofildienst.

Legen Sie fest TESTRUN=false , ob Sie alle Benutzer aus dem Benutzerprofildienst extrahieren.

Contoso.ProfileProperty.Migration.Import-Projekt

  • Stellen Sie sicher, dass Benutzerprofile in Office 365 vorhanden sind.

  • Stellen Sie sicher, dass die Geschäftliche E-Mail-Adresse des Benutzers im lokalen SharePoint Server und Office 365 Benutzerprofildiensts identisch ist.

  • Ändern Sie in der App.config-Datei das Wertelement der einstellung Contoso_ProfileProperty_Migration_Import_UPSvc_UserProfileService , um einen Verweis auf den Benutzerprofildienst in Ihrem SharePoint Online Admin Center einzuschließen, wie im folgenden Beispiel gezeigt.

      <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>
    
  • Bearbeiten Sie die App.config-Datei mithilfe der in Tabelle 2 aufgeführten Konfigurationseinstellungen.

Tabelle 2. App.config Dateikonfigurationseinstellungen

Name der Konfigurationseinstellung Beschreibung Beispiel
tenantName Dies ist der Name Ihres Mandanten. Wenn Ihre Mandanten-URL lautet http://contoso.onmicrosoft.com, geben Sie contoso als Mandantennamen ein.
PROPERTYSEPARATOR Das Zeichen, das zum Trennen von Werten in einer mehrwertigen Benutzerprofileigenschaft verwendet wird.
USERPROFILESSTORE Die XML-Datei, die zum Lesen extrahierter Benutzerprofildaten verwendet werden soll. C:\temp\ProfileData.xml
LOGFILE Protokolldatei, die für die Ereignisprotokollierung verwendet wird. C:\temp\Extract.log
ENABLELOGGING Aktiviert die Datenträgerprotokollierung. Wahr
SPOAdminUserName Ein Office 365 Benutzernamen des Administrators. Nicht zutreffend.
SPOAdminPassword Ein Office 365 Administratorkennwort. Nicht zutreffend.

Verwenden des Core.ProfileProperty.Migration-Beispiel-Add-Ins

Dieses Codebeispiel wird als Konsolenanwendung ausgeführt. Wenn das Codebeispiel ausgeführt wird, führt die Main-Funktion in Program.cs die folgenden Aufgaben aus:

  • Stellt eine Verbindung mit dem Host "Meine Website" her und verwendet UserProfileManager , um eine Verbindung mit dem Benutzerprofildienst herzustellen. UserProfileManager gehört zur assemblyMicrosoft.Office.Server.UserProfiles.dll .
  • Erstellt eine Liste namens pData , um extrahierte Benutzerprofildaten zu speichern.
  • Für alle Benutzer im Benutzerprofildienst werden folgende Aktionen ausgeführt:
    • Verwendet GetSingleValuedProperty , um die Benutzerprofileigenschaften WorkEmail und AboutMe in ein UserProfileData-Objekt namens userData zu kopieren.
    • Verwendet GetMultiValuedProperty , um die SPS-Responsibility-Benutzerprofileigenschaft in userData zu kopieren.
    • Verwendet UserProfileCollection.Save , um userData in eine XML-Datei zu serialisieren. Die XML-Datei wird unter dem Dateipfad gespeichert, den Sie in App.config angegeben haben.
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);
            }

Die GetSingleValuedProperty-Methode verwendet userprofileservice.asmx, um eine einwertige Benutzerprofileigenschaft abzurufen. GetSingleValuedProperty führt folgendes aus, wie im nächsten Codebeispiel gezeigt:

  • Ruft das Eigenschaftenobjekt ab, aus dem Daten mithilfe von spuser[userProperty] extrahiert werden sollen.
  • Gibt den ersten Wert in UserProfileValueCollection zurück, wenn der Wert nicht NULL ist.
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;
            
        }

Die GetMultiValuedProperty-Methode verwendet userprofileservice.asmx, um eine mehrwertige Benutzerprofileigenschaft abzurufen. GetMultiValuedProperty führt folgendes aus, wie im nächsten Codebeispiel gezeigt:

  • Ruft das Benutzerprofileigenschaftsobjekt ab, das mithilfe von spuser[userProperty] aktualisiert werden soll.
  • Erstellt eine Zeichenfolge von Benutzerprofileigenschaftswerten, die durch den in der App.config-Datei angegebenen PROPERTYSEPARATOR getrennt sind.
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();

        }

Verwenden des Beispiel-Add-Ins Contoso.ProfileProperty.Migration.Import

Dieses Codebeispiel wird als Konsolenanwendung ausgeführt. Wenn das Codebeispiel ausgeführt wird, führt die Main-Methode in Program.cs folgendes aus:

  • Initialisiert die Konsolenanwendung mit InitializeConfiguration und InitializeWebService.
  • Deserialisiert die XML-Datei, die die extrahierten Benutzerprofildaten enthält.
  • Für alle Benutzer in der XML-Datei gilt Folgendes:
    • Extrahiert die UserName-Eigenschaft aus der XML-Datei.
    • Verwendet SetSingleMVProfileProperty , um SPS-Responsibility für das Benutzerprofil festzulegen.
    • Verwendet SetSingleMVProfileProperty , um AboutMe für das Benutzerprofil festzulegen.

InitializeWebService stellt eine Verbindung mit SharePoint Online her und legt einen Verweis des Benutzerprofildiensts auf eine instance Variable fest. Andere Methoden in diesem Codebeispiel verwenden diese instance Variable, um Werte in Benutzerprofileigenschaften zu schreiben. Zum Verwalten des Benutzerprofils verwendet dieses Codebeispiel den Webdienst userprofileservice.asmx im SharePoint Online Admin Center.

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;

            }
            
        }

Die SetSingleMVProfileProperty-Methode legt eine mehrwertige Benutzerprofileigenschaft wie SPS-Responsibility wie folgt fest:

  • Das Aufteilen von PropertyValue in ein Zeichenfolgenarray namens arrs zum Speichern von Benutzerprofileigenschaftswerten. Die Zeichenfolge wird mithilfe der in App.config angegebenen PROPERTYSEPARATOR-Konfigurationseinstellung aufgeteilt.

  • Zuweisen der Werte von arrs zu einem ValueData-Array im Benutzerprofildienst.

  • Erstellen eines PropertyData-Arrays im Benutzerprofildienst. Der Name der Benutzerprofileigenschaft und das ValueData-Array werden an Eigenschaften des PropertyData-Objekts übergeben. Dieses Array verfügt nur über ein Element, da nur eine mehrwertige Benutzerprofileigenschaft importiert wird.

Die Daten werden mithilfe von ModifyUserPropertyByAccountName im Webdienst userprofileservice.asmx im SharePoint Online Admin Center in den Benutzerprofildienst geschrieben. Der Benutzer, der dieses Codebeispiel ausführt, muss ein Office 365 Administrator sein.

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);
            }

        }


Die SetSingleValuedProperty-Methode legt einwertige Benutzerprofileigenschaften fest, z. B. AboutMe. SetSingleValuedProperty implementiert dieselbe Technik wie SetSingleMVProfileProperty, verwendet jedoch ein ValueData-Array nur mit einem Element.

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);
            }

        }

Siehe auch