同じネットワーク上に2つのWindows 7マシンがセットアップされています。
私は、winrm
と通信できるように必要なすべてのものを有効にしました。
次のコマンドを実行すると:
Invoke-Command -ComputerName REMOTE-PC -ScriptBlock { Start-Process calc.exe }
正常に動作しますが、プログラムはリモートマシンでは表示されません。私の知る限り、これは予想される動作です。
プロセスが正しく開始され、セッションが終了するとすぐに閉じられると思います。ホストマシンに表示されるようにプログラムを実行するにはどうすればよいですか?
設計上、実際には他の人のセッションでプロセスを起動できるとは限りません。
(明確にするために、コンピューターのデスクトップで対話的にログオンしていて、同じ資格情報を使用して同じマシンに同時に別のネットワークログオンしている場合でも、それらは2つの異なるログオンとしてカウントされますセッション)
これは単にWindows自体のセキュリティモデルに反するものであり、それを覆そうとする試みは避けられます。そのため、これを行うための簡単でサポート可能な方法を見つけることはできません。技術的には可能ですが、ローカルシステムとして実行し、ログオンしている別のユーザーのセキュリティトークンをコピーし、その代替トークンでプロセスを起動する必要があります。これにはWindows APIが必要になります。これは、Powershellがあまり得意でないことのほとんどです。詳細については、Windows APIのWTSQueryUserToken
およびCreateProcessAsUser
を参照してください。
Cheeriosで完全におしっこをしないようにするもう1つのアイデアは、プロセスを起動するスケジュールされたタスクをリモートで作成することでこれを実現できる可能性があります。詳細は http://blogs.technet.com/b/heyscriptingguy/archive/2005/09/06/how-can-i-remotely-start-an-interactive-process.aspx を参照してくださいその上で。
編集:ああ、私は忘れました... PsExecと-i
パラメータはそれを行うことができます。ログオンセッションIDを指定する必要があります。そしてそれを行う権限を持っています。 PsExecがローカルシステムとして実行される一時的なサービスをインストールするという事実を利用して、私が言及したのと同じWindows APIを使用する可能性が最も高いです。
別の回答で述べたように、PsExecを使用してこれを機能させることができました。
C:\Windows\PSTools
_に解凍しますC:\Windows\PSTools
_を追加しますtasklist
は機能しますが、豪華なワンライナー:$session = tasklist /fo CSV | findstr RDP ; $session = $session.Split(",")[3] ; $session.Split('"')[1]
)PsExec.exe -s -i 123 calc.exe
_( "123"はRDPセッションID)これは私がAnsible 2.3.0でそれをやっている方法です:
_- name: get RDP session number
win_Shell: "{{ item }}"
with_items:
- $session = tasklist /fo CSV | findstr RDP ; $session = $session.Split(",")[3] ; $session.Split('"')[1]
register: rdp_session
- name: start calc.exe
win_Shell: PsExec.exe -s -i {{ rdp_session.results[0].stdout_lines[0] }} calc.exe
_
リモートマシンで「呼び出し可能なフック」を作成できます。これは、「ユーザーがログオンしたときにのみ実行する」に設定されたスケジュールタスクであり、実行時にログインするユーザーのアカウントで実行するように割り当てられています。タスクのアクションは、実行する実行可能ファイルです。
スケジュールされたタスクは、powershellまたはschtasksを介してリモートで作成でき、その後、schtasksまたはpowershellのStart-ScheduledTaskを使用して、タスク自体の「名前」によって単に呼び出されます。
タスクを呼び出すには、指定した名前でタスクを参照します。
schtasks /run /TN "mytaskname" /s "Host" /u "user" /p "password"
スケジュールされたタスクをリモートで作成するには、Powershellのschtasks.exeまたはNew-ScheduledTaskPrincipalを使用します。タスクの実行可能ファイルまたは「アクション」アイテムにファイルシステムで「管理者として実行」のフラグが付けられている場合、そのプロパティを適切に設定するには、タスクの作成中にタスクにNew-ScheduledTaskPrincipal資格情報を添付する必要があります。
現在ログインしているユーザーを移動ターゲットにすることができますが、スケジュールされたタスクの作成自体の前に、Powershellを介してGet-LoggedOnUserでクエリできます。
そのような詳細なコードは今後48時間で公開されます。基本的な構造をすべての人が利用できるようにしたいと考えました。
RDPがビクターの答えでプロセスIDを取得するのを避けたい場合は、リモートマシンでquery session
コマンドを呼び出すことで実行できます。 Powershellスクリプトのサンプル
$user = "some_user"
$password = "password of the user"
$ComputerName = "name of the remote machine"
$processId = Invoke-Command $session -ScriptBlock {
param($user)
$sessions = query session $user;
return $sessions[1].split(" ", [System.StringSplitOptions]::RemoveEmptyEntries)[2];
} -ArgumentList ($user)
PsExec \\$ComputerName -u $user -p $password -h -i $processId [some executable name] [arguments to be passed if any]