Вы могли попытаться использовать недокументированное /sm
параметр для query session
(в пакетном файле) к вещам вида более легко:
FOR /f %%G IN ('query session /sm') DO tsdiscon %%G
Да, с помощью tsdiscon из командной строки:
tsdiscon n
где n должен быть заменен идентификатором сессии.
Можно получить число сессии от
query session
Так как Вы говорите, что хотите закрыть все сеансы на локальном компьютере, я предполагаю, что необходимо будет быть осторожны относительно порядка, в котором Вы делаете это (т.е. закройте свой сеанс в последний раз).
Можно хотеть проверить Общественные Расширения Powershell. Это включает, Добираются, Остановка и TerminalSession cmdlets Разъединения.
Можно использовать tsdiscon утилиту для разъединения сессий. При использовании "команды" сессий запроса от командной строки Вы видите список идентификаторов и затем даете tsdiscon команду для каждого.
Конструкция цикличного выполнения как это должна работать
FOR /f %%G IN ('q.bat') DO tsdiscon %%G
где q.bat
query session /sm | find "Active"
Это только разъединит удаленные сеансы и проигнорирует пользователя консоли.
Можно разъединить локальные или удаленные сеансы с tsdiscon.
Disconnects a terminal session.
TSDISCON [sessionid | sessionname] [/SERVER:servername] [/V]
sessionid The ID of the session.
sessionname The name of the session.
/SERVER:servername Specifies the Terminal server (default is current).
/V Displays information about the actions performed.
Команда TSDiscon разъединит службы удаленных рабочих столов (RDP) сессии. Используемый самостоятельно разъединит текущую сессию, можно указать идентификатор сессии сессии, которую Вы хотите разъединить, можно также предоставить имя сервера для разъединения от.
Полное изложение может быть найдено здесь.
Вы не указывали, хотите ли Вы сделать это с закрытием или перезапуском компьютера. Но если Вы не возражаете против перезапуска или завершения работы, можно просто звонить:
shutdown -r -f -m \\computer_to_restart
Это на самом деле вызовет перезапуск компьютера.
Я нашел, что TSDISCON не удаляет "Диск" onnected сессии.
Я заменил TSDISCON выходом из системы.
Я знаю, что OP довольно старый, но он должен делать то, что вам нужно (и если кто-то еще ищет что-то, чтобы сделать то же самое, я думал, что все равно отвечу) .
Аналогичным образом вы можете использовать сеанс запроса / сброса
вместо q / rwinsta
...
FOR /F %%A IN (computers.txt) DO (
FOR /f "tokens=2" %%i IN ('qwinsta /SERVER:%%A ^| find /i "disc"') DO ECHO %%i | rwinsta %%i /SERVER:%%A /V
)
FOR / F% A IN (c: \ scripts \ ps \ computers.txt) DO (FOR / f "tokens = 2 "% i IN ('qwinsta / SERVER:% A ^ | find / i" disc "') ** DO if"% i "NEQ" 0 "ECHO% i ** | rwinsta% i / SERVER:% A / V )
Даже вопрос очень старый, почти нет решений для всех версий без qwinsta / query / tsdiscon, а именно для всех домашних версий Windows.
Однако существует простая версия PowerShell для отключения сеанса:
$code = @'
[DllImport("wtsapi32.dll")]
static extern IntPtr WTSOpenServer([MarshalAs(UnmanagedType.LPStr)] String pServerName);
[DllImport("wtsapi32.dll")]
static extern void WTSCloseServer(IntPtr hServer);
[DllImport("Wtsapi32.dll")]
static extern bool WTSDisconnectSession(System.IntPtr hServer, int SessionId, bool bWait);
public static void DisconnectSession (String ServerName, int SessionId)
{
IntPtr serverHandle = WTSOpenServer(ServerName);
WTSDisconnectSession(serverHandle, SessionId, true);
WTSCloseServer(serverHandle);
}
'@
$tstType=Add-Type -name Test -MemberDefinition $code -PassThru
#$tstType::DisconnectSession("localhost", 2)
Можно получить идентификатор сеанса, например с getProcesss
. Чтобы отключить (не выйти из системы!) Сеанс, используйте $ tstType :: DisconnectSession ("localhost", 2)
.