[C#]リモートアクセスのProcess取得で「アクセス拒否」

このQ&Aのポイント
  • 現在、PCのプロセスを取得するプログラムを作っています。
  • しかし、リモートコンピューターからGetProcessesByNameでプロセスを取得しようとすると、アクセス拒否の例外が出てしまいます。
  • アクセスが拒否されないために必要な条件やエラー回避策、ヒントを教えていただけると幸いです。
回答を見る
  • ベストアンサー

[C#]リモートアクセスのProcess取得で「アクセス拒否」

現在、PCのプロセスを取得するプログラムを作っています。 しかし、リモートコンピューターからGetProcessesByNameでプロセスを取得しようとすると、アクセス拒否の例外が出てしまいます。 具体的には、以下のような例外をキャッチできるのですが、アクセス拒否されないために必要な条件となんでしょうか? またエラー回避策、ヒントなど、教えていただければ幸いです。 よろしくお願いします。 -------------------------------------- try{ Process [] targetProcess = Process.GetProcessesByName(プロセス名 , リモートコンピューター名); } catch(System.InvalidOperationException e){ Debug.WriteLine(e.Source + ":1" + e.Message); System.Exception se = e.InnerException; Debug.WriteLine(se.Source + ":2:" + se.Message); } -------------------------------------- ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ -------------------------------------- System:1:リモート コンピュータからプロセス情報を取得できませんでした。 System:2:アクセスが拒否されました。 -------------------------------------- 参考:http://oshiete1.goo.ne.jp/kotaeru.php3?q=1596734

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

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

回さないで取る方法がありました。 先ほどの延長で、 targetProcess = Process.GetProcesses(端末A); targetProcess2 = targetProcess(0).GetProcessesByName("iexplore",端末A); としたら、取得できました。 ※端末AはAdmin権限あり GetProcessesByNameを実行するプロセスオブジェクトが、その端末にないとダメっぽいですね^^

ohnotellme
質問者

お礼

権限の問題で、スタンドアロンなアプリからはリモートのプロセスをとるのは難しいようですね。 TCP(?)を使うような、ネットワーク型アプリに手法を切り替えてみたいと思います。 ありがとうございました!

その他の回答 (1)

回答No.1

私の環境 「たくさんのXPProたちで構成された、ドメイン環境」 端末A・・・私のドメインユーザで、Admin権限のあるPC 端末B・・・私のドメインユーザで、Admin権限のないPC GetProcessesByName やってみました。 引数:端末A・・・エラーは発生しませんでしたが、取得プロセス数が0 引数:端末B・・・あなたと同様のエラー となりました そこで Process.GetProcessesByName("ほげ "端末") ではなく Process.GetProcesses("端末") を実行してみました。 引数:端末A・・・全プロセスが取得できました 引数:端末B・・・さきほどと同様のエラー となりました。 リモートなので、やはり権限が絡むのは必須だと思います。 プロセス名を指定しての取得方法は、どうやるんでしょうね^^;

ohnotellme
質問者

お礼

ありがとうございます! 残念ながら、私の環境ではadmin権限のあるPCが私のPCしかないので、実験できません。 プロセスが取得できて、特定のプロセスを見たい場合、全ての配列を順番にみて、見たいプロセス名がある配列要素番号を把握する破目になるのかな? Process [] targetProcess = Process.GetProcesses(リモートコンピューター名); if(targetProcess != null && targetProcess.Length >= 1){  for(int i=0;i<targetProcess.Length;i++){   Debug.WriteLine(i + ":" + targetProcess[i].ProcessName);  } } 私の方では、他のPCに特定のソフトで処理をさせることが多々あるため、その終了を知りたい、ということがあり、取得したプロセスからスレッドを引き出して、スレッドの状況をみることで、処理が実行中か否か、というのを知ろうと思ってたのですが。。。 リモートに対する処理は、難しいのですね。。。

関連するQ&A

  • [C#]リモートコンピューターを選択するダイアログ

    C#でコンピュータのプロセスを監視するプログラムを作っています。 Process.GetProcessesByName メソッドによるプロセスの取得は、リモートコンピューターでも可能なようなのですが、以下1・2の実現方法が分かりません。 1.ユーザーが(ダイアログか何かで)リモートコンピューターを選択する 2.選択されたリモートコンピューターの名前かIPアドレスを取得する 3.プロセスを取得する。Process [] ipByName = Process.GetProcessesByName("notepad", "169.0.0.0"); コンピューターを選択して取得するようなダイアログは.NETに用意されていないようですが、この場合どのようにすればよいでしょうか? よろしくお願いします。

  • 他のコンピュータのプロセスを取得

    VB2005Expressにて開発しています。 他のコンピュータで実行中のプロセスを取得したいと思っています。 Dim ps As System.Diagnostics.Process() = _ System.Diagnostics.Process.GetProcesses("プロセス名","192.168.XXX.XXX") で指定したコンピュータからプロセスは取得することは出来ました。 ただ、特定のコンピュータだけ「リモート コンピュータに接続できませんでした。」というエラーが出てしまいます。 プログラムの実行環境のID、パスワードと特定のコンピュータの IDとパスワードが異なっているのが原因だと思っています。 GetProcessesにIDとパスワードを設定してプロセスを取得することは 可能なのでしょうか。 ご存知の方がいらっしゃいましたらご教授下さい。 よろしくお願いします。

  • プロセスの情報取得

    vb.netで開発しています。 あるexe(仮にwatch_p.exeとします)のプロセスの情報(CPU時間)を取得し、一定時間以上(30分以上)だった場合強制終了するプログラムを作成しようとしています。 以下のようにCPU時間の取得する方法までは見えていますが、取得した 時間を比較する方法が見えていません。 忙しいことと思いますが、回答をお願いします。 Dim ps As System.Diagnostics.Process() = _ System.Diagnostics.Process.GetProcesses() '配列から1つずつ取り出す Dim p As System.Diagnostics.Process For Each p In ps Try If p.ProcessName="watch_p" then '合計プロセッサ時間 Console.WriteLine(p.TotalProcessorTime) End if Catch End Try Next p

  • サービスによるリモートアクセス

    現在レジストリのリモートアクセスを行っているのですが、 アクセス権限のところで躓いています。 exeを実行する形(ログインユーザ権限)でリモートアクセスを行うツールを起動してサーバにアクセスすると、レジストリのリモートアクセスが成功し、値が取得できるのですが、サービス(SYSTEM権限)として起動すると、アクセスが拒否されてしまいます。 サービスアプリとして、起動した場合にレジストリにリモートアクセスする方法が見当つかないため、どなたかアドバイスして頂けないでしょうか? よろしくおねがいします。

  • 終了するプロセス名の取得方法

    使用言語はC#です。 System.Diagnostics.Process[] ps = System.Diagnostics.Process.GetProcesses(); for (int i = 0; i<= ps.Length-1 ; i++) {   if (ps[i].MainWindowTitle != string.Empty) {   Console.WriteLine("ウィンドウタイトル:" + ps[i].MainWindowTitle);     Console.WriteLine("起動時間:" + ps[i].StartTime); }   try {     ps[i].EnableRaisingEvents = true; ps[i].SynchronizingObject = this; ps[i].Exited += new EventHandler(p_Exited); if(ps[i].MainWindowTitle != string.Empty) {       Console.WriteLine("ウィンドウタイトル: " + ps[i].MainWindowTitle);       Console.WriteLine("終了時間:" + ps[i].ExitTime); } 現在このようにしてウィンドウのタスクバー上に表示されるプロセスのタイトルを取得し、プロセスが終了したときに同じようにウィンドウのタイトルを表示しようとしました。 起動時のプロセスは取得できるのですが、終了時のプロセスが取得できません。 プロセスを全取得して、比較して終了したプロセスを判断すると終了時刻が取れないように思えるので、プロセスが終了するたびにイベントハンドらにとばすようにしたいです。ご存知の方がいましたよろしくお願いします。

  • c# 動的に書き換わるHTMLを取得するには

    あるサイトにアクセスした際、ajaxで動的に内容が書き換わるため、WebBrowserDocumentCompletedEventHandlerでeventを拾うことがきません。 (当然なのはわかっています。) wb.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(wb_DocumentCompleted); private void wb_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { Console.WriteLine(wb.Document.Body.OuterHtml); ここではhtmlがみれるのですが、ajaxで書き換えられる前のソースになります。 } この後に別のメソッドで Console.WriteLine(wb.Document.Body.OuterHtml); とすると System.Threading.ThreadAbortExceptionが発生してしまいます。 どうすれば定期的に書き換えられた後の内容が取得できるでしょうか?

  • リモートシステムがPCにアクセス

    昨夜からInternet Security2004の 「リモートシステムがこのコンピュータにアクセスしようとしています」という表示が何度も出ます。 自分のIPアドレスのときもありますが、ほとんど全部のIPアドレスが違うものです。 誰かに侵入されようとしているのでしょうか?

  • リモートシステムがアクセスしようとしています。

    Windows XP、ノートンインターネットセキュリチー2004を使用しています。セキュリチー設定は高を選んでいますが、接続のたびにリモートシステムがこのコンピューターにアクセスしようとしています。となりわずらわしくて仕方ありません。表示が出にくくする方法を教えてください。  また、シマンテックでセキュリチーレスポンスをするとicmp ping、22のポートが開いていますとなってしまいます。これを閉じるやり方を教えてください。

  • リモートシステム

    リモートシステムがこのコンピュータにアクセスしようとしています。どう処理しますか?という、プログラム制御 高危険度というのが、出てきて、消えません。どうしたらいいか教えて下さい。

  • リモートシステムって何ですか?

    リモートシステムがこのコンピューターにアクセスしようとしています。という警告がよく出るんですが何のことだかわからないので、推奨(遮断)を選んでますが、これでいいのかどうかを教えてください。 (NIS使用)

専門家に質問してみよう