Я ищу пользователей в Active Directory, используя System.DirectoryServices.AccountManagement
.
Вот простой пример
using System;
using System.DirectoryServices.AccountManagement;
public static class DomainHelpers
{
public string GetDistinguishedName(string domain, string guid)
{
var context = new PrincipalContext(ContextType.Domain, domain);
var userPrincipal = UserPrincipal.FindByIdentity(context, IdentityType.Guid, guid);
return userPrincipal.DistinguishedName;
}
}
UserPrincipal всегда нулевой. Если я изменяю IdentityType.Guid на IdentityType.SamAccountName и выполняю поиск по имени samaccountname, это работает просто отлично. Если я возьму свойство guid этого объекта userPrincipal, которое я получил при поиске samAccountName, я снова не получу ответ.
Есть идеи, что мне нужно сделать, чтобы получить результаты с помощью руководства? У меня сложилось четкое впечатление, что пару лет назад, когда я писал этот код, он работал нормально. Но тогда у меня была Windows 2008 R2 в качестве контроллеров домена, теперь у меня Windows 2016.
Если я получу доступ к DirectoryEntry
напрямую, то с помощью
using (DirectoryEntry entry = new DirectoryEntry($"LDAP://{DomainName}/<GUID={objectGuid}>"))
Вещи работают как положено. Так что это проблема, присущая UserPrincipal.FindIdentity. Я также попытался предоставить NativeGuid для FindByIdentity, но это немного не меняет ситуацию.