2017-03-08 13 views
0

ネットワークをスキャンし、すべての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シェルコマンドをエミュレートする他のボックスがあるかもしれないよう

+1

'TCP NetBIOS'ポートがopenend、port 139であるかどうかを調べることができます。(windows filesharing)なぜそれがWindowsシステムであるべきですか?何を探していますか?ファイル共有?特定のソフトウェアに接続するには? –

+0

ありがとう、ありがとう。しかし、私は、ファイル共有ポートが変更されたらどうなるでしょうか?出来ますか?私はリモートPC(psexec)でexeを実行する別の方法があります。リモートマシンがWindowsであると確信していない限り、私は試してみません。 – madjack

答えて

0

@Jeroenバンランゲンのcommentによると、私はGetWindowsHostNameと私のGetHostName方法を変更しました。

private string GetWindowsHostName(string ipAddress) 
{ 
    try 
    { 
     IPHostEntry entry = Dns.GetHostEntry(ipAddress); 
     if (entry != null) 
     { 
      try 
      { 
       using (TcpClient tcpClient = new TcpClient()) 
       { 
        // 445 is default TCP SMB port 
        tcpClient.Connect(ipAddress, 445); 
       } 

       using (TcpClient tcpClient = new TcpClient()) 
       { 
        // 139 is default TCP NetBIOS port. 
        tcpClient.Connect(ipAddress, 139); 
       } 

       return entry.HostName; 
      } 
      catch (Exception ex) 
      { 
       System.Console.WriteLine(ex.Message); 
      } 
     } 
    } 
    catch (SocketException ex) 
    { 
     System.Console.WriteLine(ex.Message + " - " + ipAddress); 
    } 

    return null; 
} 

偽陽性である可能性がありますが、これは私には受け入れられない可能性があります。

0

サービスの検出は真ではないでしょう。あなたのコードは次のようになります:

string IPADDRESS = "192.168.1.1"; 

Process p = new Process(); 
p.StartInfo.UseShellExecute = false; 
p.StartInfo.RedirectStandardOutput = true; 
p.StartInfo.RedirectStandardError = true; 

p.startInfo.FileName = "cmd.exe"; 
p.startInfo.Arguments = "/C systeminfo /s IPADDRESS"; 
p.Start(); 
p.WaitForExit(); 

string output = p.StandardOutput.ReadToEnd(); 
string error = p.StandardError.ReadToEnd(); 
p.WaitForExit(); 

if(output.Contains("Microsoft Windows")) { Console.WriteLine("Windows OS"); } 
0

リモートマシンでOSを検出する方法の1つは、pingを使用することです。各IPアドレスに対してpingを実行し、TTLを取得します。それはあなたが扱っているOSのアイデアを与えるはずです。 OSにTTLを照合表はここで見つけることができます:http://www.kellyodonnell.com/content/determining-os-type-ping

関連する問題