権限偽装時のWM_QUERYENDSESSIONについて

[戻る]
みほこ 2010/04/13(火) 15:34:37
初めて質問させて頂きます。

開発中のシステムで、CreateProcessWithLogonW()で権限偽装をしてアプリケーションを
起動しています。
権限偽装して起動したアプリケーションで、ログオフやシャットダウン時に処理を行い
たいのですが、WM_QUERYENDSESSIONを受信することが出来ません。

権限偽装せずに起動した場合は、WM_QUERYENDSESSIONを受信出来ることを確認していま
すが、権限偽装を行うと受信出来ないため権限偽装部分が問題になっていると思ってい
ます。

アプリケーションとユーザーの構成は以下の通りです。
APP1はUSER1(User権限)で起動
APP2はUSER2(Administrator権限)で起動

権限偽装は以下の2通りを試してみましたが、結果は同じでした。
1.CreateProcessWithLogonW()を使用
2.LogonUer()+CreateProcessAsUser()
 STARTUPINFOに"winsta0\\default"を指定しローカルセキュリティポリシーの“プロセ
スレベルトークンの置き換え”にUSER1を追加

2については、下記のサイトを参考にしました。
http://support.microsoft.com/kb/165194/ja

メッセージ受信が出来ない原因がわからないので、注意すべき点がありましたら、教え
て下さい。

開発環境
WinXP(SP3)+VC++2003

よろしくお願い致します。

仲澤@失業者 2010/04/13(火) 20:01:15
この件についてはあまり詳しくはないのですが、
CreateProcessWithLogonW()を使用して起動したアプリケーションには
WM_QUERYENDSESSION, WM_ENDSESSION, WM_QUIT は来ないそうです。

(参考)http://msdn.microsoft.com/en-us/library/ms682431(VS.85).aspx

う〜ん、使えませんねぇ。

シャットダウンがらみもなんか変わっているそうです。
http://msdn.microsoft.com/en-us/library/bb394721(VS.85).aspx
http://msdn.microsoft.com/en-us/library/ms700677(VS.85).aspx

みほこ 2010/04/14(水) 17:36:29
仲澤@失業者さん、回答ありがとうございます。

教えていただいたサイトを確認してみました。
WM_QUERYENDSESSIONが受信できないと言う事書き込みですが、これはMSの公式情報ではな
いと言う認識で間違いないでしょうか。

質問後、こちらでいろいろ試してみました。
WM_DEVICECHANGEやWM_MOUSEMOVEはちゃんと受信出来る事を確認しました。

またVistaは今環境がないので試せていませんが、Win7で同じプログラムを実行したとこ
ろ、こちらではWM_QUERYENDSESSIONが受信できました。
XPのバグなのでしょうか。。。

Vista以降でシャットダウン処理の仕様が変わっている情報もありがとうございました。
Vistaを飛ばして、Win7対応も行わなければならないので気をつけておきます。

もう少し、調査を継続したいと思います。
他に何かご存知の方がいらっしゃったら、引き続き回答をお願い致します。

仲澤@失業者 2010/04/14(水) 18:53:12
>WM_QUERYENDSESSIONが受信できないと言う事書き込みですが、これはMSの公式情報では>いと言う認識で間違いないでしょうか。

その通りです。
SYSTEM権限でCreateProcess()だとOKという書き込みも
どこかで読みましたが、さだかではありません。
Windows7は起動時の権限設定が(手動/自動?)できるらしいので
むしろ問題は発生しづらいのかもしれません。
・・Win7は持ってないので確かめられません(vv;)

みほこ 2010/04/16(金) 09:36:51
[[解決]]
おはようございます。
昨日も一日いろいろ試してみました。

Win7の時は問題の現象は発生しないと思っていたのですが、勘違いしていたようで、XPの
時と同様、APP2でWM_QUERYENDSESSIONは受信できていませんでした。

わかった事の1つにAPP1ではWM_QUERYENDSESSIONが受信できる事が確認できたので(これは
当たり前のことですが)、APP1を常駐する形にして、APP1で受信したWM_QUERYENDSESSION
をAPP2にメッセージをリレーすることで解決することにしました。。

とりあえず解決済みとさせていただきます。

仲澤@失業者さん、回答ありがとうございました。

古いスレッドには追加発言できません。