ネットワークをスキャンし、すべてのWindowsマシンのホスト名を列挙したいと考えています。入力としてip範囲をとり、ホスト名を返すインターフェイスメソッドがあります。私はそれを実装する必要があります。だから、ここに私のコードです:IP範囲内のWindows PCを見つける方法
public ICollection<string> EnumerateWindowsComputers(ICollection<string> ipList)
{
ICollection<string> hostNames = new List<string>();
foreach (var ip in ipList)
{
var hostName = GetHostName(ip);
if (string.IsNullOrEmpty(hostName) == false)
{
hostNames.Add(hostName)
}
}
return hostNames;
}
private static string GetHostName(string ipAddress)
{
try
{
IPHostEntry entry = Dns.GetHostEntry(ipAddress);
if (entry != null)
{
return entry.HostName;
}
}
catch (SocketException ex)
{
System.Console.WriteLine(ex.Message + " - " + ipAddress);
}
return null;
}
このメソッドが正常にすべてのWindowsマシンを列挙には、それでネットワークプリンタがあります。プリンタのホスト名は簡単に無視できますが、それは良い解決策ではありません。 Windowsオペレーティングシステムを搭載したデバイスだけが返されるようにする必要があります。
サードパーティ製のライブラリなしでどうやったらいいですか?より良い方法がある場合は、GetHostName
メソッドを使用する必要はありません。
P.S. Linux、MacOS、Android、IOSデバイスは期待どおりに見つかりません。 Linuxまたは確実にリモートのWindows OSの詳細を取得するには、WindowsマシンからWindowsのファイル共有
使用systeminfo /s IPADDRESS
シェルコマンドをエミュレートする他のボックスがあるかもしれないよう
'TCP NetBIOS'ポートがopenend、port 139であるかどうかを調べることができます。(windows filesharing)なぜそれがWindowsシステムであるべきですか?何を探していますか?ファイル共有?特定のソフトウェアに接続するには? –
ありがとう、ありがとう。しかし、私は、ファイル共有ポートが変更されたらどうなるでしょうか?出来ますか?私はリモートPC(psexec)でexeを実行する別の方法があります。リモートマシンがWindowsであると確信していない限り、私は試してみません。 – madjack