Как определить, является ли используемая машина контроллером домена
Используя C#, как определить, является ли машина, на которой мой код запущен, контроллером домена?
Я не хочу "выходить" и собирать информацию о любых других контроллерах домена в домене... Меня интересует ТОЛЬКО машина, на которой мой код выполняется на контроллере домена IS, или нет. Кроме того, мне не нужно знать, является ли он основным контроллером домена... просто если он является контроллером домена.
Вот что я пробовал
Испытание 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;
}
а также
СУДЕБНАЯ 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);
}
Подходят ли они, и почему, или почему нет?
3 ответа
После долгих исследований... есть два пути:
Работает на сервере 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);
}
Вы можете использовать http://msdn.microsoft.com/en-us/library/y9w58cz1(v=vs.110).aspx чтобы получить DomainControllerCollection
доступно для вашего сайта.
Это коллекция DomainController
Объекты тогда.
Наконец, сравните их 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
к вашему проекту.
Попробуйте это Win32 API: NetServerEnum()
, который " перечисляет все серверы указанного типа, которые видны в домене. "
Другие варианты - использовать запросы LDAP/Active Directory для перечисления контроллеров домена: я бы сказал, что вы можете найти P / Invoke более простым и приемлемым.
Если вы хотите попробовать маршрут LDAP, я бы предложил Руководство разработчика по.NET по программированию служб каталогов от Джо Каплана и Райанда Данна.