- PR -

CreateProcessWithLogonWで呼び出したプロセスの終了コード

1
投稿者投稿内容
IMPREZA
ベテラン
会議室デビュー日: 2005/07/06
投稿数: 58
投稿日時: 2008-05-16 18:32
はじめまして。

現在、他のユーザでスクリプトを実行するツールを作成しています。
参考にしているコードは下記のURLです。
http://www.atmarkit.co.jp/bbs/phpBB/newtopic.php?forum=7

一応、他のユーザでスクリプトを実行できていることまでは確認できています。
しかし、呼び出したスクリプトが正常終了したのかを判定する方法がありません。
もちろん、スクリプト内でログを吐けばログからはわかりますが、、、
スクリプトを呼び出すツール内でエラー処理を行いたいと思っております。

プロセスIDからそのプロセスが正常終了したか異常終了したかで判別しようと思ったのですがうまく動きませんでした。


ちなみに下記のようなコードを書いています。
ret = CreateProcessWithLogonW(userName, domain, password, LOGON_WITH_PROFILE, _
Nothing, commandLine , CREATE_DEFAULT_ERROR_MODE Or CREATE_NEW_CONSOLE _
Or CREATE_NEW_PROCESS_GROUP, IntPtr.Zero, Nothing, startupInfo, processInfo)

Dim pid As Process = Process.GetProcessById(processInfo.dwProcessId)

<中略(プロセスが終了したことを確認)>
If pid.HasExited = True Then
Dim returncode As Integer = pid.ExitCode  ←ここでエラーになります
End If

If ret = true Then
CloseHandle(processInfo.hProcess)
CloseHandle(processInfo.hThread)
End If


エラーの内容は「プロセスはこのオブジェクトによって開始されていないため、要求された情報を決定できません。」と出てきます。



どなたかわかる方がいましたら、ご教授ください。
お願いいたします。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2008-05-16 22:24
sysinternals のプロセス エクスプローラーだったかな?プロセスの親子関係が分かるようなツールで調べてみてください。エラーメッセージの意味がわかります。
IMPREZA
ベテラン
会議室デビュー日: 2005/07/06
投稿数: 58
投稿日時: 2008-05-16 22:54
Jittaさん
返答ありがとうございます。
Procexp.exeですよね?調べてみました。
親子関係にないことはわかりました。
私がやろうとしていることは親子関係にないとダメなのでしょうか?
親子関係にないという以上は実装不可能ですか?
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2008-05-17 22:00
おそらく、孫になっていたと思います。
自作アプリ→スクリプトを解釈するプログラム→スクリプト

で、自作アプリからは、「スクリプトを解釈するプログラム」の終了コードは取れると思います。
そうであるなら、「スクリプトを解釈するプログラム」に、スクリプトの終了コードを自分の終了コードとするようなオプションがあるか調べるのが一つかと思います。
IMPREZA
ベテラン
会議室デビュー日: 2005/07/06
投稿数: 58
投稿日時: 2008-05-19 10:03
Jittaさん
孫にもなっていない状態でした。
やろうとしていることはDomainUserでログオンしていてDomainAdmin権限でVBSを実行しようとしています。Runasみたいなことです。
VBSを直接実行することができないようなので、Wscript.exeの引数にVBSを指定して実行しています。
Procexp.exeで見ると、Wscript.exeはツールの子、孫ではなくsvchost.exeの子として実行されています。

ん〜やはり難しそうですね。。。
IMPREZA
ベテラン
会議室デビュー日: 2005/07/06
投稿数: 58
投稿日時: 2008-05-20 15:21
解決できました☆

Process.StartでもCreateProcessWithLogonWと同じことができるようです。
なのでProcess.Startを使ってプロセスの終了コードを取得できました。

Jittaさん。ご協力ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)