Benutzerinformationen aus Active Directory in C# abfragen

Syed Hassan Sabeeh Kazmi 12 Oktober 2023
  1. Verwenden Sie den Namespace System.DirectoryServices in C#, um Benutzerinformationen aus Active Directory abzufragen
  2. Verwenden Sie den Namensraum System.DirectoryServices.AccountManagement in C#, um Benutzerinformationen aus Active Directory abzufragen
  3. Kombinieren Sie System.DirectoryServices und System.DirectoryServices.AccountManagement, um auf Eigenschaften zuzugreifen, die nicht von den AccountManagement-Bibliotheken bereitgestellt werden
Benutzerinformationen aus Active Directory in C# abfragen

Das Abrufen der Benutzerinformationen aus Active Directory kann schwierig sein, da einige der Befehlszeilen- und MSAD-Tools sehr einschränkend und schwierig zu verwenden sind. Andererseits ist das Schreiben Ihres C#-Codes lohnender und anpassbarer.

Es gibt zwei Sätze von Klassen für AD-Operationen zum Abfragen von Informationen in C#. Der erste verwendet den Namensraum System.DirectoryServices und ist einfacher zu verwenden.

Es ist jedoch nicht so vielseitig wie das zweite mit dem Namensraum System.DirectoryServices.AccountManagement.

Verwenden Sie den Namespace System.DirectoryServices in C#, um Benutzerinformationen aus Active Directory abzufragen

System.DirectoryServices ist eine technische Möglichkeit, Ihnen den Zugriff auf beliebige Benutzerinformationen aus Active Directory zu ermöglichen. Die Eigenschaften von AD-Objekten (da sie alle generische Objekte sind) werden in einem Array gehalten, das alle Benutzerinformationen enthält.

Diese Methode ist deutlich kryptischer und detailorientierter. Häufig müssen UAC-Codes von Entwicklern manuell festgelegt werden, um die Benutzerinformationen aus Active Directory abzufragen.

Der folgende ausführbare Code zeigt Ihnen, wie Sie Active Directory verwenden, um Benutzerinformationen in C# abzufragen.

using System;
using System.Text;
using System.DirectoryServices;

namespace queryInfoAD {

  class userActiveDirectory {
    static void Main(string[] args) {
      // Input the user name (password can also be required) to get a particular user info from
      // Active Directory

      Console.Write("User Name = ");
      String searchUsername = Console.ReadLine();

      try {
        // create an LDAP connection object that will help you fetch the Active Directory user

        DirectoryEntry userLdapConn = createDirectoryEntry();

        // create `ObjSearch` as a search object which operates on an LDAP connection object to only
        // find a single user's details

        DirectorySearcher ObjSearch = new DirectorySearcher(userLdapConn);
        ObjSearch.Filter = searchUsername;

        // create result objects from the search object

        SearchResult checkUser = ObjSearch.FindOne();

        if (checkUser != null) {
          ResultPropertyCollection fields = checkUser.Properties;

          foreach (String ldapUser in fields.PropertyNames) {
            foreach (Object InfoChart in fields[ldapUser])
              Console.WriteLine(String.Format("{0,-20} : {1}", ldapUser, InfoChart.ToString()));
          }
        }

        else {
          Console.WriteLine("User does not exist!");
        }
      }

      catch (Exception e) {
        Console.WriteLine("Error!\n\n" + e.ToString());
      }
    }

    static DirectoryEntry createDirectoryEntry() {
      // create an LDAP connection with custom settings and return it

      DirectoryEntry ldapConnection = new DirectoryEntry("Insert connection domain link...");
      ldapConnection.Path =
          "Insert the path to the Active Directory which contains user information";
      ldapConnection.AuthenticationType = AuthenticationTypes.Secure;

      return ldapConnection;
    }
  }
}

System.DirectoryServices bietet einfachen Zugriff auf das Active Directory aus verwaltetem Code. Das Objekt Suche von DirectorySearcher hilft, die Suche auf nur einen Benutzer mit einem gemeinsamen Benutzernamen einzugrenzen.

Sie können Ihre LDAP-Abfrage weiter eingrenzen, indem Sie eine dSearcher.Filter-Methode einführen, die einen bestimmten Benutzer nach interessanten Informationen durchsuchen kann. Vergessen Sie außerdem nicht, die Objekte DirectoryEntry und DirectorySearcher zu entsorgen, da sie zum Namensraum System.DirectoryServices gehören.

Verwenden Sie den Namensraum System.DirectoryServices.AccountManagement in C#, um Benutzerinformationen aus Active Directory abzufragen

