Могу ли я найти идентификатор сеанса для пользователя, вошедшего в систему на другом компьютере?

32995
Dan Tao

Я хочу открыть приложение на другом компьютере в той же сети через командную строку. Сценарий здесь заключается в том, что пользователь находится в комнате, окруженной примерно 20 компьютерами, и хочет иметь возможность запускать одно и то же приложение на каждом компьютере, не переходя от экрана к экрану, открывая его на каждой отдельной машине. Я обнаружил, что могу получить базовую функциональность для этого, используя PsExec следующим образом:

psexec \\[computer] -u [username] -p [password] -d -i [SessionID] [program] 

Для computer, username, passwordи program, я хорошо. Кто-нибудь знает способ, которым я могу выяснить, который SessionIDназначен конкретному пользователю, вошедшему в систему на определенном компьютере в сети? С другой стороны, есть ли лучший способ добиться того, чего я пытаюсь достичь?

7

6 ответов на вопрос

4
grawity

Вы можете использовать инструмент qwinsta(или query session) для просмотра списка всех сеансов сервера терминалов.

Некоторые серверы позволяют использовать его удаленно напрямую:

qwinsta / server remotehost 

Однако в большинстве случаев вам придется запускать его через psexec :

psexec \\ remotehost qwinsta 
3
Andrew Wiggin

psexec не требует идентификатора сеанса.

Он не * требует * идентификатора сеанса в том смысле, что он по умолчанию равен 0, но это значение по умолчанию бесполезно, если в систему вошли несколько пользователей и вы хотите выбрать конкретного. grawity 10 лет назад 2
3
Wernight

Вы можете попробовать версию PowerShell :

Get-Process powershell | Select-Object SessionId | Format-List 

или пакетная версия MSDOS :

tasklist /FI "IMAGENAME eq tasklist.exe" /FI "USERNAME eq %USERNAME%" /FO LIST | find "Session#:" 
1
heavyd

Используя Process Explorer на компьютере, вы можете использовать меню « Пользователи» для определения идентификатора сеанса. Номер в начале каждой записи в меню является идентификатором сеанса.

Похоже, что обычно вы должны использовать 0 для сеанса по умолчанию.

Выглядит довольно полезно; Тем не менее, я ищу идентификатор сеанса, назначенный пользователю на * другом * компьютере. Похоже, что Process Explorer применим только к машине, на которой он работает. Это правильно? Dan Tao 14 лет назад 1
Да это правда. Я не нашел способ сделать это удаленно. heavyd 14 лет назад 0
0
Fabien Teulieres

Using the correct session id can indeed be necessary to adequately start a job on a remote machine that is accessed by several distinct users.

Here's what I found after tinkering with a combination of batch commands and psexec. I rolled it all in a *.bat file taking 4 parameters: (P1)UserName, (P2)ServerName, (P3)Login, (P4)Password.

After execution (and if successful), the session info is simply stored in 4 variables: (V1)SessionName, (V2)SessionUser, (V3)SessionId, (V4)SessionState.

The batch is designed for remote info access, but can easily be adapted to local usage.

@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% 

NOTES:

  • The loop delimiters are '>' and 'space'. That's because the 'query session' command output contains a '>' to indicate the active session on the targeted machine. I had to find a way for the loop to ignore this troublesome character, as it is normally interpreted as redirection to a file.
  • I voluntarily ignored the session type and device outputs. I believe they could eventually be added using %%e and %%f to feed 2 more variables in the loop if need be.
  • As explained in the batch comment, to use the batch on the local machine you shouldn't use the 'psexec \\...' call but: 'query session ^| find /i "%UserName%"' instead. In that case, only parameter P1 is needed.
0
noam

Избыток за этот вопрос, но на всякий случай это пригодится

FUNCTION Get-UserNameSessionIDMap ($Comp) { $quserRes = quser /server:$comp | select -skip 1 if (!$quserRes) { RETURN } $quCSV = @() $quCSVhead = "SessionID","UserName","LogonTime" foreach ($qur in $quserRes)  { $qurMap = $qur.Trim().Split(" ") | ? {$_} if ($qur -notmatch " Disc ") { $quCSV += $qurMap[2] + "|" + $qurMap[0] + "|" + $qurMap[5] + " " + $qurMap[6] } else { $quCSV += $qurMap[1] + "|" + $qurMap[0] + "|" + $qurMap[4] + " " + $qurMap[5] } #disconnected sessions have no SESSIONNAME, others have ica-tcp#x } $quCSV | ConvertFrom-CSV -Delimiter "|" -Header $quCSVhead } #end function Get-UserNameSessionIDMap