private void IterateCleanupUsers()
{
lock (this)
{
List <CleanupTask> tasks = CleanupTasks.GetEligibleTasks();
List <string> loggedOnUsers = null;
try
{
loggedOnUsers = LoggedOnLocalUsers();
}
catch (System.ComponentModel.Win32Exception e)
{
m_logger.ErrorFormat("Error (ignored) LoggedOnLocalUsers {0}", e);
return;
}
m_logger.DebugFormat("IterateCleanupUsers Eligible users: {0}", string.Join(",", tasks));
m_logger.DebugFormat("IterateCleanupUsers loggedOnUsers: {0}", string.Join(",", loggedOnUsers));
foreach (CleanupTask task in tasks)
{
try
{
using (UserPrincipal userPrincipal = LocalAccount.GetUserPrincipal(task.UserName))
{
// Make sure the user exists
if (userPrincipal == null)
{
// This dude doesn't exist!
m_logger.DebugFormat("User {0} doesn't exist, not cleaning up.", task.UserName);
CleanupTasks.RemoveTaskForUser(task.UserName);
continue;
}
// Is she logged in still?
if (loggedOnUsers.Contains(task.UserName, StringComparer.CurrentCultureIgnoreCase))
{
continue;
}
m_logger.InfoFormat("Cleaning up: {0} -> {1}", task.UserName, task.Action);
try
{
switch (task.Action)
{
case CleanupAction.SCRAMBLE_PASSWORD:
LocalAccount.ScrambleUsersPassword(task.UserName);
break;
case CleanupAction.DELETE_PROFILE:
LocalAccount.RemoveUserAndProfile(task.UserName);
break;
default:
m_logger.ErrorFormat("Unrecognized action: {0}, skipping user {1}", task.Action, task.UserName);
throw new Exception();
}
}
catch (Exception e)
{
m_logger.WarnFormat("Cleanup for {0} failed, will retry next time around. Error: {1}", task.UserName, e);
continue;
}
// All done! No more cleanup for this user needed
CleanupTasks.RemoveTaskForUser(task.UserName);
}
}
catch (Exception e)
{
// If something goes wrong, we log the exception and ignore.
m_logger.ErrorFormat("Caught (ignoring) Exception {0}", e);
}
}
}
}