• 締切済み

SYSTEM権限でプロセス機動

いつもお世話になっております。 ただ今仕事で業務アプリを開発しているのですが、題記の件で立ち往生しております。 有識者の方がいらっしゃいましたら、ご教授いただければ幸いです。 【やりたいこと】 Windows2000Server,及びWindowsServer2003上でアプリを実装したときに、 ログオフでアプリケーションを殺さないようにする。 【経緯】 WindowsServer2008対応にて、今までセッション0でダイアログ表示を 行っていたアプリをユーザセッションに表示するように変更しました。 その際にUIを行うプロセスを新たに起動(CreateProcessAuUser()を用いて) するようにしたのですが、このUIを起動するとログインユーザ(Administrator権限) になってしまいます。 タスクマネージャ上でユーザがSYSTEMになっているプロセスは ログオフ後にログインしなおすとそのままアプリが残っているのに対し、 UIプロセスはWindowsによって異常終了してしまいます。 このことから、SYSTEM権限でプロセスを起動すれば良いのではないか? っと考えたのですが、はたして可能なのでしょうか? ・サービスプログラムからの起動 ・ATコマンドを使用して起動 ・スクリプト起動?(すいません、これはイマイチ分かっていません) 上記の場合にはSYSTEMになるということはわかったのですが、 SYSTEMで起動しているプロセスから起動することは可能なのでしょうか。 もし可能な場合どのように起動すればよいのかを教えていただきたく、よろしくお願いいたします。 尚、WindowsServer2008上ではプロセスが死ぬことは仕様としてあるのですが、 過去バージョンと同等機能(ログオフしてもプロセスが生きている)を維持しなくてはならないため、 本件のような仕様になっています。 どうぞよろしくお願いいたします。

みんなの回答

  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.3

> ”サービスのローカルシステムアカウントにおいて”の設定は > どこに関係してくるのでしょうか。 サービスAPから起動されたアプリは通常SYSTEM権限を持ちます。 ローカルシステムアカウントにおいて起動する==SYSTEM権限で 起動すると読み替えていただいて差し支えないと思います。 > CreateProcessAsUserで実行する場合には > 何か特別な設定があるのでしょうか? > 当初、セキュリティ記述子に何を設定して良いか分からず、 SYSTEM権限で実行されたAPの呼び出し側スレッドが既に ログオンしているユーザトークンのセキュリティコンテキストを 偽装できるようにする必要があります。 > WM_QUERYENDSESSIONを拾うことができません。 > aris-wizさんがおっしゃってるのはこの点でしょうか…? Yesです。。。 Session 0 でのシャットダウンメッセージや メッセージ配信の挙動が若干変わったようです。 シャットダウンについての違いは以下を見れば大体わかるかと。 http://msdn.microsoft.com/en-us/library/bb394721(VS.85).aspx メッセージ配信、自体はCreateProcessAsUserを使用して、 作成した偽装トークを指定することで、メッセージ自体は 受け取るようにすることが可能なようですが、 シャットダウンのキャンセルは上記URLのように、 かなりシビアになっているようです。。。 ついでにサービスAPにもシャットダウンの予測機能が 少し追加されたようです。。。 [原文]http://msdn.microsoft.com/en-us/magazine/cc164252.aspx

  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.2

>ログオフでアプリケーションを殺さないようにする。 そもそも、ログオンされたセッションから起動された アプリケーションをそのセッション自体が終わるときに 終了しないというのが無理な話だと思います。 # UIを持つアプリケーションがユーザセッション終了中に # 継続して起動しておかなければならない理由わからないのですが # 運用互換維持の為だけなのでしょうか? >SYSTEMで起動しているプロセスから起動は可能なのでしょうか。 可能です。CreateProcess/CreateProcessAsUserなどで 起動できます。 ユーザセッション以外の監視目的がある場合、 基本的にサービスのローカルシステムアカウントにおいて 行うのが通例だと思います。 ただし、No1さんもおっしゃっているとおり、 サービスからGUIをもつアプリケーションを 起動する場合はディスクトップ対話を許可しなければ、 起動されたアプリケーションのUIを表示することができません。 > 2008 2008ではデスクトップの対話を許可してセッション0で起動しても、 隔離されたデスクトップに単独で表示される為動作が若干異なります また、シャットダウン通知の処理が従来と異なるようなので注意が 必要です。

