Проверьте, не зарегистрирован ли ни один пользователь в Windows - PullRequest
14 голосов
/ 15 февраля 2009

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

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

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

Ответы [ 5 ]

16 голосов
/ 15 февраля 2009

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

5 голосов
/ 09 апреля 2009

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

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;
}
4 голосов
/ 20 января 2013

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

public bool isLoggedOn()
{
    Process[] pname = Process.GetProcessesByName("winlogon");
    if (pname.Length == 0)
        return false;
    else
        return true;
}
3 голосов
/ 15 февраля 2009

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

2 голосов
/ 15 февраля 2009

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

select UserName from Win32_ComputerSystem
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...