ローカル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があるので、ユーザーセッションで実行する必要があります。これを行う方法はありますか?アドバイス、ありがとう。
以下のコマンドを使用して、インタラクティブモードでの実行を実現できます。
C:\psexec.exe \\%Host% -i 0 -d -u %ADMINID% -p %ADMINPASSWORD% -w %PATH% cmd /c MyApplication.exe
起動したアプリケーションから終了コードをキャプチャしたくない場合は、上記が機能します。
オンラインで検索すると、セッション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スイッチを追加してみてください:動作するはずです)