いつもお世話になっております。
ただ今仕事で業務アプリを開発しているのですが、題記の件で立ち往生しております。
有識者の方がいらっしゃいましたら、ご教授いただければ幸いです。
【やりたいこと】
Windows2000Server,及びWindowsServer2003上でアプリを実装したときに、
ログオフでアプリケーションを殺さないようにする。
【経緯】
WindowsServer2008対応にて、今までセッション0でダイアログ表示を
行っていたアプリをユーザセッションに表示するように変更しました。
その際にUIを行うプロセスを新たに起動(CreateProcessAuUser()を用いて)
するようにしたのですが、このUIを起動するとログインユーザ(Administrator権限)
になってしまいます。
タスクマネージャ上でユーザがSYSTEMになっているプロセスは
ログオフ後にログインしなおすとそのままアプリが残っているのに対し、
UIプロセスはWindowsによって異常終了してしまいます。
このことから、SYSTEM権限でプロセスを起動すれば良いのではないか?
っと考えたのですが、はたして可能なのでしょうか?
・サービスプログラムからの起動
・ATコマンドを使用して起動
・スクリプト起動?(すいません、これはイマイチ分かっていません)
上記の場合にはSYSTEMになるということはわかったのですが、
SYSTEMで起動しているプロセスから起動することは可能なのでしょうか。
もし可能な場合どのように起動すればよいのかを教えていただきたく、よろしくお願いいたします。
尚、WindowsServer2008上ではプロセスが死ぬことは仕様としてあるのですが、
過去バージョンと同等機能(ログオフしてもプロセスが生きている)を維持しなくてはならないため、
本件のような仕様になっています。
どうぞよろしくお願いいたします。
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
手動で起動する限り難しいのでは?
サービスにしてしまえば簡単だと思うんですけど。
入り口の登録と、コントロール(システムからの要求)の振り分け、
スレッドによる処理、シャットダウン用強制終了の仕組み、これらが
できれば、後は普通のプログラムと変わらりません。(個人の感想)
あと、メッセージボックスとか、ユーザ入力のように操作員との
会話を伴う処理は止めましょう。デスクトップとの会話が許可されて
いないと誰も見たり触ったり出来ないウィンドウに表示/入力が行わ
れて、永久に待機状態になってしまいます。
アドバイスありがとうございます。
今朝出社してソースを見直していましたら
簡単なケアレスミスをしておりまして、
CreateProcessでSYSTE権限で起動することができました。
因みに、本プロセスは夜間バッチ処理などの監視を行っているため、
障害時に通知を行ったりするのが主な機能なのですが、
初期の仕様検討不足に度重なるエンハンスで
今回のようなおかしな仕様に…。(^^;
シャットダウン、ログオフも通常業務ではありえないのですが、
万が一発生した場合に安全に終了させる必要があったため、
このような対策になりました。
週末の間ずっと悩んでいたので、アドバイス頂けてうれしかったです。
ありがとうございました。
No.2
- 回答日時:
>ログオフでアプリケーションを殺さないようにする。
そもそも、ログオンされたセッションから起動された
アプリケーションをそのセッション自体が終わるときに
終了しないというのが無理な話だと思います。
# UIを持つアプリケーションがユーザセッション終了中に
# 継続して起動しておかなければならない理由わからないのですが
# 運用互換維持の為だけなのでしょうか?
>SYSTEMで起動しているプロセスから起動は可能なのでしょうか。
可能です。CreateProcess/CreateProcessAsUserなどで
起動できます。
ユーザセッション以外の監視目的がある場合、
基本的にサービスのローカルシステムアカウントにおいて
行うのが通例だと思います。
ただし、No1さんもおっしゃっているとおり、
サービスからGUIをもつアプリケーションを
起動する場合はディスクトップ対話を許可しなければ、
起動されたアプリケーションのUIを表示することができません。
> 2008
2008ではデスクトップの対話を許可してセッション0で起動しても、
隔離されたデスクトップに単独で表示される為動作が若干異なります
また、シャットダウン通知の処理が従来と異なるようなので注意が
必要です。
アドバイスありがとうございます。
今回の仕様は、明らかにおかしいのは重々承知しているのですが、
修正規模を考慮した上でこのような仕様になってしまいました。
元々基盤となるプロセスがSYSTEMユーザでセッション0に
実行されていたため、ログオフ後に再度ログインしても
ダイアログの表示が継続されていました。
この点で既に設計不良だと思うのですが、
何分7,8年前に開発されたまま運用されているため、
外部仕様の変更ができなかったのです。
>可能です。CreateProcess/CreateProcessAsUserなどで
とありますが、CreateProcessでは実行できたのですが
(OSごとに処理を分けました)、CreateProcessAsUserで実行する場合には
何か特別な設定があるのでしょうか?
ユーザトークンを取得し、プライマリトークンの複製、
環境ブロックのセットと一通りやったつもりでいたのですが
”サービスのローカルシステムアカウントにおいて”の設定は
どこに関係してくるのでしょうか。
もし良ければご教授いただければ幸いです。
当初、セキュリティ記述子に何を設定して良いか分からず、
サービスプログラムの情報からセキュリティー情報をコピー
してくるという無茶苦茶なこともやってみました…。
あと
>シャットダウン通知の処理が従来と異なるようなので注意が
必要です。
まさに今これでつまづいています。
WinProcの設定がおかしいのかWM_QUERYENDSESSIONを拾うことができません。
(他のイベントは拾えてるのでプロシージャそのものは起動できているっぽいのですが)
aris-wizさんがおっしゃってるのはこの点でしょうか…?
もしご存じでしたら教えていただけると幸いです。
色々と不勉強で申し訳ありません。どうもありがとうございました。
No.3
- 回答日時:
> ”サービスのローカルシステムアカウントにおいて”の設定は
> どこに関係してくるのでしょうか。
サービス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 …
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 日本株 SBI証券HYPER SBI 2のエラー 1 2023/01/31 13:38
- その他(学校・勉強) この中で間違ってある説明はありますか?詳しい方に教えていただきたいです。 A. 1つのプログラムが複 2 2023/07/14 01:15
- その他(プログラミング・Web制作) プログラムの起動、利用について、使用期間を設定する方法 3 2023/08/06 21:03
- Windows 10 Windows 10のエクスプローラーの表示が遅いのですが 4 2023/02/04 09:34
- Android(アンドロイド) Android バッテリーの消耗が早くなった。2倍以上 6 2022/05/28 10:36
- デスクトップパソコン 「自動修復でPCを修復できませんでした」と表示されPCが起動しないのですが対処法はありますか? 5 2022/05/13 09:16
- ノートパソコン .dllファイルがありませんと表示される 5 2023/04/30 03:03
- その他(プログラミング・Web制作) Windows上のプログラム。「予め決められた時刻に自分で起動して処理して自分で終了する」って可能? 3 2023/01/04 14:29
- JavaScript [Java] Edgeでのアドレスバー非表示について 3 2022/04/20 17:51
- Android(アンドロイド) Androidってなぜ画像や動画のダウンロードがマトモにされない、出来ない、時々ダウンロードに失敗す 5 2022/08/05 23:22
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C# の OpenFileDialog
-
Ctrl + P のメッセージ送信
-
vb6で異なるのプロジェクト間で...
-
イラストレーターCS4のシリアル...
-
アプリケーションをVBS(WSH?)で...
-
Windowsプログラムのビジー状態...
-
プログラムの二重起動防止
-
Macターミナルで実行中のプログ...
-
VBAの配列サイズとメモリに関して
-
なんかC言語でプログラム書いて...
-
VBSの処理中一旦処理を止めて再...
-
プログラミング ソースコード
-
DoEvents関数って何?
-
MACで動く実行ファイルをWindow...
-
Webプログラムってネイティブア...
-
COMBOBOXで日付入力
-
VBA
-
スーパーのレジで並んでいたら...
-
TCP/IP通信時のサーバーからの受信
-
GetDlgItemInt( ) c++
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
コンソールアプリケーションの...
-
フレームワーク「4.8.1」で、[S...
-
Vba アプリケーションが立ち上...
-
VBSでのSendKeysでの画面の最小化
-
自分自身を更新するプログラム
-
イラストレーターCS4のシリアル...
-
Windowsプログラムのビジー状態...
-
Accessフォームからの外部アプ...
-
Console Applicationをタスクト...
-
VB.NETでMessageBoxを表示した...
-
初回接続の遅い原因について
-
pccNTmon.exeとntrtscan.exeの違い
-
vb6で異なるのプロジェクト間で...
-
WSH(VBScript)でアプリケーショ...
-
対象のアプリケーションが終了...
-
MFCアプリケーションでの終了コ...
-
VB.NETでフォームアクティブの...
-
他アプリケーションの終了
-
実行時のコマンドプロンプトを...
-
Shell関数の終了を調べる方法
おすすめ情報