Sein Hauptzweck besteht darin, das Active Directory über .NET viel einfacher zu verwalten. Es ist der neuere Ansatz zum Abrufen von Benutzerinformationen aus dem Active Directory und kann so ziemlich jeden AD-Vorgang ausführen.

Diese Methode ermöglicht es den Entwicklern, Befehle wie user.DisplayName und user.VoiceTelephoneNumber zu verwenden, die dabei helfen, einen benutzerdefinierten Satz von Benutzerinformationen aus Active Directory abzufragen.

using System;
using System.DirectoryServices;
using System.DirectoryServices.AccountManagement;

// add the reference in the `System.DirectoryServices.AccountManagement` library to your project
// before executing this code

namespace DSAM_examp {
  class AccManagement {
    static void Main(string[] args) {
      try {
        // enter Active Directory settings
        PrincipalContext ActiveDirectoryUser =
            new PrincipalContext(ContextType.Domain, "Insert the domain link here...");

        // create search user and add criteria

        Console.Write("Enter User Name: ");
        UserPrincipal userName = new UserPrincipal(ActiveDirectoryUser);
        userName.SamAccountName = Console.ReadLine();

        PrincipalSearcher search = new PrincipalSearcher(userName);

        foreach (UserPrincipal result in search.FindAll())

          // the user information in AD contains the VoiceTelephoneNumber that is unique and helps
          // find the target user

          // result.VoiceTelephoneNumber != null is also valid

          if (result.DisplayName != null) {
            // to display the user name and telephone number from Active Directory. You can also
            // retrieve more information using similar commands.

            Console.WriteLine(result.DisplayName, result.VoiceTelephoneNumber);
          }
        search.Dispose();
      }

      catch (Exception error) {
        Console.WriteLine("User not found! Error: " + error.Message);
      }
    }
  }
}

Sie können UserPrincipal.FindByIdentity als Klasse des Namensraums System.DirectoryServices.AccountManagement verwenden, was der einfachste Weg ist, Benutzerinformationen abzufragen, aber auch der langsamste.

Durch das Entfernen der Methode SamAccountName und der manuellen Eingabe des Benutzernamens können Sie die Informationen aller Benutzer im Active Directory abfragen.

Kombinieren Sie System.DirectoryServices und System.DirectoryServices.AccountManagement, um auf Eigenschaften zuzugreifen, die nicht von den AccountManagement-Bibliotheken bereitgestellt werden

Auf Eigenschaften, die die AccountManagement-Bibliotheken nicht verfügbar machen, kann zugegriffen werden, indem UserPrincipal in ein allgemeineres Objekt umgewandelt wird.

Beim Abrufen von zugrunde liegenden Objekten aus dem UserPrincipal im Active Directory spielen beide DirectoryServices-Namespaces eine wichtige Rolle.

using System;
using System.DirectoryServices;
using System.DirectoryServices.AccountManagement;

namespace HybridMethod {
  class getUserInfo {
    static void Main(string[] args) {
      try {
        PrincipalContext userActiveDirectory =
            new PrincipalContext(ContextType.Domain, "Insert your domain link here...");

        // `UserPrincipal` class encapsulates principals that contain user information

        UserPrincipal userName = new UserPrincipal(userActiveDirectory);

        // retrieves the principal context that is essential to perform the query. Its context
        // specifies the server/domain against which search operations are performed.

        PrincipalSearcher searchObj = new PrincipalSearcher(userName);

        foreach (UserPrincipal result in searchObj.FindAll()) {
          if (result.DisplayName != null) {
            // access the underlying object, e.g., user properties

            DirectoryEntry lowerLdap = (DirectoryEntry)result.GetUnderlyingObject();

            Console.WriteLine("{0,30} {1} {2}", result.DisplayName,
                              lowerLdap.Properties["postofficebox"][0].ToString());
          }
        }

        // disposing the `PrincipalSearcher` object

        searchObj.Dispose();
      }

      catch (Exception exp) {
        Console.WriteLine(exp.Message);
      }
    }
  }
}

In diesem Tutorial haben Sie drei Möglichkeiten kennengelernt, die Benutzerinformationen aus Active Directory in C# abzufragen. Mit der dritten Hybridmethode können Sie sogar undurchsichtige Benutzereigenschaften erhalten.

Diese Methoden bieten Ihnen mehrere Vorteile wie Lesbarkeit und Kürze und sind äußerst nützlich, um alle oder einen Teil der Benutzerinformationen schneller und einfacher aus Active Directory abzurufen.

Syed Hassan Sabeeh Kazmi avatar Syed Hassan Sabeeh Kazmi avatar

Hassan is a Software Engineer with a well-developed set of programming skills. He uses his knowledge and writing capabilities to produce interesting-to-read technical articles.

GitHub