2017-03-08 8 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 운영 체제가있는 장치 만 반환했는지 확인해야합니다.

제 3 자 라이브러리없이 어떻게 할 수 있습니까? 더 좋은 방법이 있다면 GetHostName 메서드를 사용할 필요가 없습니다.

P. Linux, MacOS, Android 및 IOS 장치는 예상대로 찾을 수 없습니다. 리눅스 또는 안정적으로 원격 Windows OS 정보를 가져 윈도우 머신에서 윈도우 파일 공유

사용 systeminfo /s IPADDRESS 쉘 명령을 모방 다른 상자가있을 수 있으므로

+1

'TCP NetBIOS' 포트가 openend 포트 139인지 확인할 수 있습니다. (windows filesharing) 왜 Windows 시스템이어야합니까? 너 뭐 찾고있어? 파일 공유? 특정 소프트웨어를 연결할 수 있습니까? –

+0

감사합니다. 하지만 파일 공유 포트가 변경되면 어떻게해야합니까? 가능한가? 원격 PC에서 exe를 실행하는 또 다른 방법이 있습니다 (psexec 포함). 원격 컴퓨터가 Windows라고 확신하지 않으면 시도하고 싶지 않습니다. – madjack

답변

0

http://www.kellyodonnell.com/content/determining-os-type-ping @Jeroen 반 랑겐의 comment에 따르면, 나는 GetWindowsHostNameGetHostName 방법을 변경했습니다.

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를 감지 할 수있는 한 가지 방법은 ping을 사용하는 것입니다. 각각의 IP 주소를 ping하고 TTL을 얻습니다. 그것은 당신에게 당신이 다루고있는 OS에 대한 아이디어를 줄 것입니다. OS에 대한 테이블 일치 TTL은 여기에서 찾을 수 있습니다 :