
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/S …
SHBrowseForFolderで利用する構造体
http://yokohama.cool.ne.jp/chokuto/urawaza/struc …
フラグにBIF_BROWSEFORCOMPUTERを格納したら、できると思います。
※2.Framework1.1以上という前提であれば
http://www.atmarkit.co.jp/fdotnet/dotnettips/056 …
私の環境は1.0なので、1.1では実験していませんが、※2のURLの説明を読んでいる限り、内部で※1を利用しているようですね。
FolderBrowserDialogって、BIF_BROWSEFORCOMPUTERを格納するところがあるのかしら?
ありがとうございました!
とっかかりやすそうな※2のFolderBrowserDialogからみ手見ましたが、残念ながらBIF_BROWSEFORCOMPUTER的なものを指定できないようです。
*1の方は、winAPIでしょうか?難しそうな感じですね。ちょっと調べてみて、まずはwinAPI(使ったことない)について勉強をせねば、という感じです。。。
No.5
- 回答日時:
環境のあるところっていうか、家に戻りました。
pszDisplayNameみたいです^^
この回答への補足
できました!
ありがとうございます。
ただ、実際にはリモートコンピューターのプロセスはとれず、
Process.GetProcessesByName(プロセス名,コンピューター名)で
「System.InvalidOperationException」(リモートコンピューターのプロセス情報が取得できませんでした)が起きてしまうようです。
ともあれ、ダイアログはできましたので、一度締めさせていただきます。
ありがとうございました!
//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);
}
No.4
- 回答日時:
BIF_BROWSEFORCOMPUTER
をフラグ指定したときは
構造体メンバのpszDisplayNameに入ると思うのですが、開発環境が無いので、ExcelのVBAに置き換えて発言しているので、違ったらすいません。
追記です。
binfo.pidlRoot = CSIDL_NETWORK(0x0012)
を指定すると、もっと効果的な表示ができそうですね
No.3
- 回答日時:
ありがとうございます!
上記アドレスを参考に組んでみました。
普通のフォルダを選択する分には、うまくいきました。
そして、リモートコンピューターのみを選択するよう設定した場合(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);
}
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Windows 10 サブアカウントの名前変更 1 2023/02/11 01:27
- Visual Basic(VBA) シートをコピーする下記記述でダイアログを用いた記述がわかりません?( A = Dir(ThisWor 4 2022/08/22 12:26
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/06 17:46
- Visual Basic(VBA) 集めたシートのシート名を変更したい。 下記のコードでサブフォルダにあるファイルのSheet3を集めて 6 2022/08/23 10:38
- Visual Basic(VBA) マクロVBA 1シートをまとめる 閉じ方 初心者 SOS! 1 2022/06/17 14:54
- Excel(エクセル) フォルダ内のワードファイルをPDFに一括変換するVBA 3 2023/06/09 16:51
- C言語・C++・C# ActiveXコントロールを.NETにインポートできない??? 2 2023/05/02 02:50
- Visual Basic(VBA) 動かなくなってしまった古いVBAを動くようにしたい 8 2022/09/20 13:57
- Visual Basic(VBA) Application.Dialogs(xlDialogFileDelete).Showの件 1 2023/02/22 10:02
- ネットワーク 瞬快 コンソール操作 ローカル端末のファイルをリモート端末にコピーする方法がない? 1 2023/03/17 18:56
関連するカテゴリからQ&Aを探す
今、見られている記事はコレ!
-
弁護士が語る「合法と違法を分けるオンラインカジノのシンプルな線引き」
「お金を賭けたら違法です」ーーこう答えたのは富士見坂法律事務所の井上義之弁護士。オンラインカジノが違法となるかどうかの基準は、このように非常にシンプルである。しかし2025年にはいって、違法賭博事件が相次...
-
釣りと密漁の違いは?知らなかったでは済まされない?事前にできることは?
知らなかったでは済まされないのが法律の世界であるが、全てを知ってから何かをするには少々手間がかかるし、最悪始めることすらできずに終わってしまうこともあり得る。教えてgooでも「釣りと密漁の境目はどこです...
-
カスハラとクレームの違いは?カスハラの法的責任は?企業がとるべき対応は?
東京都が、客からの迷惑行為などを称した「カスタマーハラスメント」、いわゆる「カスハラ」の防止を目的とした条例を、全国で初めて成立させた。条例に罰則はなく、2025年4月1日から施行される。 この動きは自治体...
-
なぜ批判コメントをするの?その心理と向き合い方をカウンセラーにきいた!
今や生活に必要不可欠となったインターネット。手軽に情報を得られるだけでなく、ネットを介したコミュニケーションも一般的となった。それと同時に顕在化しているのが、他者に対する辛らつな意見だ。ネットニュース...
-
大麻の使用罪がなかった理由や法改正での変更点、他国との違いを弁護士が解説
ドイツで2024年4月に大麻が合法化され、その2ヶ月後にサッカーEURO2024が行われた。その際、ドイツ警察は大会運営における治安維持の一つの方針として「アルコールを飲んでいるグループと、大麻を吸っているグループ...
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バックグラウンドのプロセスの...
-
Process.Startの戻り値を後で取得
-
他のコンピュータのプロセスを取得
-
vb.netでEXCEL起動がうまくでき...
-
指定した実行中プロセスの、指...
-
OSPFでプロセスを分ける意義に...
-
VB6.0 SHELLで起動...
-
親子プロセス間でのデータの受...
-
実行中のプログラムIDが取得...
-
C#でのbatファイル実行結果取得
-
フレームワークとプロセスの違...
-
SQLServerサービスマネージャの...
-
怪しいプロセス教えてください。
-
ロードアベレージが高いのです...
-
プロセスIDの取得方法について
-
プロセスのアタッチ・デタッチ...
-
別のプロセスの関数を呼び出す...
-
GPLによるソース公開の回避方法
-
特定ユーザーのプロセス情報を...
-
非表示になったエクセルは?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バックグラウンドのプロセスの...
-
プロセスIDの取得方法について
-
ADOでアクセスのレコードに...
-
C#でのbatファイル実行結果取得
-
タスクマネージャーのプロセス...
-
VB6.0 SHELLで起動...
-
プロセスのアタッチ・デタッチ...
-
非表示になったエクセルは?
-
怪しいプロセス教えてください。
-
sleep関数の精度について
-
【C#】別プロセスがロックか...
-
Process.Startの戻り値を後で取得
-
IISがフリーズ
-
プロセスIDからウィンドウハ...
-
Linuxでのスレッド間メッセージ...
-
Windowsでのfork方法
-
SendMessageが失敗するときがある
-
警告『 別のプロセスで使用され...
-
WSH.Runで待機できません
-
VB.NETで起動したExcelの閉じ方...
おすすめ情報