2

Webページからリモートホストで.batファイルを実行しようとしています。

PSEXECSVC(ホスト上)は、バッチの実行後にハングして閉じないため、サーバーは無期限に待機します。
コンソールアプリケーションでまったく同じコード(下部を参照)を実行すると、サービスが終了し、すべてが正常になります...

奇妙な部分は、バッチファイルが1つのライナーエコーで構成されている場合です。

@echo off
echo ------ Start -----
exit

PsExecSvcが閉じ "------ Start -----"、ページに表示されます。(これが私が欲しいものです..)

一方で、

@echo off
echo ------ Start -----
echo echo2

exit

PSEXECSVCは実行の最後にハングします...

PSEXECSVCを手動で強制終了すると、"------ Start -----"表示とStdErrの出力のみが表示されます。

PsExecv1.98-プロセスをリモートで実行する

Copyright(C)2001-2010マーク・ルシノビッチ

Sysinternals-www.sysinternals.com

ハンドルが無効です。

novi2に接続しています...

novi2でPsExecサービスを開始しています...

novi2でPsExecサービスに接続しています...

novi2でC:/dbInfo.batを開始しています...

novi2でのPsExecサービスとの通信エラー:

バッチファイルで何が実行されていても、StdOutの最初の行のみがリダイレクトされ、psexecsvcがハングします(ただし、バッチ全体が実行された後:O)。

実行中の場合:

info.bat:

 @echo off
 cscript /nologo test.vbs
 exit

test.vbs:

Set objOut = Wscript.StdOut
objOut.WriteLine "----------------------------------"
objOut.Writeline "Win32_OperatingSystem instance"
objOut.Writeline "----------------------------------"
objOut.close
Wscript.quit 666

ConsoleApplicationはすべてを出力し、666を返します

IISはStdOutで「----------------------------------」のみを取得し、psexecsvcはハングします...

これは、C#でpsexecを実行するために使用されるコードです...

Process proc = new Process();

ProcessStartInfo procInfo = new ProcessStartInfo(@"C:/PsExec.exe", @"\\novi2 -u Domain\usernameadmin -p Password C:/info.bat");
procInfo.UseShellExecute = false;
procInfo.RedirectStandardOutput = true;
procInfo.RedirectStandardError = true;

proc.StartInfo = procInfo;

proc.Start();

String output = proc.StandardOutput.ReadToEnd();
String err = proc.StandardError.ReadToEnd();
Trace.WriteLine("Out >> " + output);
Trace.WriteLine("Err >> " + err);

proc.Close();

サーバーでIIS7、ASP MVC3、.NET4.0(VS2010のサンプルプロジェクト)を使用し、ホストでWinXPSP3を使用しています。問題を回避するために、IISのApplicationPoolはpsexecと同じ管理者アカウントを使用しています。

4

1 に答える 1

3

問題は、リモート ホスト (novi2) の PSExecSvc がクリーンアップされていない可能性があり、正常に実行する前に削除する必要があります。リモート ホストに対して PSExec を開始する各スクリプトの最後に、次のコードを追加します。

sc \\novi2 delete PSExecSvc

また、リモート ホストに対してではなく、上でPSExec をインスタンス化する場合は、次のように EULA を受け入れるためのスイッチを追加する必要があります。

psexec \\HOST1 /accepteula -u userid -p password COMMAND

お役に立てば幸いです、リズ

于 2012-09-04T06:48:26.983 に答える