4696nicle
質問者

お礼

アドバイスありがとうございます。 今回の仕様は、明らかにおかしいのは重々承知しているのですが、 修正規模を考慮した上でこのような仕様になってしまいました。 元々基盤となるプロセスがSYSTEMユーザでセッション0に 実行されていたため、ログオフ後に再度ログインしても ダイアログの表示が継続されていました。 この点で既に設計不良だと思うのですが、 何分7,8年前に開発されたまま運用されているため、 外部仕様の変更ができなかったのです。 >可能です。CreateProcess/CreateProcessAsUserなどで とありますが、CreateProcessでは実行できたのですが (OSごとに処理を分けました)、CreateProcessAsUserで実行する場合には 何か特別な設定があるのでしょうか? ユーザトークンを取得し、プライマリトークンの複製、 環境ブロックのセットと一通りやったつもりでいたのですが ”サービスのローカルシステムアカウントにおいて”の設定は どこに関係してくるのでしょうか。 もし良ければご教授いただければ幸いです。 当初、セキュリティ記述子に何を設定して良いか分からず、 サービスプログラムの情報からセキュリティー情報をコピー してくるという無茶苦茶なこともやってみました…。 あと >シャットダウン通知の処理が従来と異なるようなので注意が 必要です。 まさに今これでつまづいています。 WinProcの設定がおかしいのかWM_QUERYENDSESSIONを拾うことができません。 (他のイベントは拾えてるのでプロシージャそのものは起動できているっぽいのですが) aris-wizさんがおっしゃってるのはこの点でしょうか…? もしご存じでしたら教えていただけると幸いです。 色々と不勉強で申し訳ありません。どうもありがとうございました。

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.1

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

4696nicle
質問者

お礼

