ユーザー プロファイル プロパティの移行サンプル アドイン (SharePoint)Migrate user profile properties sample add-in for SharePoint

プロバイダー向けのホスト型アドインを使用して、SharePoint ユーザー プロファイル データの移行やインポートを実行できます。You can use a provider-hosted add-in to migrate and import SharePoint user profile data.

適用対象: Office 365 | SharePoint 2013 | SharePoint OnlineApplies to: Office 365 | SharePoint 2013 | SharePoint Online

Core.ProfileProperty.Migration サンプル アドインは、SharePoint Server 2010 または SharePoint Server 2013 から SharePoint Online にユーザー プロファイル データを移行する方法を示します。The Core.ProfileProperty.Migration sample add-in shows you how to migrate user profile data from SharePoint Server 2010 or SharePoint Server 2013 into SharePoint Online.

このサンプルには、2 つのコンソール アプリケーションが含まれています。This sample includes two console applications. その両方とも userprofileservice.asmx Web サービスを使用して、単数値または複数値を持つユーザー プロファイル データを XML ファイルに抽出し、抽出したデータを SharePoint Online 内のユーザー プロファイル サービスへインポートします。Both use the userprofileservice.asmx web service to extract single and multivalued user profile data to an XML file, and to import the extracted data into the user profile service in SharePoint Online. このコード サンプルは、以下の操作を行う場合に使用します。Use this code sample if you want to:

  • SharePoint Server 2010 または SharePoint Server 2013 内のユーザー プロファイル データを抽出します。Extract user profile data in SharePoint Server 2010 or SharePoint Server 2013.

  • ユーザー プロファイル データを SharePoint Online へインポートします。Import user profile data into SharePoint Online.

はじめにBefore you begin

まず、Core.ProfileProperty.Migration サンプル アドインを、GitHub の Office 365 Developer patterns and practices プロジェクトからダウンロードします。To get started, download the Core.ProfileProperty.Migration sample add-in from the Office 365 Developer patterns and practices project on GitHub. コード サンプルには、2 つのプロジェクトが含まれています。The code sample contains two projects.

Contoso.ProfileProperty.Migration.Extract プロジェクトの場合For the Contoso.ProfileProperty.Migration.Extract project:

  • このコード サンプルではサーバー側オブジェクト モデルが使用されているので、SharePoint Server 2010 か SharePoint Server 2013 がインストールされているサーバー上でプロジェクトを実行しようとしていることを確認してください。Because this code sample uses the server-side object model, be sure that you are running the project on a server with SharePoint Server 2010 or SharePoint Server 2013 installed.

  • SharePoint ファーム管理者権限のあるアカウントを使用してください。Use an account that has SharePoint farm administrator permissions.

  • 表 1 で一覧表示されている構成情報を使用して App.config ファイルを編集してください。Edit the App.config file using the configuration information listed in Table 1.

  • すべてのユーザーについて、勤務先電子メール ユーザー プロファイル プロパティが空でないことを確認してください。For all users, ensure that the Work email user profile property is not empty. 勤務先電子メール ユーザー プロファイル プロパティの値が空の場合は、抽出手順が途中で終了します。If the value of the Work email user profile property is empty, the extraction process will end prematurely.

  • このコード サンプルは SharePoint Server 2010 からユーザー プロファイルを抽出します。This code sample extracts user profiles from SharePoint Server 2010. SharePoint Server 2013 からユーザー プロファイルを抽出する場合は、次に示す操作を実行します。If you are extracting user profiles from SharePoint Server 2013, do the following:

    a. a. [Contoso.ProfileProperty.Migration.Extract] > [プロパティ] を右クリックして、ショートカット メニューを開きます。Open the shortcut menu (right-click) for Contoso.ProfileProperty.Migration.Extract > Properties.

    b. b. [アプリケーション] の下の [対象のフレームワーク] で、[.NET Framework 4] を選択します。Under Application, in Target framework choose .NET Framework 4.

    c.c. [はい] を選択してから [保存] を選択します。Choose Yes, then Save.

表 1.App.Config ファイルの構成設定Table 1. Configuration settings for App.Config file

