2014-08-28 4 views
2

Используя C#, каков способ узнать, работает ли мой код на IS контроллером домена.Как определить, является ли машина, которую я использую, контроллером домена

Я не хочу «выходить» и собирать информацию о каких-либо других контроллерах домена в домене ... Я ТОЛЬКО интересуюсь, работает ли мой компьютер на IS контроллере домена или нет. Кроме того, мне не нужно знать, является ли его основным контроллером домена ... только если он является контроллером домена.

Вот что я пытался

TRIAL 1

private bool IsDomainController() 
    { 
     Domain domain = Domain.GetCurrentDomain(); 
     string domainName = domain.ToString(); 
     bool bIsDC = false; 
     DirectoryContext ctx = new DirectoryContext(DirectoryContextType.Domain, domainName); 

     try 
     { 
      using (DomainController dc = DomainController.FindOne(ctx, LocatorOptions.ForceRediscovery)) 
      { 
       bIsDC = true; 
      } 
     } 
     catch (Exception) 
     { 
      bIsDC = false;    
     } 

     return bIsDC; 
    } 

и

TRIAL 2

public bool IsThisMachineIsADomainController() 
    { 
     Domain domain = Domain.GetCurrentDomain(); 

     string thisMachine = String.Format("{0}.{1}", Environment.MachineName, domain.ToString()); 
     thisMachine = thisMachine.ToLower(); 

     //Enumerate Domain Controllers 
     List<string> allDcs = new List<string>(); 

     string name = ""; 
     foreach (DomainController dc in domain.DomainControllers) 
     { 
      name = dc.Name.ToLower(); 
      allDcs.Add(name); 
     } 
     return allDcs.Contains(thisMachine); 
    } 

ли любой из них подходит и почему или почему нет?

+2

Где код, который вы попробовали первый? –

+0

только что опубликовал код, который у меня есть – user3174075

+4

Успешно ли они работают? Если да, то вам лучше попробовать http://codereview.stackexchange.com/, потому что SO - не лучшее место для вопросов «что является лучшим». –

ответ

1

После долгих исследований ... Есть два способа:

Работает на Windows 2008 сервер:

public bool isActiveDirectoryDomainServicesInstalled() 
    { 
     bool bRetval = false; 
     try 
     { 
      uint uID = 110; 
      string search = string.Format("SELECT * FROM Win32_ServerFeature WHERE ID = {0}", uID); 
      ManagementObjectSearcher oSearcher = new ManagementObjectSearcher("root\\CIMV2", search); 

      foreach (var oReturn in oSearcher.Get()) 
      { 
       if ((uint)(oReturn["ID"]) == uID) 
       { 
        bRetval = true; 
        break; 
       } 
      } 
     } 
     catch (Exception) 
     { 
      bRetval = false; 
     } 

     return bRetval; 
    } 

. И .

Работает на Windows 2008 и Windows, 2012 серверов

public bool IsThisMachineIsADomainController() 
{ 
    Domain domain = Domain.GetCurrentDomain(); 

    string thisMachine = String.Format("{0}.{1}", Environment.MachineName, domain.ToString()); 
    thisMachine = thisMachine.ToLower(); 

    //Enumerate Domain Controllers 
    List<string> allDcs = new List<string>(); 

    string name = ""; 
    foreach (DomainController dc in domain.DomainControllers) 
    { 
     name = dc.Name.ToLower(); 
     allDcs.Add(name); 
    } 
    return allDcs.Contains(thisMachine); 
} 
0

Попробуйте Win32 API: NetServerEnum(), что «список всех серверов указанного типа, которые видны в области

Ваши другие варианты будут использовать LDAP/запросов Active Directory для перечисления домен контроллеры: я бы сказал, что вы можете найти P/Invoke проще и приятнее.

Если вы хотите попробовать маршрут LDAP, я бы предложил The .NET Developer's Guide to Directory Services Programming от Joe Kaplan и Ryand Dunn.

Cover: The .Net Developer's Guide to Directory Services Programming

+0

Я не хочу, чтобы пользователь взаимодействовал ... только C# – user3174075

+0

@ user3174075 interop не так уж сложно добавить http://www.pinvoke.net/search.aspx?search=NetServerEnum&namespace=[All] – kenny

+0

@ user3174075: см. мой исправленный ответ для другого предложения. –

0

Вы можете использовать http://msdn.microsoft.com/en-us/library/y9w58cz1(v=vs.110).aspx, чтобы получить DomainControllerCollection доступны для вашего сайта.

Это коллекция DomainController Объекты тогда.

И наконец compair их ips с вашим местный ip комплект.

Domain d = Domain.GetCurrentDomain(); 
DomainControllerCollection dcc = d.FindAllDiscoverableDomainControllers("domain.local"); 
IPAddress[] localIPs = Dns.GetHostAddresses(Dns.GetHostName()); 
Boolean scanDone = false; 
foreach (DomainController dc in dcc) 
{ 
    foreach (IPAddress localip in localIPs) 
    { 
     if (dc.IPAddress.ToString().Equals(localip.ToString())) 
     { 
      MessageBox.Show("Woop Woop! I'm a DC!"); 
      scanDone = true; 
      break; 
     } 
    } 

    if (scanDone) break; 
} 

Вы должны добавить ссылку на System.DirectoryServices к вашему проекту.

+0

Что является основным отличием между этим кодом и моим кодом «TRIAL 2»? Я думаю, что ваш код более «дорог», так как выполняется несколько IP-запросов, а в коде «TRIAL 2» сравнивается только квалифицированное имя контроллера домена - ваши мысли? – user3174075

 Смежные вопросы

  • Нет связанных вопросов^_^