Как определить, работает ли моя программа в среде Active Directory?
Я использую C# и .Net 2.0





Одним из способов может быть запрос переменной окружения LOGONSERVER. Это даст имя сервера вашего контроллера AD ... которое, насколько я знаю, будет пустым (или совпадать с текущей рабочей станцией? Не уверен), если он в настоящее время не вошел в домен.
Пример использования:
string ADServer = Environment.GetEnvironmentVariable("LOGONSERVER");
Попробуйте получить Environment.UserDomainName и сравнить его с Environment.MachineName. Если они совпадают, вероятно, у пользователя нет домена. Если они не совпадают, то пользователь входит в домен, который должен иметь сервер каталогов.
От http://msdn.microsoft.com/en-us/library/system.directoryservices.directoryentry.path.aspx
To bind to the current domain using LDAP, use the path "LDAP://RootDSE", then get the default naming context and rebind the entry.
Таким образом, без домена привязка к «LDAP: // RootDSE» должна либо завершиться ошибкой, либо ничего не вернуть. На себе не пробовал.
use System.DirectoryServices; // add reference to system.directoryservices.dll
...
DirectoryEntry ent = new DirectoryEntry("LDAP://RootDSE");
String str = ent.Properties["defaultNamingContext"][0];
DirectoryEntry domain = new DirectoryEntry("LDAP://" + str);
Это определенно более чистый способ проверки Active Directory, чем использование переменной среды (которую пользователь может удалить или добавить для подделки программы).
+1 Работает, спасибо. Единственное, когда машина не является членом домена, она ждет около 5 секунд, прежде чем выбросить COMException. Так что может быть лучше сначала вызвать Domain.GetComputerDomain() или IPGlobalProperties.GetIPGlobalProperties().DomainName, а затем, если это удастся, сделать это.
Этот код проверяет, является ли сам компьютер членом домена.
using System.DirectoryServices.ActiveDirectory;
bool isDomain = false;
try
{
Domain.GetComputerDomain();
isDomain = true;
}
catch (ActiveDirectoryObjectNotFoundException)
{
}
Однако компьютер может находиться в домене, но текущий пользователь, вошедший в систему, может быть локальной учетной записью. Если вы хотите проверить это, используйте функцию Domain.GetCurrentDomain().
Я получаю false, когда я вошел в систему с локальным пользователем, true, когда я вошел в систему с пользователем домена ...
А как насчет домена NT4 без активного каталога?
Это хорошо, но не надежно: ActiveDirectoryObjectNotFoundException также выдается, если по какой-либо причине невозможно связаться с контроллером домена, даже если машина является членом домена.
Я нашел кое-что, что работает:
using System.Net.NetworkInformation;
IPGlobalProperties.GetIPGlobalProperties (). DomainName;
Работает с локальным пользователем и пользователем домена.
Выглядит многообещающе, но замечание в документе немного касается: «Если локальный компьютер зарегистрирован в домене, а затем переходит в рабочую группу, свойство DomainName по-прежнему возвращает предыдущее доменное имя, а не пустое» [msdn.microsoft.com/en-us/library/…
это также будет имя машины, если компьютер не является частью какого-либо домена