public static void RemovePrincipal(SecurityIdentifier userSid, RemovalReason reason) { // TODO: Only do this if the principal is a member of the group? if ((LocalAdminGroup != null) && (userSid != null)) { SecurityIdentifier[] localAdminSids = GetLocalGroupMembers(null, LocalAdminGroup.SamAccountName); foreach (SecurityIdentifier sid in localAdminSids) { if (sid == userSid) /* if (string.Compare(sid.Value, principalSID, true) == 0) */ { string accountName = GetAccountNameFromSID(userSid.Value); int result = RemoveLocalGroupMembers(null, LocalAdminGroup.SamAccountName, userSid); if (result == 0) { PrincipalList.RemoveSID(userSid); Settings.SIDs = PrincipalList.GetSIDs().Select(p => p.Value).ToArray <string>(); string reasonString = Properties.Resources.RemovalReasonUnknown; switch (reason) { case RemovalReason.ServiceStopped: reasonString = Properties.Resources.RemovalReasonServiceStopped; break; case RemovalReason.Timeout: reasonString = Properties.Resources.RemovalReasonTimeout; break; case RemovalReason.UserLogoff: reasonString = Properties.Resources.RemovalReasonUserLogoff; break; case RemovalReason.UserRequest: reasonString = Properties.Resources.RemovalReasonUserRequest; break; } // TODO: i18n. string message = string.Format("Principal {0} ({1}) removed from the Administrators group. Reason: {2}.", userSid, accountName, reasonString); ApplicationLog.WriteInformationEvent(message, EventID.UserRemovedFromAdminsSuccess); } else { // TODO: i18n. ApplicationLog.WriteWarningEvent(string.Format("Removing principal {0} ({1}) from the Administrators group returned error code {1}.", userSid, accountName, result), EventID.UserRemovedFromAdminsFailure); } } } } }
public static void ValidateAllAddedPrincipals() { SecurityIdentifier[] localAdminSids = null; /* string[] addedSids = PrincipalList.GetSIDs(); */ SecurityIdentifier[] addedSids = PrincipalList.GetSIDs(); if ((addedSids.Length > 0) && (LocalAdminGroup != null)) { localAdminSids = GetLocalGroupMembers(null, LocalAdminGroup.SamAccountName); } for (int i = 0; i < addedSids.Length; i++) { bool sidFoundInAdminsGroup = false; if ((addedSids[i] != null) && (localAdminSids != null)) { foreach (SecurityIdentifier sid in localAdminSids) { if (sid == addedSids[i]) { sidFoundInAdminsGroup = true; break; } } if (sidFoundInAdminsGroup) { // Principal's SID was found in the local administrators group. if (PrincipalList.GetExpirationTime(addedSids[i]).HasValue) { // The principal's rights expire at some point. if (PrincipalList.GetExpirationTime(addedSids[i]).Value > DateTime.Now) { // The principal's administrator rights expire in the future. // Nothing to do here, since the principal is already in the administrators group. } else { // The principal's administrator rights have expired. #if DEBUG string accountName = GetAccountNameFromSID(addedSids[i]); ApplicationLog.WriteInformationEvent(string.Format("Principal {0} ({1}) has been removed from the Administrators group by an outside process. Removing the principal from Make Me Admin's list.", addedSids[i], string.IsNullOrEmpty(accountName) ? "unknown account" : accountName), EventID.DebugMessage); #endif LocalAdministratorGroup.RemovePrincipal(addedSids[i], RemovalReason.Timeout); } } // TODO: This should be put back in, but it needs to account for the fact that // some principals may be added without expiration times. /* * else * { // The principal's rights never expire. This should never happen. * // Remove the principal from the administrator group. #if DEBUG * string accountName = GetAccountNameFromSID(addedSids[i]); * ApplicationLog.WriteInformationEvent(string.Format("Principal {0} ({1}) has been removed from the Administrators group by an outside process. Removing the principal from Make Me Admin's list.", addedSids[i], string.IsNullOrEmpty(accountName) ? "unknown account" : accountName), EventID.DebugMessage); #endif * LocalAdministratorGroup.RemovePrincipal(addedSids[i], RemovalReason.Timeout); * * if ( * (Settings.AutomaticAddAllowed != null) && * (Settings.AutomaticAddAllowed.Length > 0) && * (Shared.UserIsAuthorized(userIdentity, Settings.AutomaticAddAllowed, Settings.AutomaticAddDenied)) * ) * { #if DEBUG * ApplicationLog.WriteInformationEvent("User is allowed to be automatically added!", EventID.DebugMessage); #endif * LocalAdministratorGroup.AddPrincipal(userIdentity, null, null); * } * } */ } else { // Principal's SID was not found in the local administrators group. if (PrincipalList.GetExpirationTime(addedSids[i]).HasValue) { // The principal's rights expire at some point. if (PrincipalList.GetExpirationTime(addedSids[i]).Value > DateTime.Now) { // The principal's administrator rights expire in the future. string accountName = GetAccountNameFromSID(addedSids[i]); if (Settings.OverrideRemovalByOutsideProcess) { // TODO: i18n. ApplicationLog.WriteInformationEvent(string.Format("Principal {0} ({1}) has been removed from the Administrators group by an outside process. Adding the principal back to the Administrators group.", addedSids[i], string.IsNullOrEmpty(accountName) ? "unknown account" : accountName), EventID.PrincipalRemovedByExternalProcess); AddPrincipalToAdministrators(addedSids[i], null); } else { // TODO: i18n. ApplicationLog.WriteInformationEvent(string.Format("Principal {0} ({1}) has been removed from the Administrators group by an outside process. Removing the principal from Make Me Admin's list.", addedSids[i], string.IsNullOrEmpty(accountName) ? "unknown account" : accountName), EventID.PrincipalRemovedByExternalProcess); PrincipalList.RemoveSID(addedSids[i]); Settings.SIDs = PrincipalList.GetSIDs().Select(p => p.Value).ToArray <string>(); } } else { // The principal's administrator rights have expired. // No need to remove from the administrators group, as we already know the SID // is not present in the group. #if DEBUG ApplicationLog.WriteInformationEvent(string.Format("Removing SID \"{0}\" from the principal list.", addedSids[i]), EventID.DebugMessage); #endif PrincipalList.RemoveSID(addedSids[i]); Settings.SIDs = PrincipalList.GetSIDs().Select(p => p.Value).ToArray <string>(); } } /* * Rights shouldn't need to be removed here, as we already know the SID is not * a member of the local administrator group. * else * { // The principal's rights never expire. This should never happen. * // Remove the principal from the administrator. group. * LocalAdministratorGroup.RemovePrincipal(addedSids[i], RemovalReason.Timeout); * } */ } } } }