7

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

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

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

6 ответов6

4

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

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

qwinsta /server remotehost

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

psexec \\remotehost qwinsta
3

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

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

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

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

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

1

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

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

0

Использование правильного идентификатора сеанса действительно может быть необходимо для адекватного запуска задания на удаленной машине, к которой обращаются несколько отдельных пользователей.

Вот что я нашел после работы с комбинацией командных команд и 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 .
0

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .