Проверьте, не зарегистрирован ли ни один пользователь в 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