UserPrincipal
ma metodę GetUnderlyingObject()
, która zwróci wartość DirectoryEntry
.
Get DirectoryEntry z Zleceniodawca:
private DirectoryEntry GetDirectoryEntryFromUserPrincipal(Principal user)
{
return (DirectoryEntry)user.GetUnderlyingObject();
}
Get DirectoryEntry z domeny oraz numer konta:
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();
}
Gdy masz DirectoryEntry
użyć właściwości Guid
aby uzyskać wpis na Object-Guid
private Guid GetObjectGuidFromDirectoryEntry(DirectoryEntry entry)
{
// return the Guid this is the Object-Guid (ignore NativeGuid)
return entry.Guid;
}
Aby śledzić konto użytkownika w aplikacji na koncie katalogowym: zawsze używaj Object-Guid jako "Ta wartość jest ustawiana, gdy obiekt jest tworzony i nie można go zmienić."
Nazwy kont NT i SAM mogą ulec zmianie, jeśli użytkownik zmieni domeny lub, częściej, zmieni swoją nazwę (małżeństwo, zmiana nazwy prawnej itp.) I nie powinien być używany do śledzenia użytkownika.
Aby uzyskać nazwę konta NT (domena \ nazwa_użytkownika):
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();
}
Aby uzyskać SAM-Account-Name (nazwa użytkownika @ domena):
private string GetSAMAccountFromDirectoryEntry(DirectoryEntry entry)
{
return entry.Properties["Name"].Value;
}
i oto exhaustive list wszystkich atrybutów Active Directory. Użyj "Ldap-Display-Name", aby uzyskać wartość od Properties
np. Properties["Ldap-Display-Name"]
Display-Name (FirstName MI LastName) może się przydać.
Nie zweryfikowałem tego, więc nie jestem w 100% pewny, ale myślę, że chcesz mieć właściwość "SamAccountName". – CodingGorilla
Czy myślisz, że to jest możliwe? Wątpię, aby wyświetlane nazwy użytkowników były unikalne. Prawdopodobnie doprowadziłoby to do wyników wielorzędowych. –
Prawda. Teraz rozważam użycie GUID zamiast używając poniższej odpowiedzi. –