2009-06-02 14 views
13

Come posso ottenere l'utente Windows e il dominio da un oggetto Directory Directory Active Directory (SchemaClassName = "utente")?Come posso ottenere DOMAIN USER da una Directory DirectoryEntry?

Il nome utente è nella proprietà sAMAccountName ma dove posso cercare il nome di dominio?

(non posso assumere un nome di dominio fisso perché gli utenti sono da diversi sottodomini.)

+0

Correlati: http://stackoverflow.com/questions/4249139/c-sharp-active-directory-get-domain-name-of-user –

risposta

3

Ho trovato un contenitore delle partizioni in CN = le partizioni CN = Configuration che contiene tutti i domini.

Quando si abbina l'utente alla partion, è possibile leggere il nome di dominio reale dalla proprietà nETBIOSName + "\" + sAMAccountName.

+1

nETBIOSName è il nome del computer giusto? come questo darà il nome di dominio? – Shesha

2

Se si utilizzano i System.DirectoryServices librerie, si dovrebbe avere un SearchResultsCollection da un DirectorySearcher.

All'interno di ciascuna raccolta Proprietà di SearchResult, esiste una proprietà "distishedname". Ciò conterrà tutte le parti DC che costituiscono il dominio a cui appartiene la voce della directory.

+0

+1: ho fatto questo per ottenere tutti i tipi di informazioni come con chi sono impiegati e un elenco di tutti i gruppi di sicurezza. – RSolberg

+5

Sì, ma come mi aiuta? Come posso ottenere il nome di dominio "company-central" da DC = Company, DC = com? – laktak

+0

Questo è il modo giusto per andare ... ma ricorda che un dominio può spesso essere un alias per il percorso corretto in AD ... ad es. nella nostra organizzazione, il dominio SOUTH_AMERICA è in realtà soa.company.com, EUROPE è eur.company.com che è rappresentato da dc = eur, dc = company, dc = com ecc, quindi potresti aver bisogno di una tabella di ricerca e di una ricerca nella stringa distinguishedName – davidsleeps

7

Non troverai quello che stai cercando nella DirectoryEntry, sfortunatamente.

Hai il sAMAccountName che in genere è qualcosa come myuser (senza il dominio). Hai il distinguishedName che è qualcosa come LDAP://cn=joe myuser,cn=Users,dc=yourCompany,dc=com. Hai anche un userPrincipalName ma di solito è un nome nel formato di [email protected].

Ma sfortunatamente non troverete alcun attributo che contenga lo domain\MyUser. Dovrai metterlo insieme tra le tue informazioni sul nome del dominio e il sAMAccountName di DirectoryEntry.

Per ulteriori informazioni e alcuni eccellenti fogli di Excel su tutte le proprietà LDAP e WinNT in System.DirectoryServices, consultare il sito Web Hilltop Lab di ADSI MVP Richard Mueller.

Marc

21

Si presume che results sia una SearchResultCollection ottenuta da un DirectorySearcher, ma si dovrebbe essere in grado di ottenere direttamente objectid da 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 
+3

Sfortunatamente questo non funziona per me: ho l'objectid ma ottengo una IdentityNotMappedException sulla chiamata Translate(). Ciò potrebbe essere dovuto al fatto che la macchina che esegue il codice non fa parte del dominio, sto solo interrogando AD. – laktak

+0

C'è un modo per tradurre al contrario? Se ho una stringa nel formato DOMINIO \ utente, posso cercare l'oggetto della directory? Soprattutto considerando che potrei avere a che fare con domini multipli di cui ci si fida, è possibile? – Jeremy

+0

Grazie. Funziona ancora in .NET 4.5. – Steven

7

per ottenere il nome di dominio DirectoryEntry è possibile utilizzare la ricorsione sul directoryEntry.Parent. E poi se directoryEntry.SchemaClassName == "domainDNS" è possibile ottenere il nome di dominio in questo modo:

directoryEntry.Properties["Name"].Value 
-2

1) è possibile ottenere l'userPrincipalName dal DirectoryEntry.

2) Quindi, dividere UPN tra Nome utente e Nome dominio.

3) Quindi chiamare GetNetBIOSName() su di esso.

 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; 
} 
3
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 ""; 
} 
0

che sto estendendo una precedente risposta da @laktak di fornire i dettagli di quello che voleva dire.

C'è un contenitore delle partizioni in CN=Partitions,CN=Configuration che contiene tutti i domini che vi dà la cn che è il nome di dominio NetBIOS e la proprietà nCName che contiene il prefisso distinguishedName un utente avrà se si trovano in questo dominio.

Così inizia da LDAP alla ricerca di (objectClass=*) in CN=Partitions,CN=Configuration e memorizzare il (cn, nCName) coppie di ogni risultato di una mappa.

Successivamente si esegue la query ldap utilizzando (sAMAccountName=USERIDHERE) e si ottiene distinguishedName dall'utente. Ora passa attraverso le coppie (cn, nCName) e trova il nCName che prefigura il distinguishedName dall'utente e il corrispondente cn è il nome di dominio desiderato.

Problemi correlati