構成設定名Configuration setting name 説明Description Example
MYSITEHOSTURLMYSITEHOSTURL ソースの SharePoint Server 2010 または SharePoint Server 2013 ファーム上の個人用サイトの URL。My Site URL on the source SharePoint Server 2010 or SharePoint Server 2013 farm. http://my.contoso.com
PROPERTYSEPERATORPROPERTYSEPERATOR 複数値を持つユーザー プロファイル プロパティ内で複数の値を区切るのに使う文字。The character used to separate multiple values in a multivalued user profile property.
USERPROFILESSTOREUSERPROFILESSTORE 抽出されたユーザー プロファイル データの書き込みに使用する XML ファイル パス。The XML file path to use to write extracted user profile data. C:\temp\ProfileData.xmlC:\temp\ProfileData.xml
LOGFILELOGFILE 抽出されたユーザー プロファイル データの書き込みに使用する XML ファイル パス。The XML file path to use to write extracted user profile data. C:\temp\Extract.logC:\temp\Extract.log
ENABLELOGGINGENABLELOGGING ディスクのログ出力を有効にします。Enable disk logging. TrueTrue
TESTRUNTESTRUN テスト抽出を実行して、App.Config 内の構成設定が正しいことを確認します。Performs a test extraction to confirm that your configuration settings in App.Config are correct. テスト抽出を実行しようとしている場合は、TESTRUN=true を設定します。Set TESTRUN=true if you are performing a test extraction. テストを実行すると、ユーザー プロファイル サービスから 1 人のユーザーのみ抽出します。The test run extracts only one user from the user profile service.
ユーザー プロファイル サービスからすべてのユーザーを抽出しようとしている場合は、TESTRUN=false を設定します。Set TESTRUN=false if you are extracting all users from the user profile service.

Contoso.ProfileProperty.Migration.Import プロジェクトの場合For the Contoso.ProfileProperty.Migration.Import project

  • Office 365 内にユーザー プロファイルがあることを確認してください。Ensure that user profiles exist in Office 365.

  • ユーザーの [勤務先の電子メール] のアドレスが、オンプレミスの SharePoint Server 2013 と Office 365 ユーザー プロファイル サービスで同じであることを確認してください。Ensure that the user's Work email address is the same in the SharePoint Server 2013 on-premises and Office 365 user profile service.

  • 以下の例のように、App.config ファイル内の Contoso_ProfileProperty_Migration_Import_UPSvc_UserProfileService 設定の value 要素を変更して、SharePoint Online 管理センター内のユーザー プロファイル サービスへの参照を組み込んでください。In the App.config file, change the value element of the Contoso_ProfileProperty_Migration_Import_UPSvc_UserProfileService setting to include a reference to the user profile service in your SharePoint Online admin center, as shown in the following example.

    <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>
    
  • 表 2 で一覧表示されている構成設定を使用して App.config ファイルを編集してください。Edit the App.config file using the configuration settings listed in Table 2.

表 2App.config ファイルの構成設定Table 2. App.config file configuration settings

構成設定名Configuration setting name 説明Description Example
tenantNametenantName テナントの名前です。This is your tenant’s name. テナントの URL が http://contoso.onmicrosoft.com の場合、テナント名として「contoso」と入力します。If your tenant URL is http://contoso.onmicrosoft.com, enter contoso as your tenant name.
PROPERTYSEPERATORPROPERTYSEPERATOR 複数値を持つユーザー プロファイル プロパティ内で値を区切るのに使う文字。The character used to separate values in a multivalued user profile property.
USERPROFILESSTOREUSERPROFILESSTORE 抽出されたユーザー プロファイルのデータの読み取りに使用する XML ファイル。The XML file to use to read extracted user profile data. C:\temp\ProfileData.xmlC:\temp\ProfileData.xml
LOGFILELOGFILE イベント ログに使用するログ ファイル。Log file used for event logging. C:\temp\Extract.logC:\temp\Extract.log
ENABLELOGGINGENABLELOGGING ディスクのログ出力を有効にします。Enable disk logging. TrueTrue
SPOAdminUserNameSPOAdminUserName Office 365 管理者のユーザー名。An Office 365 administrator’s username. 該当なし。Not applicable.
SPOAdminPasswordSPOAdminPassword Office 365 管理者のパスワード。An Office 365 administrator’s password. 該当なし。Not applicable.

