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

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

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

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

  • d_g
  • お礼率88% (22/25)

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

http://msdn.microsoft.com/ja-jp/windows/dd871146.aspx のページに書かれている整合性レベル ( Integrity Level : IL ) のことですよね。 ↓のページが参考になると思います。 http://msdn.microsoft.com/en-us/library/bb625966.aspx ウィンドウハンドルからプロセスハンドルを取得するには、GetProcessId と OpenProcess を使用すれば良いと思います。

d_g
質問者

お礼

回答ありがとうございます。 参考ページを見ながら試してみたいと思います。

関連するQ&A

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

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

  • SYSTEM権限でプロセス機動

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

  • 既存プロセスからプロセスのプライマリースレッドIDの取得方法

    いつもお世話になってます。 プロセスに関することで分からないことがあるため、どなたか御教授して下さい。 只今、VC++で開発を行っているのですが、CreateProcess関数を使用して開始したプロセスの情報が、引数で指定したPROCESS_INFORMATIONにプライマリースレッドのハンドルやIDが設定されるのは知っているのですが、現在動作中のプロセスからそのプロセスのプライマリースレッドのIDを取得することは可能でしょうか? 具体的には、動作中のプロセスIDを指定するとそのプロセスのプライマリースレッドに対してPostThreadMessageで任意のメッセージが送れるという仕様です。 対象のプロセスがウィンドウを持っていれば、EnumWindows関数を使用してウィンドウに対してPostMessageができるというのは分かったのですが、今回対象のプロセスがウィンドウを持たない為、上記のようにスレッドに対してメッセージを送るようになっています。 CreateProcess呼び出し時にはスレッドIDが取得できることから、プロセスID、または、プロセスハンドルからスレッドIDが取得できるのではないかなと考えられるんですが。。。。

  • 権限昇格の確認を出さないプロダクトIDの取得方法

    Visual Studio2013で 一つのソリューションの中でC#とC++を使って開発を行っています。 C++でWindowsのレジストリを読む処理を書いたところ開発環境では問題なく動作したのですが 別のPCでは管理者権限として実行しないと読めませんでした。 そこでネットの情報を参考にVisual Studioでマニフェストファイルを作成し起動時に管理者に昇格させるようにしました。 レジストリを読む処理は問題なく動作したのですが、必ず「権限昇格の確認ダイアログ」が出てしまいます。 ネットで調べたところ、プログラムを「Program Files」以下に置かなければでないような記述を見たので \C直下に置いたのですが変わらず「権限昇格確認ダイアログ」が出てしまいます。 「権限昇格確認ダイアログ」を出さずにレジストリを読むために何が必要でしょうか? (作成したexeのプロパティ-互換性 から特権レベルを変更するではなく、プログラムでどうにか出来ないかを考えています) また、UACが有効だと問題が起こる可能性があるとの記事も見つけました。 UACは有効にしないほうがよいのでしょうか? http://dobon.net/vb/dotnet/system/uac.html 確かに「権限昇格の確認ダイアログ」が出るようになってからプログラム内部からexeを起動している箇所で実行環境だとexeの起動が出来なくなってしまいました。 よろしくお願いします。 開発環境  Windows7 32bit  Visual Studio2013 インストール済   実行環境  Windows7 32bit  .Net 4.5 インストール済  VisualStudio 2013 の Visual C++ 再頒布可能パッケージインストール済   読みたいレジストリ  WindowsのProductID   ※VBで作られたアプリですが、「権限昇格の確認ダイアログ」を出さずに ProductIDを表示するアプリを見たことであるので何かしらやり方はあるのでは?と思っています。

  • プロセスIDに対応したファイルのフルパスの取得

    ネットワーク上の他PCのプロセスIDとフルパス(モジュール名)の取得の仕方を教えてください。 開発環境は OS:windows xp pro SP2 <- 全てのPC visual studio.net 2003 です。 現在vb.netでプロセス監視アプリの作成をしています。 他PCのプロセスは ManagementObjectSearcher で 取得することができました。 自PCのモジュール名(フルパス)はGetModuleFileNameEx(VB6.0)で取得できましたが、他PCの場合うまくいきません。 よろしくお願いします。

  • あるデバイスが接続されたサーバをクライアントPCからブラウザで操作でき

    あるデバイスが接続されたサーバをクライアントPCからブラウザで操作できるようにしたいのですが、方法がわかりません。 そのデバイスを制御するアプリケーションはすでにあり、サーバ上で常に動作しているものとします。 このアプリは、デバイスを制御するプロセスと画面を表示するプロセスの2つに分かれており、互いにPostMessageで通信しあっています。画面表示アプリは従来サーバ単体で動作する用に作られたもので独自の画面表示プログラムです。 考えたのは、サーバにHTTPリクエストを送りサーバ側でActiveXなどのコンポーネントを動的に生成し、その中で既存のアプリのウィンドウハンドルを取得してPostMessageすることによってアプリを動かします。 ここまではできるのですが、そのアプリから処理結果を受け取る方法がわかりません。 PostMessageで行わせた処理の結果を元に、ASPで画面を更新してクライアントに返したいのです。 ActiveXからアプリにPostMessageした後、アプリからメッセージが投げられるのを待つというようなことができるのでしょうか? アプリがサーバ上で動的に生成されたActiveXコンポーネントのWindowsハンドルを取得して、PostMessageするなどということができるのでしょうか。

  • リモートPCで動作しているプロセスにWindowsメッセージを投げるこ

    リモートPCで動作しているプロセスにWindowsメッセージを投げることは可能でしょうか? 下記のようなコードで試してみたのですが、ASP.NETでリモートPCのプロセスを取得できています。 これらの中から目的のプロセスをプロセス名で特定し、MainWindowHandleプロパティでウィンドウハンドルを取得します。 これを利用してSendMessageで目的のウィンドウにメッセージを投げようとしていますが、pFoundWindowには0が入っています。 ちなみに目的のプロセスはAdmin権限で実行されていますが、他の権限で実行されているプロセスも同じようにウィンドウハンドルを取得できていません。 [C#] Process[] processes = Process.GetProcesses("servername”); //プロセスリスト取得 foreach (Process p in processes) { if (p.ProcessName == "target_process"){ //目的のプロセスであれば IntPtr pFoundWindow = p.MainWindowHandle; //メインウィンドウのハンドルを取得 SendMessage(pFoundWindow, msg, wParam, lParam); } MSDNには、MainWindowHandleはローカルPCで実行されているプロセスしか取得できないとありましたが、権限の設定等で取得できないのでしょうか? 通常、リモート接続では実行ユーザがNETWIORK SERVICEになるようですが、これをAdmin権限で実行できれば取得できそうな気がします。 これと同様のことをFindWindow関数を使ってもできるのですが、同じくリモートPCのプロセスではウィンドウハンドルを取得できません。 他に良い方法はありませんでしょうか? サーバーはWindows Server 2003 + IIS6.0です。

  • PIDからプロセス・アプリを特定する方法

    タスクマネージャーやtasklistでPIDを参照したときに そのPIDからプロセス・アプリを特定する方法がわかりません。 とりあえずイメージ名にexeのファイル名はわかります。 専用のexeの場合にはそれで足りますがJavaアプリの場合にはそれではわかりません。 eclipse立ち上げてJMeter立ち上げてTomcatを複数立ち上げて… などとやっているとjavaw.exeが複数出てきます。 Linuxの場合には起動時の引数を調べることにより何のアプリなのか特定できます。 がWindowsの場合の調べ方がわかりません。 Linuxと同様に起動時の引数を調べられれば十分です。 それ以外の方法でも特定できればうれしいです。 PIDからプロセス・アプリを特定する方法 これを教えてください。よろしくお願いします。

  • アプリの権限について

    最近DLしたアプリで ・ネットワーク通信 ネットワークへのフルアクセス という権限が記載されてありました。 これは自分のスマートフォンにDLした場合、開発者側に履歴やブックマークなどが見れてしまうのでしょうか?

  • Process.Startの戻り値を後で取得

    お世話になっております。 作業マシン:WINDOWS Server2008 (仮想) 開発ツール:VWD2010(VB) 使用DB:SQLServer2008R2 にて、Webアプリを開発しております。 ASP.NET開発の経験はおおよそ1ヶ月半程です。 現在、Process.Startで外部exeを実行しております。 この外部実行ファイルは3分くらい掛かる処理で、 WaitForExit() で結果を待たずに 次の画面(待機用画面)に遷移しています。 処理が終了したら、待機画面から結果画面へと遷移させたいのですが、 プロセスの完了と、その結果(戻り値)を、 Process.Startをコールした画面以外で受け取る事が出来るのでしょうか。 WaitForExitを使用するならば、 素直に終了を待ち、終了後にExitCodeを取得、 Ret = Process.Start() で戻り値も取得できましたが… WaitForExit( ) をしない場合、どのようにして取得できるのでしょうか。 http://dobon.net/vb/dotnet/process/openfile.html こちら等、Process.Start 非同期 などのキーワードで出てくるのは Processを実行した同画面内での待機のケースが多く、 今自分が遭遇しているケースに応用するには どうにも自分の理解が追いつけず質問いたします。 実行する画面でプロセスIDを取得し、セッションに持たせ、 終了を判断したい画面でプロセスIDを元にチェックをする… と言うことも考えてみましたが、プロセスIDを頼りに、 終了したプロセスの戻り値を突き止める方法も見つからず (発想自体が間違っているかもしれません) 皆様のお力を貸して頂けないでしょうか。何卒よろしくお願いします。

専門家に質問してみよう