usuario - single sign on c# active directory
¿Cómo puedo obtener DOMAIN / USER desde AD DirectoryEntry? (8)
No encontrará lo que está buscando en DirectoryEntry, desafortunadamente.
Usted tiene sAMAccountName
que generalmente es algo así como myuser
(sin el dominio). Tiene el distinguishedName
que es algo así como LDAP://cn=joe myuser,cn=Users,dc=yourCompany,dc=com
. También tiene un userPrincipalName
pero generalmente es un nombre en el formato de [email protected]
.
Pero no encontrará ningún atributo que tenga el domain/MyUser
en ella, desafortunadamente. Tendrás que juntar eso con tu información sobre el nombre de dominio y el nombre de cuenta de sAMA de DirectoryEntry.
Para obtener más información y excelentes hojas de Excel sobre todas las propiedades de LDAP y WinNT en System.DirectoryServices, consulte el sitio web de Hilltop Lab de ADSI MVP Richard Mueller.
Bagazo
¿Cómo puedo obtener el usuario y el dominio de Windows de un objeto DirectoryEntry (SchemaClassName = "user") de Active Directory?
El nombre de usuario está en la propiedad sAMAccountName, pero ¿dónde puedo buscar el nombre de dominio?
(No puedo suponer un nombre de dominio fijo porque los usuarios son de varios subdominios).
Si está utilizando las bibliotecas System.DirectoryServices , debe tener una SearchResultsCollection de un DirectorySearcher.
Dentro de cada colección de propiedades de SearchResult, hay una propiedad de "nombre distinguido". Eso contendrá todas las partes de DC que componen el dominio al que pertenece su entrada de directorio.
Encontré un contenedor de particiones en CN = Particiones, CN = Configuración que contiene todos los dominios.
Cuando combina el usuario con la partición, puede leer el nombre de dominio real de la propiedad nETBIOSName + "/" + sAMAccountName.
Para obtener el nombre de dominio DirectoryEntry puede usar recursión en directoryEntry.Parent
. Y luego, si directoryEntry.SchemaClassName == "domainDNS"
puede obtener el nombre de dominio así:
directoryEntry.Properties["Name"].Value
1) Puede obtener userPrincipalName de DirectoryEntry.
2) Luego, divida el UPN entre el nombre de usuario y el nombre de dominio.
3) Luego llame a GetNetBIOSName () en él.
public static DirectoryEntry GetDirectoryObject(string strPath)
{
if (strPath == "")
{
strPath = ConfigurationManager.AppSettings["LDAPPath"]; //YOUR DEFAULT LDAP PATH ie. LDAP://YourDomainServer
}
string username = ConfigurationManager.AppSettings["LDAPAccount"];
string password = ConfigurationManager.AppSettings["LDAPPassword"];
//You can encrypt and decrypt your password settings in web.config, but for the sake of simplicity, I''ve excluded the encryption code from this listing.
}
catch (Exception ex)
{
HttpContext.Current.Response.Write("user: " + username + ", LDAPAccount: "+ ConfigurationManager.AppSettings["LDAPAccount"] + ".<br /> "+ ex.Message +"<br />");
if (HttpContext.Current.User.Identity != null)
{
HttpContext.Current.Response.Write("HttpContext.Current.User.Identity: " + HttpContext.Current.User.Identity.Name + ", " + HttpContext.Current.User.Identity.IsAuthenticated.ToString() + "<br />");
HttpContext.Current.Response.Write("Windows Identity: " + WindowsIdentity.GetCurrent().Name + ", " + HttpContext.Current.User.Identity.IsAuthenticated.ToString());
}
else
{
HttpContext.Current.Response.Write("User.Identity is null.");
}
HttpContext.Current.Response.End();
}
DirectoryEntry oDE = new DirectoryEntry(strPath, username, password, AuthenticationTypes.Secure);
return oDE;
}
public static string GetNetBIOSName(string DomainName)
{
string netBIOSName = "";
DirectoryEntry rootDSE =GetDirectoryObject(
"LDAP://"+DomainName+"/rootDSE");
string domain = (string)rootDSE.Properties[
"defaultNamingContext"][0];
// netBIOSName += "Naming Context: " + domain + "<br />";
if (!String.IsNullOrEmpty(domain))
{
//This code assumes you have a directory entry at the /CN=Partitions, CN=Configuration
//It will not work if you do not have this entry.
DirectoryEntry parts = GetDirectoryObject(
"LDAP://"+DomainName+"/CN=Partitions, CN=Configuration," + domain);
foreach (DirectoryEntry part in parts.Children)
{
if ((string)part.Properties[
"nCName"][0] == domain)
{
netBIOSName += (string)part.Properties[
"NetBIOSName"][0];
break;
}
}
}
return netBIOSName;
}
public static string GetDomainUsernameFromUPN(string strUPN)
{
string DomainName;
string UserName;
if (strUPN.Contains("@"))
{
string[] ud = strUPN.Split(''@'');
strUPN= ud[0];
DomainName = ud[1];
DomainName=LDAPToolKit.GetNetBIOSName(DomainName);
UserName= DomainName + "//" + strUPN;
}
else
{
UserName= strUPN;
}
return UserName;
}
public static string GetDomainNameUserNameFromUPN(string strUPN)
{
try
{
WindowsIdentity wi = new WindowsIdentity(strUPN);
WindowsPrincipal wp = new WindowsPrincipal(wi);
return wp.Identity.Name;
}
catch (Exception ex)
{
}
return "";
}
Extiendo una respuesta anterior por @laktak para proporcionar los detalles de lo que quiso decir.
Hay un contenedor de particiones en CN=Partitions,CN=Configuration
que contiene todos los dominios que le da el cn
que es el nombre de dominio Netbios y la propiedad nCName
que contiene el prefijo distinguishedName
que tendrá un usuario si se encuentran en este dominio.
Así que comience por buscar ldap para (objectClass=*)
en CN=Partitions,CN=Configuration
y almacene los pares ( cn
, nCName
) de cada resultado en un mapa.
Luego consulta ldap usando (sAMAccountName=USERIDHERE)
y obtiene el distinguishedName
del usuario. Ahora vaya a través de los pares ( cn
, nCName
) y encuentre el nCName
que prefija el distinguishedName
del usuario, y el cn
correspondiente es su nombre de dominio deseado.
Esto supone que los results
son una SearchResultCollection obtenida de un DirectorySearcher, pero usted debería poder obtener directamente el objectsid desde un DirectoryEntry.
SearchResult result = results[0];
var propertyValues = result.Properties["objectsid"];
var objectsid = (byte[])propertyValues[0];
var sid = new SecurityIdentifier(objectsid, 0)
var account = sid.Translate(typeof(NTAccount));
account.ToString(); // This give the DOMAIN/User format for the account