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

このQ&Aのポイント
  • C#でリモートコンピューターのプロセスを監視するプログラムを作成中です。
  • プロセス.GetProcessesByNameメソッドを使用してリモートコンピューターのプロセスを取得する方法が分かりません。
  • ダイアログでユーザーがリモートコンピューターを選択し、選択されたコンピューターの名前やIPアドレスを取得する方法が知りたいです。
回答を見る
  • ベストアンサー

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

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

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

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

すいません情報提供だけです ※1.直接APIで http://yokohama.cool.ne.jp/chokuto/urawaza/api/SHBrowseForFolder.html SHBrowseForFolderで利用する構造体 http://yokohama.cool.ne.jp/chokuto/urawaza/struct/BROWSEINFO.html フラグにBIF_BROWSEFORCOMPUTERを格納したら、できると思います。 ※2.Framework1.1以上という前提であれば http://www.atmarkit.co.jp/fdotnet/dotnettips/056folderdlg/folderdlg.html 私の環境は1.0なので、1.1では実験していませんが、※2のURLの説明を読んでいる限り、内部で※1を利用しているようですね。 FolderBrowserDialogって、BIF_BROWSEFORCOMPUTERを格納するところがあるのかしら?

ohnotellme
質問者

お礼

ありがとうございました! とっかかりやすそうな※2のFolderBrowserDialogからみ手見ましたが、残念ながらBIF_BROWSEFORCOMPUTER的なものを指定できないようです。 *1の方は、winAPIでしょうか?難しそうな感じですね。ちょっと調べてみて、まずはwinAPI(使ったことない)について勉強をせねば、という感じです。。。

その他の回答 (4)

回答No.5

環境のあるところっていうか、家に戻りました。 pszDisplayNameみたいです^^

ohnotellme
質問者

お礼

//BROWSEINFO構造体(SHBrowseForFolderへの引数) [StructLayout(LayoutKind.Sequential,Pack=8)] public struct BROWSEINFO {  ・・・ } //フォルダを開く、のダイアログ [DllImport( "shell32.dll" )] static extern IntPtr SHBrowseForFolder( ref BROWSEINFO lpbi ); // IMallocインターフェイスの C# での表現 // SHBrowseForFolderで確保したPIDLのメモリ領域は、IMallocのFreeメソッドで開放する必要あり [InterfaceType ( ComInterfaceType.InterfaceIsIUnknown ),Guid ( "00000002-0000-0000-C000-000000000046" )] public interface IMalloc{ ・・・・ } //メモリの開放 [DllImport ( "Shell32.DLL" )] public static extern int SHGetMalloc ( out IMalloc ppMalloc ); /** * リモートコンピュータ選択ダイアログを出し、 * 選択されたコンピューター名を返す * * @return null/コンピューター名 */ private String GetRemoteName(){ String directoryPath = null;//ユーザー選択格納用 IntPtr pidlRet = IntPtr.Zero;//IntPtr構造体の0に初期化されたポインタを示す try{  BROWSEINFO binfo = new BROWSEINFO(); //SHBrowseForFolderへの参照渡し引数、BROWSEINFO構造体  binfo.pszDisplayName = new string( ' ', 256 );//選択されたフォルダ名が格納される  binfo.pidlRoot = 0x0012;//ダイアログ表示時のルート  binfo.ulFlags = 0x1000;//選択フィルター    pidlRet = SHBrowseForFolder( ref binfo ); //ダイアログ実行    if ( pidlRet == IntPtr.Zero ){   // ユーザーが [キャンセル] をクリックした場合。   directoryPath = null;  }  else{   directoryPath = binfo.pszDisplayName;   Debug.WriteLine("directoryPath : " + directoryPath);  } } finally{  //メモリの開放  IMalloc malloc;  SHGetMalloc(out malloc); malloc.Free ( pidlRet ); if(pidlRet != IntPtr.Zero){  malloc.Free ( pidlRet ); } } return(directoryPath); }

ohnotellme
質問者

補足

