UserPrincipal
имеет метод GetUnderlyingObject()
, который возвращает DirectoryEntry
.
Получить DirectoryEntry от принципала:
private DirectoryEntry GetDirectoryEntryFromUserPrincipal(Principal user)
{
return (DirectoryEntry)user.GetUnderlyingObject();
}
Получить DirectoryEntry из домена и имени учетной записи:
private DirectoryEntry GetDirectoryEntryFromDomainAndUsername(string domainName, string userName)
{
// Get the sid from the NT account name
var sid = (SecurityIdentifier) new NTAccount(domainName, accountName)
.Translate(typeof(SecurityIdentifier));
// Get the directory entry for the LDAP service account
var serviceEntry = new DirectoryEntry("LDAP://{address}", "serviceUsername", "servicePassword");
var mySearcher = new DirectorySearcher(serviceEntry)
{
Filter = string.Format("(&(ObjectSid={0}))", sid.Value)
};
return mySearcher.FindOne().GetDirectoryEntry();
}
Когда у вас есть DirectoryEntry
, используйте свойство Guid
, чтобы получить Object-Guid записи
private Guid GetObjectGuidFromDirectoryEntry(DirectoryEntry entry)
{
// return the Guid this is the Object-Guid (ignore NativeGuid)
return entry.Guid;
}
Для отслеживания учетной записи пользователя в приложении по учетной записи каталога: всегда используйте Object-Guid как «Это значение устанавливается при создании объекта и не может быть изменено».
Имена учетных записей NT и SAM могут изменяться, если пользователь меняет домены или, чаще, их имя (брак, законное изменение имени и т. Д.) И не должны использоваться для отслеживания пользователя.
Чтобы получить имя учетной записи NT (домен \ имя пользователя):
private string GetNTAccountNameFromDirectoryEntry(DirectoryEntry entry)
{
PropertyValueCollection propertyValueCollection = entry.Properties["objectsid"];
SecurityIdentifier sid = new SecurityIdentifier((byte[]) propertyValueCollection[0], 0);
NTAccount ntAccount = (NTAccount)sid.Translate(typeof (NTAccount));
return account.ToString();
}
Чтобы получить SAM-Account-Name (имя пользователя @ домен):
private string GetSAMAccountFromDirectoryEntry(DirectoryEntry entry)
{
return entry.Properties["Name"].Value;
}
А вот полный список всех атрибутов Active Directory. Используйте "Ldap-Display-Name" при получении значения от Properties
например Properties["Ldap-Display-Name"]
Отображаемое имя (FirstName MI LastName) может пригодиться.