Ответ 1
Используйте WTSGetActiveConsoleSessionId()
, чтобы определить, зарегистрирован ли кто-либо локально. Используйте WTSEnumerateSessions()
, чтобы определить, существует ли вообще какой-либо сеанс (включая сеансы служб удаленных терминалов).
Я пишу приложение Windows Service, которое прослушивает подключения и выполняет определенные задачи, как указано в другом приложении, запущенном на другом компьютере в сети.
Одна из задач гарантирует, что пользователь не будет входить в систему, блокирует рабочую станцию, удаляет некоторые файлы и затем перезапускает систему. Я рассмотрел использование этого решения, чтобы просмотреть список запущенных процессов и проверить имена пользователей, определяя, не зарегистрирован ли пользователь, сопоставляя имена пользователей с SYSTEM, NETWORK, и т.д. Я понял, что у меня работает PostgreSQL, которая использует учетную запись пользователя с именем postgres, так что это не сработает. Проверка того, работает ли explorer.exe, также не будет работать, поскольку sometmes explorer падает, или я иногда завершаю процесс самостоятельно и перезапускаю его.
Что было бы хорошим способом определения того, что пользователь NO не зарегистрирован на рабочей станции с помощью С#?
Используйте 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;
}
Статья CodeProject "" Использование локального центра безопасности для перечисления сеансов пользователей в .NET" может быть тем, что вы ищете. Код перечисляет пользователей и может определять, какие пользователи (если есть) являются интерактивными (то есть, какие пользователи являются реальными людьми).
Вы можете использовать WMI
select UserName from Win32_ComputerSystem
Вы пытались проверить, работает ли explorer.exe
или нет.
Почему бы не пойти на процесс winlogon.exe
?
public bool isLoggedOn()
{
Process[] pname = Process.GetProcessesByName("winlogon");
if (pname.Length == 0)
return false;
else
return true;
}