Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public void Apply(Section.User.User user, Action<string> status)
- {
- #region Sanity Checks
- if (user == null)
- {
- throw new ArgumentNullException("user");
- }
- if (status == null)
- {
- throw new ArgumentNullException("status");
- }
- #endregion
- _logger.Debug(string.Format("Starting to apply the user with name {0}", user.UserName));
- status(string.Format("Applying User {0} to the system.", user.UserName));
- using (PrincipalContext pc = new PrincipalContext(ContextType.Machine))
- {
- UserPrincipal userPrincipal = UserPrincipal.FindByIdentity(pc, user.UserName);
- try
- {
- _logger.Debug("Checking if user already exists");
- if (userPrincipal == null)
- {
- userPrincipal = CreateNewUser(user, pc);
- }
- _logger.Debug("Setting user password and applying to the system.");
- userPrincipal.SetPassword(user.UserPassword);
- userPrincipal.Save();
- Task<PrincipalSearchResult<Principal>> groups =
- Task<PrincipalSearchResult<Principal>>.Factory.StartNew(userPrincipal.GetGroups);
- _logger.Debug("Adding user to the groups.");
- AddUserToGroups(pc, userPrincipal, groups, user.UserType.Equals(UserType.WorkerProcess.ToString()) ? "Administrators" : "Users", "IIS_IUSRS");
- AddCurrentUser(user);
- }
- finally
- {
- if (userPrincipal != null)
- {
- userPrincipal.Dispose();
- }
- }
- }
- }
- private UserPrincipal CreateNewUser(Section.User.User user, PrincipalContext principal)
- {
- _logger.Debug("User did not exist creating now.");
- UserPrincipal newUser = new UserPrincipal(principal)
- {
- Name = user.UserName,
- Description = user.UserDescription,
- UserCannotChangePassword = false,
- PasswordNeverExpires = true,
- PasswordNotRequired = false
- };
- _logger.Debug("User created.");
- return newUser;
- }
- private void AddUserToGroups(PrincipalContext principal, UserPrincipal user, Task<PrincipalSearchResult<Principal>> userGroups, params string[] groups)
- {
- groups.AsParallel().ForAll(s =>
- {
- using (GroupPrincipal gp = GroupPrincipal.FindByIdentity(principal, s))
- {
- _logger.Debug(string.Format("Checking if user is alread in the group."));
- if (gp != null && !userGroups.Result.Contains(gp))
- {
- _logger.Debug(string.Format("The user was not a member of {0} adding them now.", gp.Name));
- //This is the point that the 7 minute hang starts
- gp.Members.Add(user);
- gp.Save();
- _logger.Debug(string.Format("User added to {0}.", gp.Name));
- }
- }
- });
- }
- gp.Members.Add( user );
- UserPrincipal user = this is your user;
- GroupPrincipal group = this is your group;
- // this is fast
- using ( DirectoryEntry groupEntry = group.GetUnderlyingObject() as DirectoryEntry )
- using ( DirectoryEntry userEntry = user.GetUnderlyingObject() as DirectoryEntry )
- {
- groupEntry.Invoke( "Add", new object[] { userEntry.Path } );
- }
- //group.Members.Add(user); // and this is slow!
- //group.Save();
Add Comment
Please, Sign In to add comment