コマンドラインから同じネットワーク上の別のコンピューターでアプリケーションを開きたい。ここでのシナリオは、ユーザーが約20台のコンピューターに囲まれた部屋にいて、画面間を移動せずにすべてのコンピューターで同じアプリを起動できるようにしたいというものです。次のように PsExec を使用して、この基本的な機能を取得できることを発見しました。
psexec \\[computer] -u [username] -p [password] -d -i [SessionID] [program]
computer
、username
、password
、およびprogram
については、問題ありません。ネットワーク上の特定のマシンにログオンしている特定のユーザーに割り当てられているSessionID
を特定する方法を知っている人はいますか?代わりに、私が達成しようとしていることに取り組むためのより良い方法はありますか?
qwinsta
(またはquery session
)すべてのターミナルサーバーセッションを一覧表示するツール。
一部のサーバーでは、リモートで直接使用できます。
qwinsta/server リモートホスト
ただし、ほとんどの場合、実行する必要がありますpsexec:
psexec \\リモートホスト qwinsta
PowerShellバージョンを試すことができます:
Get-Process powershell | Select-Object SessionId | Format-List
またはMSDOSバッチバージョン:
tasklist /FI "IMAGENAME eq tasklist.exe" /FI "USERNAME eq %USERNAME%" /FO LIST | find "Session#:"
psexecはセッションIDを必要としません。
コンピューターで Process Explorer を使用すると、Usersメニューを使用してセッションIDを確認できます。メニューの各エントリの先頭にある番号がセッションIDです。
通常、デフォルトのセッションには0を使用できるはずです。
正しいセッション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%
注:
この質問にはやりすぎですが、これが役立つ場合に備えて
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