Убедитесь, что в Windows не зарегистрирован ни один пользователь

Я пишу приложение Windows Service, которое прослушивает подключения и выполняет определенные задачи, как указано в другом приложении, запущенном на другом компьютере в сети.

Одна из задач гарантирует, что пользователь не будет входить в систему, блокирует рабочую станцию, удаляет некоторые файлы и затем перезапускает систему. Я рассмотрел использование этого решения, чтобы просмотреть список запущенных процессов и проверить имена пользователей, определяя, не зарегистрирован ли пользователь, сопоставляя имена пользователей с SYSTEM, NETWORK, и т.д. Я понял, что у меня работает PostgreSQL, которая использует учетную запись пользователя с именем postgres, так что это не сработает. Проверка того, работает ли explorer.exe, также не будет работать, поскольку sometmes explorer падает, или я иногда завершаю процесс самостоятельно и перезапускаю его.

Что было бы хорошим способом определения того, что пользователь NO не зарегистрирован на рабочей станции с помощью С#?

Ответы

Ответ 1

Используйте WTSGetActiveConsoleSessionId(), чтобы определить, зарегистрирован ли кто-либо локально. Используйте WTSEnumerateSessions(), чтобы определить, существует ли вообще какой-либо сеанс (включая сеансы служб удаленных терминалов).

Ответ 2

Другой вариант, если вы не хотите иметь дело с P/Invokes: используйте Cassia.

using Cassia;

public static bool IsSomeoneLoggedOn(string server)
{
    foreach (ITerminalServicesSession session in new TerminalServicesManager().GetSessions(server))
    {
        if (!string.IsNullOrEmpty(session.UserName))
        {
            return true;
        }
    }
    return false;
}

Ответ 3

Статья CodeProject "" Использование локального центра безопасности для перечисления сеансов пользователей в .NET" может быть тем, что вы ищете. Код перечисляет пользователей и может определять, какие пользователи (если есть) являются интерактивными (то есть, какие пользователи являются реальными людьми).

Ответ 4

Вы можете использовать WMI

select UserName from Win32_ComputerSystem

Ответ 5

Вы пытались проверить, работает ли explorer.exe или нет. Почему бы не пойти на процесс winlogon.exe?

public bool isLoggedOn()
{
    Process[] pname = Process.GetProcessesByName("winlogon");
    if (pname.Length == 0)
        return false;
    else
        return true;
}