public void UpdateUser(UsersObject updateUser, bool isSuperOrResellerAdmin) { CPDatabase database = null; ADGroup ldapGroup = null; ADUser ldapUser = null; try { database = new CPDatabase(); // Get the user from the database var foundUser = (from u in database.Users where u.UserPrincipalName == updateUser.UserPrincipalName select u).FirstOrDefault(); if (foundUser == null) { ThrowEvent(AlertID.FAILED, "Unknown user " + updateUser.UserPrincipalName); } else { this.logger.Debug("Found user " + foundUser.UserPrincipalName + " in the database. Continuing..."); // Update the user values foundUser.Firstname = updateUser.Firstname; foundUser.Middlename = updateUser.Middlename; foundUser.Lastname = updateUser.Lastname; foundUser.DisplayName = updateUser.DisplayName; foundUser.Department = updateUser.Department; // Update user in Active Directory ldapUser = new ADUser(StaticSettings.Username, StaticSettings.DecryptedPassword, StaticSettings.PrimaryDC); ldapUser.UpdateUser(updateUser, StaticSettings.AllowCustomNameAttribute); // Only update these values if super admin or reseller admin is modifying the user if (isSuperOrResellerAdmin) { this.logger.Debug("Super admin or reseller is updating user so we can check comapny admin permissions and reseller permissions"); foundUser.IsCompanyAdmin = updateUser.IsCompanyAdmin; foundUser.IsResellerAdmin = updateUser.IsResellerAdmin; // Get permissions from database var userPermissions = (from p in database.UserPermissions where p.UserID == foundUser.ID select p).FirstOrDefault(); // If the user is no longer a company admin then remove permissions from the database if (userPermissions != null && !updateUser.IsCompanyAdmin) { this.logger.Debug("User " + updateUser.UserPrincipalName + " is no longer a comapny admin. Need to remove rights from database and security group"); database.UserPermissions.Remove(userPermissions); // Remove from Admins@ security group ldapGroup = new ADGroup(StaticSettings.Username, StaticSettings.DecryptedPassword, StaticSettings.PrimaryDC); ldapGroup.RemoveMember("Admins@" + updateUser.CompanyCode, updateUser.UserPrincipalName, "upn"); } else if (userPermissions != null && updateUser.IsCompanyAdmin) { this.logger.Debug("User " + updateUser.UserPrincipalName + " is a company admin. Need to update company admin rights in database."); // If user permissions was found and the user is company admin then update the values userPermissions.EnableExchange = updateUser.EnableExchangePerm; userPermissions.DisableExchange = updateUser.DisableExchangePerm; userPermissions.AddDomain = updateUser.AddDomainPerm; userPermissions.DeleteDomain = updateUser.DeleteDomainPerm; userPermissions.EnableAcceptedDomain = updateUser.EnableAcceptedDomainPerm; userPermissions.DisableAcceptedDomain = updateUser.DisableAcceptedDomainPerm; } else if (userPermissions == null && updateUser.IsCompanyAdmin) { this.logger.Debug("User " + updateUser.UserPrincipalName + " does not have any existing company admin rights. We need to add them to the database."); // No existing permissions were found and we need to add to database userPermissions = new UserPermission(); userPermissions.UserID = foundUser.ID; userPermissions.EnableExchange = updateUser.EnableExchangePerm; userPermissions.DisableExchange = updateUser.DisableExchangePerm; userPermissions.AddDomain = updateUser.AddDomainPerm; userPermissions.DeleteDomain = updateUser.DeleteDomainPerm; userPermissions.EnableAcceptedDomain = updateUser.EnableAcceptedDomainPerm; userPermissions.DisableAcceptedDomain = updateUser.DisableAcceptedDomainPerm; database.UserPermissions.Add(userPermissions); // Add to Admins@ security group ldapGroup = new ADGroup(StaticSettings.Username, StaticSettings.DecryptedPassword, StaticSettings.PrimaryDC); ldapGroup.AddMember("Admins@" + updateUser.CompanyCode, updateUser.UserPrincipalName, "upn"); } } else { this.logger.Debug("User making changes to " + updateUser.UserPrincipalName + " is not a super admin or reseller admin. We cannot update company admin or reseller admin permissions unless the user making changes is a super or reseller admin."); } // Update database database.SaveChanges(); } } catch (Exception ex) { this.logger.Debug("Error updating user " + updateUser.UserPrincipalName, ex); ThrowEvent(AlertID.FAILED, ex.Message); } finally { if (ldapUser != null) { ldapUser.Dispose(); } if (ldapGroup != null) { ldapGroup.Dispose(); } if (database != null) { database.Dispose(); } } }