2012-04-12 11 views
11

Deseo verificar si un usuario está en una unidad organizativa primaria específica.Obtener la unidad organizativa principal del usuario en Active Directory utilizando C#

¿Cómo puedo hacer eso?

Compruebe el código a continuación para una descripción clara de lo que estoy buscando.

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); 
} 

El Dominio:

  • Nacional OU
    • impresionante OU
      • Joe
    • Cualquiera que sea OU
      • Mike

Solución 1 después de la respuesta de Empi

Con la información dada por Empi, escribí el método siguiente para extraer la primera unidad organizativa en el Distinguishedname. Habiendo hecho eso, el resto es pan comido.

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; 
      } 
     } 
    } 

Solución 2 después de la respuesta de 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

No funciona si los objetos tienen comas en su nombre completo. Debe manejar la forma en que se escaparon o utilizar la Solución 2 de JPBlanc. – Chalky

Respuesta

12

solución Ok @Empi está funcionando, pero UserPrincipal está construido sobre DirectoryEntry objetos que proporciona una parent o container propiedades que sólo le dará el objeto que busca, sin necesidad de utilizar forma de cadena.

/* 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

¡Genial! Parecía poco probable que no hubiera una manera más elegante. :) – Kjensen

+1

No sabía eso :) – empi

2

Esta información está en UserPrincipal.DistinguishedName. Debe verificar si DistinguishedName finaliza con "," + ou nombre distinguido (sin distinción entre mayúsculas y minúsculas). Sin embargo, debe saber el nombre diferenciado de su cuenta.

Por ejemplo, si dn es: CN=Jeff Smith,OU=Sales,DC=Fabrikam,DC=COM, entonces dice que el usuario está en OU=Sales,DC=Fabrikam,DC=COM ou.

+1

¡Eso es un paso más, gracias! Ahora puedo abrir una brecha en mi camino hacia una solución, pero parece que debería haber una manera más agradable. – Kjensen

+3

Por lo que sé, no es un truco. Es solo cómo funcionan los servicios de directorio. Si le dieron una ruta de archivo y debería verificar si el archivo está en algún directorio, haría lo mismo. – empi

+0

Supongo que tienes razón. Gracias. :) – Kjensen

Cuestiones relacionadas