アプリ版:「スタンプのみでお礼する」機能のリリースについて

いつもお世話になっております。
ただ今仕事で業務アプリを開発しているのですが、題記の件で立ち往生しております。
有識者の方がいらっしゃいましたら、ご教授いただければ幸いです。

【やりたいこと】
Windows2000Server,及びWindowsServer2003上でアプリを実装したときに、
ログオフでアプリケーションを殺さないようにする。

【経緯】
WindowsServer2008対応にて、今までセッション0でダイアログ表示を
行っていたアプリをユーザセッションに表示するように変更しました。
その際にUIを行うプロセスを新たに起動(CreateProcessAuUser()を用いて)
するようにしたのですが、このUIを起動するとログインユーザ(Administrator権限)
になってしまいます。
タスクマネージャ上でユーザがSYSTEMになっているプロセスは
ログオフ後にログインしなおすとそのままアプリが残っているのに対し、
UIプロセスはWindowsによって異常終了してしまいます。
このことから、SYSTEM権限でプロセスを起動すれば良いのではないか?
っと考えたのですが、はたして可能なのでしょうか?

・サービスプログラムからの起動
・ATコマンドを使用して起動
・スクリプト起動?(すいません、これはイマイチ分かっていません)
上記の場合にはSYSTEMになるということはわかったのですが、
SYSTEMで起動しているプロセスから起動することは可能なのでしょうか。
もし可能な場合どのように起動すればよいのかを教えていただきたく、よろしくお願いいたします。

尚、WindowsServer2008上ではプロセスが死ぬことは仕様としてあるのですが、
過去バージョンと同等機能(ログオフしてもプロセスが生きている)を維持しなくてはならないため、
本件のような仕様になっています。

どうぞよろしくお願いいたします。

A 回答 (3件)

手動で起動する限り難しいのでは?


サービスにしてしまえば簡単だと思うんですけど。
入り口の登録と、コントロール(システムからの要求)の振り分け、
スレッドによる処理、シャットダウン用強制終了の仕組み、これらが
できれば、後は普通のプログラムと変わらりません。(個人の感想)
あと、メッセージボックスとか、ユーザ入力のように操作員との
会話を伴う処理は止めましょう。デスクトップとの会話が許可されて
いないと誰も見たり触ったり出来ないウィンドウに表示/入力が行わ
れて、永久に待機状態になってしまいます。
    • good
    • 0
この回答へのお礼

アドバイスありがとうございます。
今朝出社してソースを見直していましたら
簡単なケアレスミスをしておりまして、
CreateProcessでSYSTE権限で起動することができました。

因みに、本プロセスは夜間バッチ処理などの監視を行っているため、
障害時に通知を行ったりするのが主な機能なのですが、
初期の仕様検討不足に度重なるエンハンスで
今回のようなおかしな仕様に…。(^^;

シャットダウン、ログオフも通常業務ではありえないのですが、
万が一発生した場合に安全に終了させる必要があったため、
このような対策になりました。

週末の間ずっと悩んでいたので、アドバイス頂けてうれしかったです。
ありがとうございました。

お礼日時:2009/01/20 01:11

>ログオフでアプリケーションを殺さないようにする。


そもそも、ログオンされたセッションから起動された
アプリケーションをそのセッション自体が終わるときに
終了しないというのが無理な話だと思います。
# UIを持つアプリケーションがユーザセッション終了中に
# 継続して起動しておかなければならない理由わからないのですが
# 運用互換維持の為だけなのでしょうか?

>SYSTEMで起動しているプロセスから起動は可能なのでしょうか。
可能です。CreateProcess/CreateProcessAsUserなどで
起動できます。
ユーザセッション以外の監視目的がある場合、
基本的にサービスのローカルシステムアカウントにおいて
行うのが通例だと思います。

ただし、No1さんもおっしゃっているとおり、
サービスからGUIをもつアプリケーションを
起動する場合はディスクトップ対話を許可しなければ、
起動されたアプリケーションのUIを表示することができません。

> 2008
2008ではデスクトップの対話を許可してセッション0で起動しても、
隔離されたデスクトップに単独で表示される為動作が若干異なります
また、シャットダウン通知の処理が従来と異なるようなので注意が
必要です。
    • good
    • 0
この回答へのお礼

アドバイスありがとうございます。

今回の仕様は、明らかにおかしいのは重々承知しているのですが、
修正規模を考慮した上でこのような仕様になってしまいました。
元々基盤となるプロセスがSYSTEMユーザでセッション0に
実行されていたため、ログオフ後に再度ログインしても
ダイアログの表示が継続されていました。
この点で既に設計不良だと思うのですが、
何分7,8年前に開発されたまま運用されているため、
外部仕様の変更ができなかったのです。

>可能です。CreateProcess/CreateProcessAsUserなどで
とありますが、CreateProcessでは実行できたのですが
(OSごとに処理を分けました)、CreateProcessAsUserで実行する場合には
何か特別な設定があるのでしょうか?
ユーザトークンを取得し、プライマリトークンの複製、
環境ブロックのセットと一通りやったつもりでいたのですが
”サービスのローカルシステムアカウントにおいて”の設定は
どこに関係してくるのでしょうか。
もし良ければご教授いただければ幸いです。

当初、セキュリティ記述子に何を設定して良いか分からず、
サービスプログラムの情報からセキュリティー情報をコピー
してくるという無茶苦茶なこともやってみました…。

あと
>シャットダウン通知の処理が従来と異なるようなので注意が
必要です。
まさに今これでつまづいています。
WinProcの設定がおかしいのかWM_QUERYENDSESSIONを拾うことができません。
(他のイベントは拾えてるのでプロシージャそのものは起動できているっぽいのですが)
aris-wizさんがおっしゃってるのはこの点でしょうか…?
もしご存じでしたら教えていただけると幸いです。

色々と不勉強で申し訳ありません。どうもありがとうございました。

お礼日時:2009/01/20 01:33

> ”サービスのローカルシステムアカウントにおいて”の設定は


> どこに関係してくるのでしょうか。
サービスAPから起動されたアプリは通常SYSTEM権限を持ちます。
ローカルシステムアカウントにおいて起動する==SYSTEM権限で
起動すると読み替えていただいて差し支えないと思います。

> CreateProcessAsUserで実行する場合には
> 何か特別な設定があるのでしょうか?
> 当初、セキュリティ記述子に何を設定して良いか分からず、
SYSTEM権限で実行されたAPの呼び出し側スレッドが既に
ログオンしているユーザトークンのセキュリティコンテキストを
偽装できるようにする必要があります。

> WM_QUERYENDSESSIONを拾うことができません。
> aris-wizさんがおっしゃってるのはこの点でしょうか…?
Yesです。。。
Session 0 でのシャットダウンメッセージや
メッセージ配信の挙動が若干変わったようです。
シャットダウンについての違いは以下を見れば大体わかるかと。
http://msdn.microsoft.com/en-us/library/bb394721 …

メッセージ配信、自体はCreateProcessAsUserを使用して、
作成した偽装トークを指定することで、メッセージ自体は
受け取るようにすることが可能なようですが、
シャットダウンのキャンセルは上記URLのように、
かなりシビアになっているようです。。。

ついでにサービスAPにもシャットダウンの予測機能が
少し追加されたようです。。。
[原文]http://msdn.microsoft.com/en-us/magazine/cc16425 …
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!