web-dev-qa-db-ja.com

Windows Server 200364ビットでPsexecを使用するための回避策

ローカルOS:Windows Server 2003リモートOS:Windows Server 200364ビット

多くのスケジュールされたバッチスクリプトが実行されている管理サーバー(32ビット)があります。スクリプトの1つは、psexecを使用してリモートホスト(64ビット)でプロセスを起動することです。

私のスクリプトは単に以下を実行します。ただし、"The handle is invalid"が返されます。

C:\psexec.exe \\%Host% -i 1 -d -u %ADMINID% -p %ADMINPASSWORD% -w %PATH% MyApplication.exe

オンラインで検索すると、セッション1へのRDPとセッション1へのpsexecは、異なる環境と異なる使用可能なシステムリソース(ハンドル)を持っている可能性があることがわかりました。そのため、おそらく私のpsexecスクリプトが機能しません。

ただし、スクリプトのコンソールセッションで実行されているpsexecは機能します。

C:\psexec.exe \\%Host% -i 0 -d -u %ADMINID% -p %ADMINPASSWORD% -w %PATH% MyApplication.exe

WoW64でpsexecを実行したり、psexecにWoW64でアプリケーションを起動させたりすると、64ビットマシンでの回避策になると言う人もいます。コンソールセッションのpsexecも同様だと思います。誰でも確認できますか?

私の質問:私のアプリケーションにはGUIがあるので、ユーザーセッションで実行する必要があります。これを行う方法はありますか?アドバイス、ありがとう。

1
Stan

以下のコマンドを使用して、インタラクティブモードでの実行を実現できます。

C:\psexec.exe \\%Host% -i 0 -d -u %ADMINID% -p %ADMINPASSWORD% -w %PATH% cmd /c MyApplication.exe 

起動したアプリケーションから終了コードをキャプチャしたくない場合は、上記が機能します。

3

オンラインで検索すると、セッション1へのRDPとセッション1へのpsexecは、異なる環境と異なる使用可能なシステムリソース(ハンドル)を持っている可能性があることがわかりました。そのため、おそらく私のpsexecスクリプトが機能しません。

いいえ、それは意味がありません。一部のハンドルはプロセス間で共有(実際には継承)できることは事実ですが、プログラミングの範囲外では意味がありません。

WoW64でpsexecを実行したり、psexecにWoW64でアプリケーションを起動させたりすると、64ビットマシンでの回避策になると言う人もいます。コンソールセッションのpsexecも同様だと思います。誰でも確認できますか?

WoW64は、「Windows onWindows64」を意味します。基本的には、Windows 64OS内の32ビット環境です。すべてのwin32実行可能ファイルはWoW64の「下」で実行されます。64ビットバージョンのOS関数を使用できないため、を実行する他の方法はありません。WoW64によって提供される変換レイヤーを通過する必要があります。

私の質問:私のアプリケーションにはGUIがあるので、ユーザーセッションで実行する必要があります。これを行う方法はありますか?アドバイス、ありがとう。

これがおそらくアプリケーションが失敗する理由です(PSexecではなくアプリ):ウィンドウへのハンドルを取得しようとしていますが、インタラクティブ環境で実行されていないため、この呼び出しは失敗します(私はそれがしようとしていると推測していますExplorerなどへのハンドルを取得します)。

(それに加えて、Rupasri Somavarapuが提案したように-iスイッチを追加してみてください:動作するはずです)

1
Stephane