Я пытаюсь выяснить способ отключения пользователей в локальных сеансах Windows из службы Windows, написанной на С#.
Вот фон к проблеме: Мне нужно управлять временем использования компьютера для набора пользователей; когда истечет их отведенное время, я хочу их отключить. Это происходит в контексте домена W2K8. К сожалению, элементы управления временем входа в Windows просто отключают пользователя от ресурсов сервера; нет способа заставить их сеансы прекратить с помощью этого метода.
Мой подход заключается в создании службы Windows, которую я буду развертывать по всему домену; служба будет работать на каждом клиентском компьютере. Через определенные промежутки времени служба будет перечислять зарегистрированных пользователей на компьютере, вызывать в базу данных, чтобы добавить время входа в систему с момента последнего вызова общего числа за день, и если они достигли своего максимума, выйдите из системы ( с пятиминутным предупреждением). Примечание. Это НЕ сеансы служб терминалов, они являются регулярными локальными интерактивными входами. Обратите также внимание на то, что на машине может быть несколько учетных записей из-за функциональности "переключателя пользователя" в Win7 и Vista. На всех моих клиентских ПК будет работать Win7. Служба Windows будет работать как локальная система, поэтому привилегии не должны быть проблемой.
Я могу успешно создать список зарегистрированных пользователей на машине по имени пользователя с помощью WMI. Вот фрагмент этого кода:
List<string> loggedInUsers = new List<string>();
ManagementClass mc = new ManagementClass("Win32_Process");
ManagementObjectCollection moc = mc.GetInstances();
foreach (ManagementObject mo in moc)
{
ROOT.CIMV2.Process process = new ROOT.CIMV2.Process(mo);
string domain, user;
uint pid;
process.GetOwner(out domain, out user);
pid = process.ProcessId;
if (process.Name.Trim().ToLower() == "explorer.exe")
loggedInUsers.Add(user);
}
return loggedInUsers;
Однако я изо всех сил пытаюсь найти метод, который позволит мне выйти из выбранной пользовательской сессии. Я знаю, что могу выключить машину, но я не хочу этого - это убьет все сеансы пользователей.
Какие-нибудь идеи? Спасибо, что прочитали этот длинный пост!