C # - search for user manager in the active directory

The use of the System.DirectoryServices.AccountManagement namespace will begin to search for the user in the active directory (AD). I also need a user manager , but I seem to be caught in a vulnerability on the road using this namespace. Current code to get a person:

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

Run a person search

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

What is another way to directly access the distinguished name of the manager for a particular user?

  • A possible partial answer is here in VB, but I see nothing about links to managers.
  • Another possible partial here , again nothing about the managers.
+6
source share
1 answer

If you use .NET 3.5 and later and use the System.DirectoryServices.AccountManagement (S.DS.AM) namespace, you can easily extend the existing UserPrincipal class to get more advanced properties, such as Manager , etc.

Read more here:

Basically, you just define a derived class based on UserPrincipal , and then define your additional properties that you want:

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

Now you can use the "advanced" version of UserPrincipalEx in your code:

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

All Articles