UserPrincipal
tiene un método GetUnderlyingObject()
que devolverá el DirectoryEntry
.
Get DirectoryEntry del Director:
private DirectoryEntry GetDirectoryEntryFromUserPrincipal(Principal user)
{
return (DirectoryEntry)user.GetUnderlyingObject();
}
Get DirectoryEntry de dominio y el nombre de la cuenta:
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();
}
vez que tenga el DirectoryEntry
utilizar la propiedad Guid
para obtener de Object-Guid
la entrada
private Guid GetObjectGuidFromDirectoryEntry(DirectoryEntry entry)
{
// return the Guid this is the Object-Guid (ignore NativeGuid)
return entry.Guid;
}
Para rastrear una cuenta de usuario en la aplicación en una cuenta de directorio: utilice siempre el Object-Guid como "Este valor se establece cuando el objeto se crea y no se puede cambiar".
Los nombres de las cuentas NT y SAM pueden cambiar si el usuario cambia de dominio o, más comúnmente, cambia su nombre (matrimonio, cambio de nombre legal, etc.) y no debe utilizarse para rastrear a un usuario.
Para obtener el nombre de la cuenta NT (dominio \ nombre de usuario):
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();
}
Para obtener el nombre de la cuenta SAM (nombre de usuario @ dominio):
private string GetSAMAccountFromDirectoryEntry(DirectoryEntry entry)
{
return entry.Properties["Name"].Value;
}
Y aquí está el exhaustive list de todos los atributos de Active Directory. Use el "Ldap-Display-Name" cuando obtenga el valor de Properties
, p. Properties["Ldap-Display-Name"]
Display-Name (FirstName MI LastName) pueden ser útiles.
No lo he verificado, así que no estoy 100% seguro, pero creo que quieres la propiedad 'SamAccountName'. – CodingGorilla
¿Crees que esto es posible? Dudo que los nombres para mostrar de los usuarios sean únicos. Posiblemente daría lugar a resultados de múltiples líneas. –
Es cierto. Ahora considero usar GUIDs usando la respuesta a continuación. –