2013-03-25 18 views
6

Rozpoczęto korzystanie z przestrzeni nazw System.DirectoryServices.AccountManagement, aby wykonać wyszukiwanie użytkownika w aktywnym katalogu (AD). Potrzebuję również menedżera użytkownika, ale wydaje mi się, że uderzyłem w nawierzchnię przy użyciu tej przestrzeni nazw. Aktualny kod, aby uzyskać osoby:C# - Wyszukaj menedżera użytkowników w aktywnym katalogu

class Person { 
    // Fields 
    public string GivenName = null; 
    public string Surname = null; 
    public string DistinguishedName = null; 
    public string Email = null; 
    public string MangerDistinguishedName = null; // Unable to set this 

    // Constructor 
    public Person(string userName) { 
     UserPrincipal user = null; 

     try { 
      user = GetUser(userName); 

      if (user != null) { 
       this.GivenName = user.GivenName; 
       this.Surname = user.Surname; 
       this.DistinguishedName = user.DistinguishedName; 
       this.Email = user.EmailAddress; 
       this.MangerDistinguishedName = user.<NO SUCH PROPERTY TO FIND A MANAGER'S DISTINGUISHED NAME> 
      } 
      else { 
       throw new MissingPersonException("Person not found"); 
      } 
     } 
     catch (MissingPersonException ex) { 
      MessageBox.Show(
       ex.Message 
       , ex.reason 
       , MessageBoxButtons.OK 
       , MessageBoxIcon.Error 
      ); 
     } 
     catch (Exception ex) { 
      MessageBox.Show(
       ex.Message 
       , "Error: Possible connection failure, or permissions failure to search for the username provided." 
       , MessageBoxButtons.OK 
       , MessageBoxIcon.Error 
      ); 
     } 
     finally { 
      user.Dispose(); 
     } 
    } 

Wykonaj wyszukiwanie dla osoby

private UserPrincipal GetUser(string userName) { 
     PrincipalContext ctx = new PrincipalContext(ContextType.Domain); 
     UserPrincipal user = UserPrincipal.FindByIdentity(ctx, userName); 

     return user; 
    } 

Jaki jest inny sposób na bezpośredni dostęp nazwę wyróżniającą kierownika danego użytkownika?

  • Prawdopodobna odpowiedź częściową here w VB, ale nie widzę nic na temat odwołując się do menedżerów.
  • Kolejny możliwy częściowy here, znowu nic o menedżerach.

Odpowiedz

7

Jeśli jesteś na .NET 3.5 i i korzystania z przestrzeni nazw (S.DS.AM) System.DirectoryServices.AccountManagement, można łatwo rozszerzyć istniejącą UserPrincipal klasę dostać w bardziej zaawansowanych właściwościach, jak Manager itp

Przeczytaj o tym tutaj:

Zasadniczo wystarczy zdefiniować klasy pochodnej na podstawie UserPrincipal, a następnie zdefiniować dodatkowe właściwości chcesz:

[DirectoryRdnPrefix("CN")] 
[DirectoryObjectClass("Person")] 
public class UserPrincipalEx : UserPrincipal 
{ 
    // Inplement the constructor using the base class constructor. 
    public UserPrincipalEx(PrincipalContext context) : base(context) 
    { } 

    // Implement the constructor with initialization parameters.  
    public UserPrincipalEx(PrincipalContext context, 
         string samAccountName, 
         string password, 
         bool enabled) : base(context, samAccountName, password, enabled) 
    {} 

    // Create the "Department" property.  
    [DirectoryProperty("department")] 
    public string Department 
    { 
     get 
     { 
      if (ExtensionGet("department").Length != 1) 
       return string.Empty; 

      return (string)ExtensionGet("department")[0]; 
     } 
     set { ExtensionSet("department", value); } 
    } 

    // Create the "Manager" property.  
    [DirectoryProperty("manager")] 
    public string Manager 
    { 
     get 
     { 
      if (ExtensionGet("manager").Length != 1) 
       return string.Empty; 

      return (string)ExtensionGet("manager")[0]; 
     } 
     set { ExtensionSet("manager", value); } 
    } 

    // Implement the overloaded search method FindByIdentity. 
    public static new UserPrincipalEx FindByIdentity(PrincipalContext context, string identityValue) 
    { 
     return (UserPrincipalEx)FindByIdentityWithType(context, typeof(UserPrincipalEx), identityValue); 
    } 

    // Implement the overloaded search method FindByIdentity. 
    public static new UserPrincipalEx FindByIdentity(PrincipalContext context, IdentityType identityType, string identityValue) 
    { 
     return (UserPrincipalEx)FindByIdentityWithType(context, typeof(UserPrincipalEx), identityType, identityValue); 
    } 
} 

Teraz można użyć „Extended” wersję UserPrincipalEx w kodzie:

using (PrincipalContext ctx = new PrincipalContext(ContextType.Domain)) 
{ 
    // Search the directory for the new object. 
    UserPrincipalEx inetPerson = UserPrincipalEx.FindByIdentity(ctx, IdentityType.SamAccountName, "someuser"); 

    // you can easily access the Manager or Department now 
    string department = inetPerson.Department; 
    string manager = inetPerson.Manager; 
}   
+0

Czy próbowałeś tego? To nie działa, dla mnie. UserPrincipalEx.FindByIdentity nie zwraca obiektu UserPrincipalEx, a rzutowanie na UserPrincipalEx powoduje wyjątek InvalidCastException. – Naikrovek

+1

@Naikrovek: przepraszam - mój błąd - wyciąłem trochę za dużo kodu z mojej (o wiele dłuższej) próbki. Brakowało mi dwóch przeciążonych metod 'FindByIdentity' i' FindByIdentityWithType' - dodałem je do mojego fragmentu kodu - i tak, z tym kodem, po prostu sprawdziłem to w stosunku do Active Directory Win Server 2008 R2 i to działa dobrze dla mnie. –

+0

Działa świetnie, dziękuję. – Naikrovek

Powiązane problemy