Все остальные ответы предлагают использовать пространство имен System.DirectoryServices.AccountManagement
. Хотя это и сработает, на самом деле это просто оболочка пространства имен System.DirectoryServices
, чтобы упростить использование. Это делает вещи проще (иногда), но делает это за счет производительности.
Например, во всех приведенных вами примерах ваш код будет извлекать каждый атрибут со значением из объекта компьютера в AD, даже если вам нужен только один атрибут.
Если вы используете DirectorySearcher
, вы можете выполнить поиск и получить только тот атрибут, который вам нужен:
public string GetComputerDn(string computerName) {
var searcher = new DirectorySearcher {
Filter = $"(&(objectClass=computer)(sAMAccountName={computerName}$))",
PropertiesToLoad = { "distinguishedName" } //return only the distinguishedName attribute
};
var result = searcher.FindOne();
if (result == null) return null;
return (string) result.Properties["distinguishedName"][0];
}
Обратите внимание, что в AD sAMAccountName
компьютерных объектов - это то, что вы обычно называете «именем компьютера», за которым следует $
, поэтому фильтр - это то, что онесть.