2012-04-12 27 views
11

Voglio verificare se un utente è in una specifica unità organizzativa principale.Ottenere l'unità organizzativa dell'utente dell'utente in Active Directory utilizzando C#

Come posso farlo?

Controllare il codice di seguito per una chiara descrizione di ciò che sto cercando.

using System.DirectoryServices.AccountManagement; 

public bool IsUserInOU(string samAccountName, string OUName){ 

    using (var context = new PrincipalContext(ContextType.Domain)) 
     { 
      using (var user = UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, samAccountName)) 
      {      
       //Check if the user is in the OU specified in OUName 
       //Something like: 
       //return user.IsInOU(OUName); 
      } 
     } 
} 

public void TestIt_1(){ 
    //The parent OU of this user is "AwesomeOU" 
    string samAccountName = "Joe"; 
    string OUName = "AwesomeOU"; 
    bool expected = true; 
    bool actual = IsUserInOU(samAccountName, OUName); 
    Assert.AreEqual(expected, actual); 
} 

public void TestIt_2(){ 
    //The parent OU of this user is "WhateverOU" 
    string samAccountName = "Mike"; 
    string OUName = "AwesomeOU"; 
    bool expected = false; 
    bool actual = IsUserInOU(samAccountName, OUName); 
    Assert.AreEqual(expected, actual); 
} 

Il Domain:

  • Nazionale OU
    • Impressionante OU
      • Joe
    • Qualunque sia OU
      • Mike

Soluzione 1 dopo la risposta di empi

Con le informazioni fornite dal Empi, ho scritto il seguente metodo per estrarre il primo UO nel DistinguishedName. Fatto ciò, il resto è un gioco da ragazzi.

public static string GetOUForUser(string samAccountName) 
    { 
     using (var context = new PrincipalContext(ContextType.Domain)) 
     { 
      using (var user = UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, samAccountName)) 
      { 
       //System.Console.WriteLine(user.DistinguishedName); 
       int startIndex = user.DistinguishedName.IndexOf("OU=", 1) + 3; //+3 for length of "OU=" 
       int endIndex = user.DistinguishedName.IndexOf(",", startIndex); 
       var group = user.DistinguishedName.Substring((startIndex), (endIndex - startIndex)); 
       return group; 
      } 
     } 
    } 

Soluzione 2 dopo la risposta di JPBlanc

public static string GetOUForUser(string samAccountName) 
    { 
     using (var context = new PrincipalContext(ContextType.Domain)) 
     { 
      using (var user = UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, samAccountName)) 
      { 
       using (DirectoryEntry deUser = user.GetUnderlyingObject() as DirectoryEntry) 
       { 
        using (DirectoryEntry deUserContainer = deUser.Parent) 
        { 
         return deUserContainer.Properties["Name"].Value.ToString(); 
        } 
       } 
      } 
     } 
    } 
+1

Non funziona se gli oggetti contengono virgole nel nome distinto. Devi gestire il modo in cui sono fuggiti, o utilizzare la Soluzione 2 di JPBlanc. – Chalky

risposta

12

soluzione Ok @Empi sta lavorando, ma UserPrincipal è costruito su DirectoryEntry oggetti che fornisce un parent o container proprietà che appena ti danno l'oggetto che si sta cercando, senza l'utilizzo di modo stringa.

/* Retreiving a principal context 
*/ 
PrincipalContext domainContext = new PrincipalContext(ContextType.Domain, "WM2008R2ENT:389", "dc=dom,dc=fr", "dom\\jpb", "MyPwd"); 

/* Retreive a user 
*/ 
UserPrincipal user = UserPrincipal.FindByIdentity(domainContext, "user1"); 

/* Retreive the container 
*/ 
DirectoryEntry deUser = user.GetUnderlyingObject() as DirectoryEntry; 
DirectoryEntry deUserContainer = deUser.Parent; 
Console.WriteLine (deUserContainer.Properties["distinguishedName"].Value); 
+1

Grande! Sembrava improbabile che non ci fosse un modo più elegante. :) – Kjensen

+1

Non lo sapevo :) – empi

2

Questa informazione è in UserPrincipal.DistinguishedName. Dovresti controllare se DistinguishedName termina con "," + ou nome distinto (maiuscole/minuscole). Tuttavia, devi conoscere il nome dettagliato di cui stai controllando.

Ad esempio, se dn è: CN=Jeff Smith,OU=Sales,DC=Fabrikam,DC=COM, significa che l'utente è in OU=Sales,DC=Fabrikam,DC=COM ou.

+1

Questo è un passo avanti, grazie! Adesso posso infilare le corde in una soluzione, ma sembrerebbe che ci dovrebbe essere un modo migliore. – Kjensen

+3

Per quanto ne so non è un trucco. È proprio come funzionano i servizi di directory. Se ti è stato fornito un percorso di file e dovresti controllare se il file è in qualche directory, faresti la stessa cosa. – empi

+0

Immagino che tu abbia ragione. Grazie. :) – Kjensen

Problemi correlati