アドバイスありがとうございます。 今朝出社してソースを見直していましたら 簡単なケアレスミスをしておりまして、 CreateProcessでSYSTE権限で起動することができました。 因みに、本プロセスは夜間バッチ処理などの監視を行っているため、 障害時に通知を行ったりするのが主な機能なのですが、 初期の仕様検討不足に度重なるエンハンスで 今回のようなおかしな仕様に…。(^^; シャットダウン、ログオフも通常業務ではありえないのですが、 万が一発生した場合に安全に終了させる必要があったため、 このような対策になりました。 週末の間ずっと悩んでいたので、アドバイス頂けてうれしかったです。 ありがとうございました。

関連するQ&A

  • 権限=プロセスを実行したユーザー?

    権限=プロセスを実行したユーザー? ウィンドウズNTのセキュリティについて調べています。 権限という言葉がよくでてきますが、それはつまりそのプロセスを起動したユーザーということですか? そして特権についてですが、特権はシステム関連の操作を行う権利で、特権によってはデフォルトでオフになっているものもある、という考えであっているでしょうか。 そして、「そもそも権限が足りないから特権をONにできない」という様な記述をみたのですが、ということは、権限によって持っている特権が決まるということですよね? またこの権限は昇格させられますか? という事で、質問したい点は ・権限とは? ・特権のON、OFFについて ・特権と権限の関係 ・権限は昇格させられるか? の4つです。 どれか1つでもので回答よろしくお願いします。

  • システムの権限について

    まずこれは自分のパソコンで自分しか使ってません。 最初は権限のあるアカウントで入って [control userpasswords2]を開いてアカウントのパスワードを変更しました そこで定かではありませんが「OK」押したと思います そうしたらログオフしてくださいと支持されログオフしました 昔自動ログインをするように設定していたのでそれの設定がおそらくそのままだったと思います それでログオフするとすぐにログインしようとして 変えたので入れません。 そしてログイン画面に戻されAdministratorのみしか表示されてなく パスワードはあっててもログインできません セーフモードで自分のアカウントのパスワードを再設定し 普通に入れるようになりました しかし権限がなくなってしまいアカウントの設定もできなくなってしまったので[control userpasswords2]を実行して設定してみようとしたところ 「管理者権限がないので~」と表示されAdministratorでログインしてくださいと支持されます。 しかしログインしようとしても「このアカウントは権限がありません」と表示されてしまいなにもできなくなってしまいました。なのでシステムの復元もできません セーフモードでも同じ結果です 普通に立ち上げるとパスワード自動入力が残っててアカウント決定の画面はスキップされてしまいます。 なので今は権限なしの状態です。アカウント設定できません こういう場合はどうすれば権限を持てますか? 技術者で詳しい方お願いします

  • windowsサービスの権限の状態について

    windowsサービスの権限の状態について サービス化し、他のプログラムを起動する自作のアプリがあるとします。 このとき、システムだけ起動してログインしないでそのサービスが実行されるとき、起動できるプログラムは何権限のものまで起動できるのでしょうか? ログインした場合はそのログインしたユーザの権限で起動できるもののみ起動できるのでしょうか?? ご教授お願い致します。

  • CPUのsystemが99%

    あるユーザーでwindowsのログオフしてそのほかのユーザーにログインしようとするとsystemが99%になってとまってしまいます。スタートアップなどは一つも登録していません。 原因が全く分からないので困っています…

  • 特定プロセスの権限情報を取得できる?

    お世話になります。 WindowsVista以降において権限周りが厳しくなったことで、UIPIにより別プロセスのウィンドウへのPostMessage等がブロックされるケースが出て難儀しています。 対応策を調べたところ、自アプリが昇格しないで通信する方法と、昇格する方法があるようですが、 昇格しない場合はインストール先が制限されること、最初から昇格していては不要な場合までも高い権限レベルで起動してしまうことから、アプリ実行中に必要な場合だけ昇格する方向を模索しています。 通信周りをCOM化すれば通信可能らしい、というところまでは調べたのですが、必要な場合かどうかの判定をどうすれば良いかが分かっていません。 VC++で通信相手のウィンドウハンドルを取得したところから、そのウィンドウを持つプロセスの権限情報を取得可能でしょうか? また、自アプリの現在の権限レベルを確認する手段はあるでしょうか? 以上です。宜しくお願いします。

  • プロセスの「System」について

    タスクマネージャーのプロセスの「System」について いつ頃からか、パソコンを起動して、何もアプリを立ち上げず、何十分もたつのにずっと冷却ファンが回っています。 タスクマネージャーでしらべると、「System」という項目がずっとCPUを20~30パーセント使用しています。 ネットでいろいろ調べ、アプリの更新や、ドライバーの更新をやってみましたが改善されずです。 一つ分かったのは、再起動で立ち上げるとその症状は起こらず、 シャットダウンして、電源を入れるとまた同じ現象に戻ることです。 Windows8 バージョン6.3です 分かる方がいらっしゃればよろしくお願いします。 ※OKWaveより補足:「富士通FMV」についての質問です。

  • サービスの再起動が、権限の問題で拒否された

    あるサービスを再起動しようとしたら、ユーザ権限の関係で拒否されました。 当然Administratorなら問題なく再起動できます。 ログオフせずに、一時的にAdministratorに成り代わってサービスを再起動できますか? exeファイルをShift+右クリックすると「別のユーザとして実行」というのが出ますが、それをサービスの再起動の場合にもできればいいのだと思うのですが、やりかたがわかりません。 Windows2000です。

  • 既存プロセスの管理者権限への昇格

    自身で管理者権限に昇格する機能をもたないアプリケーションは通常「管理者権限で実行」を行いますが、すでにユーザー権限で実行されているプロセスに対し、アプリケーションを終了することなく外部から管理者権限への昇格を行うことはできないでしょうか? 方法があればご教授お願いします。コマンドラインでの操作が行えればなおよいです。(GUIでもOK) なおOSはWindows7 32bitです。

  • androidのアプリの権限の操作について

    アプリの権限でユーザーがオフに出来ない権限はありますか? 知り合いがapkからインストールした権限が怪しいアプリを使ってて…

  • Administratorの権限にするには

    NECのTAのドライバー・ユーティリティーをインスしようとする時に、「Administratorの権限でログインをし再インスをしてください」と出てしまいます。 他のアプリをインスする時は問題なくインスできます。 また、スタートボタンをクリックした時に「シャットダウン」の上には「Administratorのログオフ」とチャンとなっています。なにか設定みたいのはあるのでしょうか? それともなにかおかしいところのがあるのでしょうか? どうぞ教えてください。宜しくお願いいたします。

専門家に質問してみよう