投稿

FormApplicationでのPsExecのStandardOutput

C#からPsExecをコンソールアプリケーションとして呼び出す場合、Processクラスを利用するが、利用方法によってはStandardOutputが全て取得できない場合があった 現象としては C#のFormApplicationとしてプロジェクトを作成して ProcessStartInfo info = new ProcessStartInfo(); info.FileName = "hoge¥¥PsExec.exe"; info.Arguments = "¥¥¥¥127.0.0.1 cmd /c ¥"type hoge¥¥¥¥a.txt"; 略 string output = info.StandartOutput.ReadToEnd(); とした場合、outputにはa.txtに含まれる長さによっては途中までしか読み取れない 解決方法としては、 info.FileName = "cmd.exe"; として、一旦コマンドプロンプトから実行するものとして指定し info.Arguments = "hoge¥¥¥¥PsExec.exe ¥¥¥¥127.0.0.1 /cmd /c ¥"type hoge¥¥¥¥a.txt"; とすると、正常に読み取られる FormApplicationではなく、ConsoleApplicatioとしてプロジェクトを作成した場合は、この限りではない

PsExecからのVBoxManageコントロール

PsExecを使用してリモートのVirtualBoxをコントロールしたい場合、結果が得られるコマンドと得られないコマンドがある。 例えば、list vmsコマンドは登録されている仮想マシンを取得できるが、list runningvmsコマンドは、起動中の仮想マシンを取得することができない。 試行錯誤した結果、以下の方法で取得ができた。 a.リモートで実行したいコマンドと、そのコマンドを実行した結果をテキストにリダイレクトするbatファイルを作成する b.batファイルをタスクスケジュールとして登録し、即時実行を行う c.リダイレクトされた結果をtypeコマンドにより読み取る Local 192.168.1.101 Remote 192.168.1.102 NG >PsExec ¥¥192.168.1.102 -u User -p pass "C:¥~¥VBoxManage.exe" list runningvms OK >PsExec ¥¥192.168.1.102 -u User -p pass cmd /c "echo "C:¥~¥VBoxManage.exe" list runningvms ^> %TMP%\foo.txt > %TMP%\foo.bat" >PsExec \\192.168.1.102 -u User -p pass cmd /c "schtasks /Create /TN footask /TR %TMP%\foo.bat /SC MONTHLY" >PsExec \\192.168.1.102 -u User -p pass cmd /c "schtasks /Run /TN footask" >PsExec \\192.168.1.102 -u User -p pass cmd /c "schtasks /Delete /TN footask /F" >PsExec \\192.168.1.102 -u User -p pass cmd /c "type %TMP%\foo.txt" C# EX. stri...