2012-04-12 3 views
11

Ich möchte überprüfen, ob ein Benutzer in einer bestimmten übergeordneten Organisationseinheit ist.Abrufen der übergeordneten OU des Benutzers in Active Directory mit C#

Wie kann ich das tun?

Überprüfen Sie unten Code für eine klare Beschreibung dessen, was ich suche.

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

Die Domain:

  • Nationale OU
    • Ehrfürchtig OU
      • Joe
    • Was OU
      • Mike

Lösung 1 nach Antwort der empi

Mit den Informationen von empi gegeben, schrieb ich die folgende Methode, um die erste OU in der DistinguishedName zu extrahieren. Danach ist der Rest ein Kinderspiel.

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

Lösung 2 nach Antwort des 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

Funktioniert nicht, wenn Objekte Kommas in ihrem definierten Namen haben. Sie müssen mit der Art umgehen, wie diese maskiert sind, oder verwenden Sie JPBlanc Solution 2. – Chalky

Antwort

12

Ok @Empi Lösung funktioniert, aber UserPrincipal auf DirectoryEntry Objekte gebaut, die eine parent oder container Eigenschaften bereitstellt, die Ihnen nur das Objekt, das Sie suchen, ohne Schnur Art und Weise verwendet wird.

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

Großartig! Es schien unwahrscheinlich, dass es keinen eleganteren Weg gab. :) – Kjensen

+1

Wusste das nicht :) – empi

2

Diese Informationen sind in UserPrincipal.DistinguishedName. Sie sollten überprüfen, ob DistinguishedName mit "," + Ihrem eindeutigen Namen endet (Groß-/Kleinschreibung wird nicht beachtet). Sie müssen jedoch den distinguierten Namen von Ihnen wissen, den Sie überprüfen.

Zum Beispiel, wenn dn ist: CN=Jeff Smith,OU=Sales,DC=Fabrikam,DC=COM, dann heißt es, dass Benutzer in OU=Sales,DC=Fabrikam,DC=COM ou ist.

+1

Das ist ein Schritt weiter, danke! Ich kann jetzt meinen Weg zu einer Lösung verfolgen, aber es scheint, dass es einen schöneren Weg geben sollte. – Kjensen

+3

Soweit ich weiß, ist es kein Hack. So funktionieren Verzeichnisdienste. Wenn Sie einen Dateipfad erhalten und Sie überprüfen sollten, ob sich die Datei in einem Verzeichnis befindet, würden Sie das Gleiche tun. – empi

+0

Ich denke, du hast Recht. Vielen Dank. :) – Kjensen

Verwandte Themen