Core.ProfileProperty.Migration アプリの使用Using the Core.ProfileProperty.Migration app

このコード サンプルは、コンソール アプリケーションとして実行します。This code sample runs as a console application. このコード サンプルを実行すると、Program.cs の Main 関数により次の処理が実行されます。When the code sample runs, the Main function in Program.cs performs the following tasks:

  • 個人用サイトのホストに接続し、UserProfileManager をユーザー プロファイル サービスへの接続に使用します。Connects to the My Site Host and uses UserProfileManager to connect to the user profile service. UserProfileManager は、Microsoft.Office.Server.UserProfiles.dll アセンブリに属しています。UserProfileManager belongs to the Microsoft.Office.Server.UserProfiles.dll assembly.

  • pData という一覧を作成して、抽出されたユーザー プロファイル データを格納します。Creates a list called pData to store extracted user profile data.

  • ユーザー プロファイル サービス内のすべてのユーザーについて、以下の処理を行います。For all users in the user profile service it does the following:

    • GetSingleValuedProperty を使用して、WorkEmailAboutMe のユーザー プロファイル プロパティを userData という UserProfileData オブジェクトにコピーします。Uses GetSingleValuedProperty to copy the WorkEmail and AboutMe user profile properties to a UserProfileData object called userData.

    • GetMultiValuedProperty を使用して、SPS-Responsibility ユーザー プロファイル プロパティを userData にコピーします。Uses GetMultiValuedProperty to copy the SPS-Responsibility user profile property to userData.

  • UserProfileCollection.Save を使用して、userData を XML ファイルにシリアル化します。Uses UserProfileCollection.Save to serialize userData to an XML file. この XML ファイルは、App.config で指定したファイル パスに保存されます。The XML file is saved at the file path you specified in App.config.

注意

この記事で提供されるコードは、明示または黙示のいかなる種類の保証なしに現状のまま提供されるものであり、特定目的への適合性、商品性、権利侵害の不存在についての暗黙的な保証は一切ありません。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.

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

GetSingleValuedProperty メソッドは userprofileservice.asmx を使用して、単一値を持つユーザー プロファイル プロパティを取得することにご注意ください。Note that the GetSingleValuedProperty method uses userprofileservice.asmx to retrieve a single-valued user profile property. 次のコード例のように、GetSingleValuedProperty は以下の処理を実行します。GetSingleValuedProperty does the following, as shown in the next code example:

  • spuser[userProperty] を使用して、データの抽出元のプロパティ オブジェクトを取得します。Gets the property object to extract data from using spuser[userProperty].

  • 値が null でない場合、UserProfileValueCollection 内の最初の値を返します。Returns the first value in the UserProfileValueCollection if the value is not null.

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;

        }

GetMultiValuedProperty メソッドは userprofileservice.asmx を使用して、複数値を持つユーザー プロファイル プロパティを取得するのに使用することに注意してください。Note that the GetMultiValuedProperty method uses userprofileservice.asmx to retrieve a multivalued user profile property. 次のコード例のように、GetMultiValuedProperty は以下の処理を実行します。GetMultiValuedProperty does the following, as shown in the next code example:

  • spuser[userProperty] を使用して、更新対象のユーザー プロファイル プロパティ オブジェクトを取得します。Gets the user profile property object to update using spuser[userProperty].

  • App.config ファイルで指定された PROPERTYSEPARATOR でユーザー プロファイル プロパティ値を区切った文字列を構築します。Builds a string of user profile property values separated by the PROPERTYSEPARATOR specified in the App.config file.

private static string GetMultiValuedProperty(UserProfile spUser, string userProperty)
        {
            StringBuilder sb = new StringBuilder("");
            string seperator = ConfigurationManager.AppSettings["PROPERTYSEPERATOR"];

            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) { seperator = ""; }
                        sb.AppendFormat("{0}{1}", propCollection[i], seperator);
                    }
                }
                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();

        }

Contoso.ProfileProperty.Migration.Import の使用Using Contoso.ProfileProperty.Migration.Import

