/// <summary>
        /// Configures the <paramref name="user" /> as a site administrator in the gallery. The user must already exist in
        /// Active Directory. A System Administrator role is created if it does not exist.
        /// </summary>
        /// <param name="user">The user to configure as a site administrator in the gallery. The only property that is
        /// references is <see cref="User.UserName" />.</param>
        /// <returns>Returns an <see cref="IUserAccount" /> representing the admin account, or null if <paramref name="user" />
        /// did not specify a username.</returns>
        /// <exception cref="System.ArgumentNullException">Thrown when <paramref name="user" /> is null.</exception>
        /// <exception cref="GalleryServerPro.Events.CustomExceptions.InvalidUserException">Thrown when the <paramref name="user" />
        /// does not exist in Active Directory.</exception>
        private static IUserAccount CreateActiveDirectoryAdministrator(User user)
        {
            if (user == null)
                throw new ArgumentNullException();

            if (UserController.MembershipGsp.GetType().ToString() != GlobalConstants.ActiveDirectoryMembershipProviderName)
            {
                throw new InvalidOperationException(String.Format("The function CreateActiveDirectoryAdministrator should be called only when using ActiveDirectoryMembershipProvider. Instead, {0} was detected.", UserController.MembershipGsp.GetType()));
            }

            var sysAdminRole = RoleController.ValidateSysAdminRole();

            IUserAccount userAccount = null;
            if (!String.IsNullOrEmpty(user.UserName))
            {
                userAccount = UserController.GetUser(user.UserName, false);

                if (userAccount == null)
                {
                    throw new InvalidUserException(string.Format("The Active Directory account {0} does not exist. Edit the text file at {1} to specify an existing AD account.", user.UserName, Utils.InstallFilePath));
                }

                if (!RoleController.IsUserInRole(user.UserName, sysAdminRole))
                {
                    RoleController.AddUserToRole(user.UserName, sysAdminRole);
                }
            }

            return userAccount;
        }
        /// <summary>
        /// Configures the <paramref name="user" /> as a site administrator in the gallery. The user is created if it doesn't
        /// exist. If the user exists, the user's password is updated with the specified password. A System Administrator role
        /// is created if it does not exist.
        /// </summary>
        /// <param name="user">The user to configure as a site administrator in the gallery. The <see cref="User.UserName" /> 
        /// and <see cref="User.Password" /> properties must both be specified. If both are null or empty, null is returned.</param>
        /// <returns>Returns an <see cref="IUserAccount" /> representing the admin account.</returns>
        /// <exception cref="System.ArgumentNullException">Thrown when <paramref name="user" /> is null.</exception>
        /// <exception cref="GalleryServerPro.Events.CustomExceptions.InvalidUserException">Thrown when <paramref name="user" />
        /// does not specify a username and password.</exception>
        private static IUserAccount CreateMembershipAdministrator(User user)
        {
            if (user == null)
                throw new ArgumentNullException();

            if (String.IsNullOrEmpty(user.UserName) && String.IsNullOrEmpty(user.Password))
                return null;

            if (!String.IsNullOrEmpty(user.UserName) && String.IsNullOrEmpty(user.Password))
            {
                throw new InvalidUserException(string.Format("No password was specified. Add a line to the text file at {0} that specifies a password. Example: Password=MyPassword", Utils.InstallFilePath));
            }

            var userAccount = UserController.GetUser(user.UserName, false);

            if (userAccount != null)
            {
                if (!UserController.MembershipGsp.ValidateUser(user.UserName, user.Password))
                {
                    // Password doesn't match. Try to update.
                    if (!UserController.EnablePasswordRetrieval)
                    {
                        throw new Exception(String.Format(CultureInfo.InvariantCulture, "Cannot change password because the membership's password retrieval setting is disabled. The password specified in {0} does not match the existing password for user {1}, so an attempt was made to change it. However, the membership provider does not allow it. Things you can try: (1) Specify a different username in the text file. (2) Enter the correct password for the user in the text file. (3) Edit web.config to allow password retrieval: Set enablePasswordRetrieval=\"true\" in the membership section.", Utils.InstallFilePath, user.UserName));
                    }

                    if (!UserController.ChangePassword(user.UserName, UserController.GetPassword(user.UserName), user.Password))
                    {
                        throw new Exception(String.Format(CultureInfo.InvariantCulture, "Cannot change password. The password specified in {0} does not match the existing password for user {1}, so an attempt was made to change it. However, the membership provider wouldn't allow it and did not specify a reason. Things you can try: (1) Specify a different username in the text file. (2) Enter a different password for the user in the text file, taking care to meet length and complexity requirements.", Utils.InstallFilePath, user.UserName));
                    }
                }

                RoleController.ValidateSysAdminRole();
                if (!RoleController.IsUserInRole(user.UserName, Resources.GalleryServerPro.Site_Sys_Admin_Role_Name))
                {
                    RoleController.AddUserToRole(user.UserName, Resources.GalleryServerPro.Site_Sys_Admin_Role_Name);
                }
            }
            else
            {
                // User account doesn't exist. Create it.
                user.Roles = new[] { RoleController.ValidateSysAdminRole() };

                userAccount = UserController.CreateUser(user);
            }

            return userAccount;
        }
        /// <summary>
        /// Gets a <see cref="User" /> instance having the properties specified in <see cref="Utils.InstallFilePath" />.
        /// Supports these properties: UserName, Password, Email. Returns null if none of these exist in the text file.
        /// </summary>
        /// <returns>An instance of <see cref="User" />, or null.</returns>
        public static User GetAdminUserFromInstallTextFile()
        {
            User user = null;

            try
            {
                using (var sr = new StreamReader(Utils.InstallFilePath))
                {
                    var lineText = sr.ReadLine();
                    while (lineText != null)
                    {
                        var kvp = lineText.Split(new[] { '=' });

                        if (kvp.Length == 2)
                        {
                            if (kvp[0] == "UserName")
                            {
                                if (user == null)
                                    user = new User();

                                user.UserName = kvp[1].Trim(); // Found username row
                            }

                            if (kvp[0] == "Password")
                            {
                                if (user == null)
                                    user = new User();

                                user.Password = kvp[1].Trim(); // Found password row
                            }

                            if (kvp[0] == "Email")
                            {
                                if (user == null)
                                    user = new User();

                                user.Email = kvp[1].Trim(); // Found email row
                            }
                        }

                        lineText = sr.ReadLine();
                    }
                }
            }
            catch (FileNotFoundException) { }

            return user;
        }