Использование правильного идентификатора сеанса действительно может быть необходимо для адекватного запуска задания на удаленной машине, к которой обращаются несколько отдельных пользователей.
Вот что я нашел после работы с комбинацией командных команд и psexec. Я свернул все это в файл * .bat, принимая 4 параметра: (P1)UserName, (P2)ServerName, (P3)Login, (P4)Password.
После выполнения (и в случае успеха) информация о сеансе просто сохраняется в 4 переменных: (V1) SessionName, (V2) SessionUser, (V3) SessionId, (V4) SessionState.
Пакет предназначен для удаленного доступа к информации, но может быть легко адаптирован для локального использования.
@echo off
REM This program gets remote session info on a given server, for a given user.
REM It needs 4 parameters: UserName, ServerName, Login, Password
REM For a local session, simply replace the 'psexec \\...' command parsed by the 'for'
REM loop with: 'query session ^| find /i "%UserName%"'
REM In that case, only the UserName parameter is necessary to call this batch.
set UserName=%1
set ServerName=%2
set Login=%3
set Password=%4
set SessionName=
set SessionUser=
set SessionId=
set SessionState=
for /f "tokens=1,2,3,4 delims=^> " %%a in ('psexec \\%ServerName% -u %Login% -p %Password% query session ^| find /i "%UserName%"') do (
REM Test iterator because a disconnected session may no longer have a name!
if /I "%%b"=="%UserName%" (
set SessionName=%%a
set SessionUser=%%b
set SessionId=%%c
set SessionState=%%d
)
if /I "%%a"=="%UserName%" (
set SessionName=[unknown]
set SessionUser=%%a
set SessionId=%%b
set SessionState=%%c
)
)
echo Session info:
echo - Name: %SessionName%
echo - User: %SessionUser%
echo - ID: %SessionId%
echo - State: %SessionState%
ЗАМЕТКИ:
- Разделителями цикла являются «>» и «пробел». Это связано с тем, что выходные данные команды query session содержат «>» для обозначения активного сеанса на целевом компьютере. Я должен был найти способ, чтобы цикл игнорировал этот неприятный символ, так как он обычно интерпретируется как перенаправление в файл.
- Я добровольно проигнорировал тип сеанса и выходные данные устройства . Я полагаю, что в конечном итоге они могут быть добавлены с использованием %% e и %% f для подачи еще 2 переменных в цикл, если это будет необходимо.
- Как поясняется в комментарии к пакету, для использования пакета на локальном компьютере не следует использовать вызов 'psexec \\...', а: 'сеанс запроса ^ | вместо этого найдите /i "% UserName%" ' . В этом случае нужен только параметр P1 .