onsdag den 12. november 2014

How to move users from Sitecore 5.3 to Sitecore 7.2

Issue

Users from a Sitecore 5 solution is needed in a new Sitecore 7.2 solution.

Solution

Two webforms are made. One to serialize users from the Sitecore 5.3 site into xml and one to import users into the Sitecore 7.2 site from the xml.

Serialization of users from Sitecore 5.3

This code iterates all users in the solution and writes it to an xmlfile in the App_Data folder. Username, Email, Fullname and roles are serialized.




 using System;  
 using System.Collections.Generic;  
 using System.Linq;  
 using System.Web;  
 using System.Web.UI;  
 using System.Web.UI.WebControls;  
 using Netmester.ExtensionMethods;  
 using Sitecore.Data.Items;  
 using Sitecore.Data;  
   
 public partial class SerializeUsers : System.Web.UI.Page  
 {  
   private Database _db = Sitecore.Configuration.Factory.GetDatabase("security");  
   
   protected void Page_Load(object sender, EventArgs e)  
   {  
     String fileName = Server.MapPath("~/App_Data/User.xml");  
   
     if (System.IO.File.Exists(fileName))  
       System.IO.File.Delete(fileName);  
   
     System.IO.File.AppendAllText(fileName, "<users>");  
     foreach (var user in _db.GetItem("/sitecore/Users").Axes.GetDescendants().Where(x => x.Template.Key == "user"))  
     {  
       var userXml = GetUser(user);  
       Response.Write(userXml + "<br/>");  
       Response.Flush();  
   
       System.IO.File.AppendAllText(fileName, userXml);  
     }  
     System.IO.File.AppendAllText(fileName, "</users>");  
   }  
   
   
   private String userFormat = @"<user username=""{0}"" email=""{1}"" fullname=""{2}"">  
       <roles>  
         {3}  
       </roles>  
     </user>";  
   
   private String roleFormat = @"<role name=""{0}""/>";  
   String GetUser(Item user)  
   {  
     String roles = "";  
   
     foreach (Guid id in user["roles"].Split(new char[] {'|'}, StringSplitOptions.RemoveEmptyEntries).Select(x => x.ToGuid()))  
     {  
       var role = _db.GetItem(new Sitecore.Data.ID(id));  
       if (role != null)  
       {  
         roles += String.Format(roleFormat, role.Name);  
       }  
     }  
   
     return String.Format(userFormat, user.Name, user["email"], user["fullname"], roles);  
   }  
 }  

Import of users to Sitecore 7.2


This code reads the xmlfile created using the code above. It tests if the users exists. If not the user is created with username, password equals username, email, fullname and roles attached.


 using System;  
 using System.Collections.Generic;  
 using System.Linq;  
 using System.Web;  
 using System.Web.Security;  
 using System.Web.UI;  
 using System.Web.UI.WebControls;  
 using System.Xml;  
 using Sitecore.Security.Accounts;  
   
 public partial class ImportUsers : System.Web.UI.Page  
 {  
   protected void Page_Load(object sender, EventArgs e)  
   {  
     String fileName = Server.MapPath("~/App_Data/User.xml");  
   
     XmlDocument doc = new XmlDocument();  
     doc.Load(fileName);  
   
     foreach (XmlNode xmlNode in doc.SelectNodes("users/user"))  
     {  
         AddUser(xmlNode);  
     }  
   }  
   
   Boolean AddUser(XmlNode node)  
   {  
     var userName = node.Attributes["username"].Value;  
     var email = node.Attributes["email"].Value;  
     var fullename = node.Attributes["fullname"].Value;  
     List<String> roles = new List<string>();  
     roles.AddRange(node.SelectNodes("roles/role").Cast<XmlNode>().Select(x => x.Attributes["name"].Value));  
   
     if (Membership.GetUser(@"sitecore\" + userName) != null)  
       return false;  
   
     Response.Write("User: " + userName + "<br/>");  
     Response.Flush();  
   
     Membership.CreateUser("sitecore\\" + userName, userName, email);  
   
     Sitecore.Security.Accounts.User user =  
       Sitecore.Security.Accounts.User.FromName(@"sitecore\" + userName, true);  
   
     user.Profile.FullName = fullename;  
   
     foreach (var role in roles)  
       UserRoles.FromUser(user).Add(Role.FromName(@"sitecore\" + role));  
   
     user.Profile.Save();  
     return true;  
   }  
 }  

Ingen kommentarer:

Send en kommentar