2014-09-08 2 views
0

Я работаю над утилитой для управления несколькими компьютерами в указанном домене (не обязательно доменом, на котором работает приложение, является членом) в пределах указанного корня каталога. Проблема, с которой я сталкиваюсь, - это когда у меня есть коллекция имен компьютеров из внешнего AD OU, я не могу управлять на основе имени компьютера из-за DNS. Можно ли выполнить поиск DNS на внешнем DNS-сервере, предоставив IP-адрес DNS-сервера и учетные данные для этого домена?C# Получить IP удаленного компьютера на отдельном DNS-сервере

Вот код, который у меня есть для процесса инициализации (работает в пределах одного домена). Очень цените любой вход!

private Task InitializeComputers() 
{ 
    try 
    { 
     Computers.Clear(); 
     object cLock = new object(); 

     PrincipalContext context = new PrincipalContext(ContextType.Domain, CurrentConfiguration.LDAPAddress, 
      CurrentConfiguration.DirectoryRoot, ContextOptions.Negotiate, 
      CurrentConfiguration.AdminUser, CurrentConfiguration.AdminPassword); 

     ComputerPrincipal computer = new ComputerPrincipal(context); 

     computer.Name = "*"; 

     PrincipalSearcher searcher = new PrincipalSearcher(computer); 

     PrincipalSearchResult<Principal> result = searcher.FindAll(); 

     Parallel.ForEach(result, (r) => 
     { 
      ComputerPrincipal principal = r as ComputerPrincipal; 

      DirectoryObject cObject = new DirectoryObject(CurrentConfiguration) 
      { 
       Name = principal.Name 
      }; 

      lock (cLock) 
      { 
       Computers.Add(cObject); 
      } 
     }); 

    } 
    ... // Catch stuff here 
} 

private async Task InitializeConnections() 
{ 
    Task[] tasks = Computers.Select(x => x.CheckConnectionAsync()).ToArray(); 
    await Task.WhenAll(tasks); 
} 

// This is where I need to be able to get the IP Address. Thoughts??? 
public Task CheckConnectionAsync() 
{ 
    return Task.Run(() => 
    { 
     try 
     { 
      Ping PingCheck = new Ping(); 
      PingReply Reply = PingCheck.Send(Name); // <--- need IP Address instead 

      if (Reply.Status == IPStatus.Success) 
      { 
       IsAvailable = true; 
       IPHostEntry host = Dns.GetHostEntry(Name); // Does not work for machines on different domain. 
       IPAddress = host.AddressList.FirstOrDefault().ToString(); 
      } 
      else 
      { 
       IsAvailable = false; 
       IsWMIActive = false; 
      } 
     } 
     ... // catch stuff here ... 
    }); 
} 
+1

просто добавить полный домен для тех удаленных компьютеров, например 'machine.domain.tld', dns автоматически отправит запрос на DNS-серверы' domain.tld'. если вы просто сделаете 'machine', тогда он будет запрашивать' machine.jamie_still_domain.tld' –

+0

Я уже дал этот снимок. Он по-прежнему возвращается с Host Not Found SocketExcpetions, когда я пытаюсь выполнить Dns.GetHostEntry (Name + "." + CurrentConfig.DomainName) перед пингом. Другая часть проблемы заключается в том, что она находится в закрытой корпоративной сети без возможности создавать зоны поиска для зоны DNS, на которой размещается моя машина, на которой установлено приложение (попытка тестирования с использованием лабораторных виртуальных машин в отдельном домене, доступ к которому IP, но не имя DNS). –

+0

Попробуйте: http://stackoverflow.com/questions/8227863/dns-lookup-from-custom-dns-server-in-c-sharp –

ответ

3

Для наблюдения решение, которое я нашел, получено из Heijden's DNS Resolver. Я написал простой класс DnsManager с одним статическим методом GetIPAddress для извлечения IP из A-записи.

public static string GetIPAddress(string name) 
{ 
    Resolver resolver = new Resolver(); 
    resolver.DnsServer = ((App)App.Current).CurrentConfiguration.DNSAddress; 
    resolver.Recursion = true; 
    resolver.Retries = 3; 
    resolver.TimeOut = 1; 
    resolver.TranportType = TransportType.Udp; 

    Response response = resolver.Query(name, QType.A); 

    if (response.header.ANCOUNT > 0) 
    { 
     return ((AnswerRR)response.Answer[0]).RECORD.ToString(); 
    } 

    return null; 
} 

Затем обновленный метод CheckConnectionAsync теперь написано так:

public Task CheckConnectionAsync() 
{ 
    return Task.Run(() => 
    { 
     try 
     { 
      IPAddress = DnsManager.GetIPAddress(Name + "." + CurrentConfig.DomainName); 
      ... // check availability by IP rather than name... 
     } 
     // catch stuff here... 
    }); 
} 
0

Как только вы планируете запрашивать выделенный сервер как источник DNS, вам необходимо отказаться от стандартных libs. Я попробовал это (если правильно помню) раз, когда расследовал выделенные DNS-запросы: http://www.codeproject.com/Articles/12072/C-NET-DNS-query-component

+0

Рассмотрите эту статью сейчас. Спасибо за ваш ответ! –

+0

Эта статья, кажется, немного устарела. Тем не менее, статья в [link] (http://www.codeproject.com/Articles/23673/DNS-NET-Resolver-C?fid=1024556&fr=1#xx0xx) из потока, на который ссылается @MarcB, имеет полный и современное решение. Я обновляю свой пост, когда интегрирую решение в свой проект. Спасибо всем! –