PSEXEC
を使用してPowerShellスクリプトをリモートで実行しようとしています。 PowerShellスクリプトは、.cmd
バッチファイルを介して呼び出されます。これを行う理由は、実行ポリシーを変更し、PowerShellスクリプトを実行してから、実行ポリシーを再度リセットするためです。
リモートサーバーでは、do-tasks.cmd
は次のようになります。
powershell -command "&{ set-executionpolicy unrestricted}"
powershell DoTasks.ps1
powershell -command "&{ set-executionpolicy restricted}"
PowerShellスクリプトDoTasks.ps1
は、今のところこれを実行します。
Write-Output "Hello World!"
これらのスクリプトは両方ともc:\windows\system32
(今のところ)にあるので、PATH上にあります。
元のサーバーで私はこれを行います:
psexec \\web1928 -u administrator -p "adminpassword" do-tasks.cmd
これを実行すると、コマンドラインで次の応答が返されます。
c:\Windows\system32>powershell -command "&{ set-executionpolicy unrestricted}"
スクリプトはそれ以上実行されません。
Ctrl-cでスクリプトを壊すことができず、^ C文字が表示されるだけです。キーボードから入力を入力すると、文字がコンソールにエコーされます。
リモートサーバーでは、PowerShell.exeとCMD.exeがタスクマネージャーの[プロセス]タブで実行されていることがわかります。これらのプロセスを終了すると、制御は元のサーバーのコマンドラインに戻ります。
.cmd
を含む単純な@echo hello world
バッチファイルでこれを試しましたが、問題なく動作します。
RDPセッションを介してリモートサーバーでdo-tasks.cmd
を実行しても問題ありません。
発信元サーバーはWindows2003 SP2を実行しており、リモートサーバーはWindows 2008SP2を実行しています。
PSEXEC
を介して実行すると、リモートバッチファイルがスタックするのはなぜですか?
サーバーは2k8を実行しているので、UACが問題を引き起こしているのではないかと思います。また、psexecの代わりにwinrmを使用することをお勧めします。 Powershell Remotingは、PowerShell2.0の最高の新機能の1つでした。
これはPOSHの一般的な問題です。問題はstdin
がハングすることです。これを試して:
c:\Windows\system32>powershell -command "&{ set-executionpolicy unrestricted}" < NUL
フォーラムの回答のほとんどは、エコーやパイピングなどの回避策でこれを解決し、PowershellがSTDINから何らかの入力を受け取るようにします。
しかし、PowerShell内には解決策があります。オプション-inputformatでpowershellを起動するだけです。
powershell -inputformat none -command ...
これにより、Win2003およびWin2008のpsexecを介したハングの問題が解決されます。