web-dev-qa-db-ja.com

別のマシンにログオンしているユーザーのセッションIDを見つけることはできますか?

コマンドラインから同じネットワーク上の別のコンピューターでアプリケーションを開きたい。ここでのシナリオは、ユーザーが約20台のコンピューターに囲まれた部屋にいて、画面間を移動せずにすべてのコンピューターで同じアプリを起動できるようにしたいというものです。次のように PsExec を使用して、この基本的な機能を取得できることを発見しました。

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

computerusernamepassword、およびprogramについては、問題ありません。ネットワーク上の特定のマシンにログオンしている特定のユーザーに割り当てられているSessionIDを特定する方法を知っている人はいますか?代わりに、私が達成しようとしていることに取り組むためのより良い方法はありますか?

7
Dan Tao

qwinsta(またはquery session)すべてのターミナルサーバーセッションを一覧表示するツール。

一部のサーバーでは、リモートで直接使用できます。

 qwinsta/server リモートホスト

ただし、ほとんどの場合、実行する必要がありますpsexec

 psexec \\リモートホスト qwinsta 
4
user1686

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
Wernight

psexecはセッションIDを必要としません。

3
Andrew Wiggin

コンピューターで Process Explorer を使用すると、Usersメニューを使用してセッションIDを確認できます。メニューの各エントリの先頭にある番号がセッションIDです。

通常、デフォルトのセッションには0を使用できるはずです。

1
heavyd

正しいセッションIDを使用すると、複数の異なるユーザーがアクセスするリモートマシンでジョブを適切に開始する必要があります。

バッチコマンドpsexecの組み合わせをいじった後に見つけたものは次のとおりです。私はそれをすべて* .batファイルに入れて4パラメーター :( P1)UserName、(P2)ServerName、(P3)Login、(P4)Passwordを取りました。

実行後(成功した場合)、セッション情報は単純に4変数 :( V1)SessionName、(V2)SessionUser、(V3)SessionId、(V4)SessionStateに格納されます。

バッチはremote infoアクセス用に設計されていますが、-localの使用に簡単に適応できます。

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

注:

  • ループ区切り文字は「>」と「スペース」です。これは、「querysession」コマンド出力に「>」が含まれており、ターゲットマシン上のアクティブなセッションを示しているためです。通常はファイルへのリダイレクトとして解釈されるため、ループがこの厄介な文字を無視する方法を見つける必要がありました。
  • 私は自発的にセッションtypeおよびdeviceの出力を無視しました。必要に応じて、最終的に%% eと%% fを使用して追加し、ループ内のさらに2つの変数をフィードできると思います。
  • バッチコメントで説明されているように、バッチをlocalマシンで使用するには、 'psexec \\ ...'呼び出しを使用しないでください。'query session ^ | find/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
0
noam