できました! ありがとうございます。 ただ、実際にはリモートコンピューターのプロセスはとれず、 Process.GetProcessesByName(プロセス名,コンピューター名)で 「System.InvalidOperationException」(リモートコンピューターのプロセス情報が取得できませんでした)が起きてしまうようです。 ともあれ、ダイアログはできましたので、一度締めさせていただきます。 ありがとうございました!

回答No.4

BIF_BROWSEFORCOMPUTER をフラグ指定したときは 構造体メンバのpszDisplayNameに入ると思うのですが、開発環境が無いので、ExcelのVBAに置き換えて発言しているので、違ったらすいません。 追記です。 binfo.pidlRoot = CSIDL_NETWORK(0x0012) を指定すると、もっと効果的な表示ができそうですね

回答No.3
ohnotellme
質問者

お礼

ありがとうございます! 上記アドレスを参考に組んでみました。 普通のフォルダを選択する分には、うまくいきました。 そして、リモートコンピューターのみを選択するよう設定した場合(binfo.ulFlags = 0x0001 = BIF_BROWSEFORCOMPUTER)、SHGetPathFromIDListではパス(?)を取得できないようです。 この場合、どのようにIPアドレスもしくはコンピューター名を引き出せばよいでしょうか? [StructLayout(LayoutKind.Sequential,Pack=8)] public struct BROWSEINFO {  public System.IntPtr hwndOwner;  public int pidlRoot;  public string pszDisplayName;  public string lpszTitle;  public uint ulFlags;  public int lpfn;  public int lParam;  public int iImage; } [DllImport( "shell32.dll" )] static extern IntPtr SHBrowseForFolder( ref BROWSEINFO lpbi ); [DllImport( "shell32.dll" )] static extern int SHGetPathFromIDList(IntPtr pidl, StringBuilder Path); ・・・・・・・・・・・・・・ void Button1Click(object sender, System.EventArgs e){  BROWSEINFO binfo = new BROWSEINFO();  binfo.pszDisplayName = new string( ' ', 256 );  binfo.lpszTitle = "BIF_BROWSEFORCOMPUTERは0x1000";  binfo.ulFlags = 0x1000;  //binfo.pidlRoot = "";  //ITEMIDLIST idlist = SHBrowseForFolder( ref binfo );  IntPtr pidlRet = IntPtr.Zero;  pidlRet = SHBrowseForFolder( ref binfo );  if ( pidlRet == IntPtr.Zero ){   // ユーザーが [キャンセル] をクリックした場合。  }  else{   String directoryPath;   StringBuilder dir = new StringBuilder( 260 );   if(SHGetPathFromIDList(pidlRet,dir) == 0){ directoryPath = dir.ToString ( );   }   else{    directoryPath = dir.ToString ( );   }   Debug.WriteLine("directoryPath : " + directoryPath);  } }

回答No.2

そうですか、駄目ですか。。。 ならC#での、APIサンプルをどうぞ

関連するQ&A

  • [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

  • 【VB2005】「ファイルを開くプログラムの選択」ダイアログを出すには?

    最近VB2005を始めた者です。 現在アプリケーションを作成しております。 そのアプリケーションの1つに外部ファイルを開く機能を付け加えたいと思っています。 機能としては、   ・普通のテキストファイルを開きたい時 → notepad.exe   ・大容量のテキストファイルを開き検索したい時 → 別のアプリ という風にユーザーが開くアプリを選択できるようにしたいのです。 それを実現するために、 拡張子の無いファイルを開くときに出る   「ファイルを開くプログラムの選択」 というダイアログボックス(?)を出したいと思っています。 関連付けられているファイルを開く事は ShellExecute() や Process.Start() などで実現できているのですが、「ファイルを開くプログラムの選択」がどうしても実現できず困っております。 お暇な時で構いませんのでご回答いただければ幸いです。

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

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

  • リモート接続したコンピュータ内でアプリケーションを実行し、アプリケーシ

    リモート接続したコンピュータ内でアプリケーションを実行し、アプリケーションでの処理が完了した時にコンピュータを自動でシャットダウンする様に指定しているのですが、下記メッセージが出てシャットダウンが出来ません。 このダイアログを表示しないようにしたいのですが、どなたかご存知ではないでしょうか? (Ctrl + Alt + End でシャットダウンを選択した時も同じメッセージが出ます。) アプリケーションはフリーソフトですので改変することは出来ません。 ダイアログメッセージ 「このリモートコンピュータをシャットダウンした場合、誰かがそのコンピュータのある場所で手動でコンピュータを再起動しない限り、誰もこのコンピュータを使えなくなります。シャットダウンを続行しますか?」 ご存知の方がいらっしゃいましたらご教示下さい。

  • リモートコンピュータに接続できません

    突然、ネットに接続できなくなりました。 ウイルス監視ソフトでポート指定などの 設定を変えたためかな?などと思い、ネット関連の 設定は全て元に戻しました。しかし http://oshiete1.goo.ne.jp/kotaeru.php3?q=497334 の方の質問の中に出てくる 「ダイヤルしています・・・ ダイヤル試行1 ダイヤルしています リモートコンピュータに接続済みです。 ユーザー名とパスワードを確認しています。 リモートコンピュータへの接続に失敗しました。 接続を確立できません。」 という表示が出るのです。 この方はDOSフォーマットで直ったらしいのですが、自分にはまったくやり方が分かりません。どなたか、解決策、またはDOSフォーマットの方法を教えていただけないでしょうか? PCはSOTEC270R4 OSはMEからのアップグレードでXP ブラウザはIEの6.0?だと思います。 よろしくお願いします。

  • Windowsのコンピューター名等を取得するプログラム

    お世話になります。 IPアドレスのみがわかっているリモートのWindowsマシン(対象はWin98以上、できればWin95も)の情報を取得する方法を探しています。 ●取得したい情報 ・コンピュータ名 ・Windowsの種類(98や2000、XP) ・Windowsにログインしているユーザー名 これらの情報を取得するためにはどの言語(C,VB,VBScript,JScript他なんでも可)でどんな手順(触りの部分でもかまいません)を使えば実現できるでしょうか? コマンドを実行して出力の内容を整形するというようなことでもOKです。その場合どんなコマンドを使えばよいか示して頂ければと思います。 例えばコンピューター名だったら”nbtstat- A IPアドレス”の結果から取得するなど。 ※リモートのWindowsには何も追加インストールをしない仕組みが良いです。

  • リモートコンピュータのPC名を取得したいのですが・・・・。

    すみません。どなたかご存知でしたら教えてください。 私はVBの初心者です。VB2005を使用しています。 IPアドレスを指定し、そのPCのコンピュータ名を取得したいと考えています。色々調べたところ、APIを呼び出さなければいけないところまではわかったのですが、その先がなかなか判明しません。 Myクラスを使うとローカルPC名は簡単に取得できるのですが、 リモートとなると、なかなかどのサイトにも乗っていません。 リモートPCはメールサーバや、WEBサーバではなく、ただのクライアントなので、DNS引きの取得方法では取得できないようです。 すみませんが、困っています。 よろしくお願いいたします。

  • リモートデスクトップの状況を知りたい

    Windows Server 2003とXP Pro SP3を使用しています。 自分のPCにリモートデスクトップで接続しているユーザーやIP、 コンピュータ名などを確認することはできるのでしょうか。 Windowsの機能としてない場合、機能を実現するフリーウェアなどをご紹介いただけますでしょうか。

  • vb.net2003での二重起動防止について

    度々お世話になっています。 vb.net2003でアプリケーションを作りました。 そこで二重起動防止を行いたい為に、Process.GetProcessesByName メソッドを使用して行いました。 二重起動防止は出来ているのですが、ターミナルサービスでリモートデスクトップ接続を行い、同一ユーザーの二重起動防止はしたいですが、1ユーザーでも使用していたら 別ユーザーで起動できません。 何か良い方法はありませんでしょうか? 出来れば解説しているサイトがあれば教えて下さい。

  • C言語におけるコンピュータ名・ユーザ名の取得方法

    C言語で自分のコンピュータ名とログインユーザ名を取得するには、 どのようにプログラムを組めば良いでしょうか? (VC++ではなくCで実現は可能でしょうか?) OSバージョンはWindowsXPです。

専門家に質問してみよう