このコード サンプルは、コンソール アプリケーションとして実行します。This code sample runs as a console application. このコード サンプルを実行すると、Program.cs の Main メソッドにより次の処理が実行されます。When the code sample runs, the Main method in Program.cs does the following:

  • InitializeConfigurationInitializeWebService を使用してコンソール アプリケーションを初期化します。Initializes the console application using InitializeConfiguration and InitializeWebService.

  • 抽出されたユーザー プロファイル データが含まれている XML ファイルを逆シリアル化します。Deserializes the XML file containing the extracted user profile data.

  • XML ファイル内のすべてのユーザーについて、以下の処理を行います。For all users in the XML file it does the following:

    • XML ファイルから UserName プロパティを抽出します。Extracts the UserName property from the XML file.

    • SetSingleMVProfileProperty を使用して、ユーザーのプロファイル上で SPS-Responsibility を設定します。Uses SetSingleMVProfileProperty to set SPS-Responsibility on the user's profile.

    • SetSingleMVProfileProperty を使用して、ユーザーのプロファイル上で AboutMe を設定します。Uses SetSingleMVProfileProperty to set AboutMe on the user's profile.

InitializeWebService は、SharePoint Online に接続し、インスタンス変数にユーザー プロファイル サービスの参照を設定します。InitializeWebService connects to SharePoint Online, and sets a reference of the user profile service to an instance variable. このコード サンプル内の他の方法では、ユーザー プロファイル プロパティに値を書き込むためにこのインスタンス変数を使用します。Other methods in this code sample use this instance variable to write values to user profile properties. ユーザー プロファイルを管理するために、このコード サンプルは、SharePoint Online 管理センターの userprofileservice.asmx Web サービスを使用します。To administer the user profile, this code sample uses the userprofileservice.asmx web service on the 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;

            }

        }

SetSingleMVProfileProperty メソッドは、以下のようにして、SPS-Responsibility などの複数値を持つユーザー プロファイル プロパティを設定します。The SetSingleMVProfileProperty method sets a multivalued user profile property, such as SPS-Responsibility, by doing the following:

  • ユーザー プロファイル プロパティ値を格納するために、PropertyValuearrs と呼ばれる文字列配列に切り離します。Splitting PropertyValue into a string array called arrs to store user profile property values. App.Config で指定された PROPERTYSEPERATOR 構成の設定を使用して文字列を切り離します。The string is split using the PROPERTYSEPERATOR configuration setting specified in App.Config.

  • arrs の値を、ユーザー プロファイル サービス上の ValueData 配列に割り当てます。Assigning the values of arrs to a ValueData array on the user profile service.

  • ユーザー プロファイル サービスに PropertyData 配列を作成します。Creating a PropertyData array on the user profile service. ユーザー プロファイル プロパティの名前と ValueData 配列は、PropertyData オブジェクト上のプロパティに渡されます。The name of the user profile property and the ValueData array are passed to properties on the PropertyData object. この配列は、複数値を持つユーザー プロファイル プロパティを 1 つだけインポートするので、1 つの要素だけがあります。This array has one element only because only one multivalued user profile property will be imported.

SharePoint Online 管理センターの userprofileservice.asmx Web サービス上で ModifyUserPropertyByAccountName を使用して、データがユーザー プロファイル サービスに書き込まれます。The data is written to the user profile service using ModifyUserPropertyByAccountName on the userprofileservice.asmx web service on the SharePoint Online admin center. このコード サンプルを実行するユーザーは Office 365 管理者でなければなりません。The user running this code sample must be an Office 365 administrator.

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

            try
            {
                string[] arrs = PropertyValue.Split(ConfigurationManager.AppSettings["PROPERTYSEPERATOR"][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);
            }

        }

SetSingleValuedProperty メソッドは、AboutMe のような単一値を持つユーザー プロファイル プロパティを設定します。The SetSingleValuedProperty method sets single-valued user profile properties, such as AboutMe. SetSingleValuedPropertySetSingleMVProfileProperty と同じ技法を実装しますが、1 つの要素のみを含む ValueData 配列を使用します。SetSingleValuedProperty implements the same technique as SetSingleMVProfileProperty, but uses a ValueData array with one element only.

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

        }

関連項目See also