В многопользовательской среде есть приложение, которое можно открыть только в одном сеансе на рабочей станции. Пользователи часто переходят с ПК на ПК, оставляя приложение открытым, а рабочую станцию - заблокированной. Отключение переключения пользователей является определяющим фактором производительности. Мне нужна система, чтобы принудительно выйти из системы любого пользователя, кроме сеанса Consul. Идентификатор сеанса - это переменная, которую невозможно предсказать. Это то, что у меня получилось ...
@ echo off
query session > c:\users\session.txt
powershell -Command "Get-Content c:\users\session.txt | Where-Object {$_ -notmatch 'console'} | Set-Content c:\users\session2.txt"
for /f "skip=2 tokens=2," %i in (c:\users\session2.txt) DO C:\Windows\System32\logoff.exe %i
Цель состоит в том, чтобы поместить это в .bat для запуска при входе пользователя в систему, чтобы тот, кто ДЕЙСТВИТЕЛЬНО использует компьютер, мог использовать приложение. Dataloss неактивного сеанса не имеет значения. В идеале rdp-tcp и сервисы также должны оставаться активными сессиями.
Более простой подход - просто убить все экземпляры приложения, которые НЕ работают в активном сеансе.
Похоже, вы хорошо начали получать информацию о сеансе из PowerShell ... вы также можете использовать Qwinsta команда, чтобы получить все идентификаторы сеанса. Оттуда проанализируйте список, чтобы получить только идентификаторы сеанса, помеченные как «активные».
Оттуда вы можете использовать Taskkill команда с фильтром, исключающим активный идентификатор сеанса, но убивающим процесс везде:
taskkill / f / fi "СЕССИЯ ne 1" / im apptokill.exe
где 1 выше был идентификатором сеанса активного сеанса. Приведенная выше команда завершит работу всех экземпляров apptokill.exe, НЕ запущенных с идентификатором сеанса 1.
Ну, это не совсем то, о чем вы просите, но это близко: средство для автоматического выхода пользователей из системы, когда они классифицируются как простаивающие:
https://4sysops.com/archives/automatically-log-off-idle-users-in-windows/