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

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

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

Что было бы хорошим способом определить, что ни один пользователь не вошел на рабочую станцию ​​с использованием C#?

5 ответов

Решение

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

Другой вариант, если вы не хотите иметь дело с 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;
}

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

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

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

Вы могли бы использовать WMI

select UserName from Win32_ComputerSystem
Другие вопросы по тегам