C# で Active Directory からユーザー情報を照会する

Syed Hassan Sabeeh Kazmi 2023年10月12日
  1. C# で System.DirectoryServices 名前空間を使用して、Active Directory からユーザー情報を照会する
  2. C# で System.DirectoryServices.AccountManagement 名前空間を使用して、Active Directory からユーザー情報を照会する
  3. System.DirectoryServicesSystem.DirectoryServices.AccountManagement を組み合わせて、AccountManagement ライブラリによって公開されていないプロパティにアクセスする
C# で Active Directory からユーザー情報を照会する

一部のコマンド ラインおよび MSAD ツールは非常に制限的で使いにくいため、Active Directory からユーザー情報を取得するのは困難な場合があります。 一方、C# コードを作成することは、やりがいがあり、カスタマイズ可能です。

C# で情報をクエリするための AD 操作には、2 セットのクラスがあります。 最初のものは System.DirectoryServices 名前空間を使用し、より使いやすくなっています。

ただし、System.DirectoryServices.AccountManagement 名前空間を備えた 2 番目のものほど用途が広くありません。

C# で System.DirectoryServices 名前空間を使用して、Active Directory からユーザー情報を照会する

System.DirectoryServicesは、Active Directory から任意のユーザー情報にアクセスできるようにするための技術的な方法です。 AD オブジェクトのプロパティ (それらはすべて汎用オブジェクトであるため) は、すべてのユーザー情報を含む配列に保持されます。

この方法は、はるかに難解で詳細志向です。 多くの場合、開発者が Active Directory からユーザー情報を照会するには、UAC コードを手動で設定する必要があります。

次の実行可能コードは、Active Directory を使用して C# でユーザー情報を照会する方法を示しています。

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 を使用すると、マネージ コードから Active Directory に簡単にアクセスできます。 DirectorySearchersearchオブジェクトは、共通のユーザー名を持つ 1 人のユーザーのみに検索を絞り込むのに役立ちます。

dSearcher.Filter メソッドを導入することで、LDAP クエリをさらに絞り込むことができます。このメソッドは、特定のユーザーから興味深い情報を検索できます。 さらに、DirectoryEntry および DirectorySearcher オブジェクトは System.DirectoryServices 名前空間に属しているため、それらを破棄することを忘れないでください。

C# で System.DirectoryServices.AccountManagement 名前空間を使用して、Active Directory からユーザー情報を照会する

その主な目的は、.NET を介して Active Directory をより簡単に管理することです。 これは、Active Directory からユーザー情報を取得するための新しいアプローチであり、ほぼすべての AD 操作を実行できます。

このメソッドにより、開発者は user.DisplayNameuser.VoiceTelephoneNumber などのコマンドを使用して、Active Directory からカスタマイズされた一連のユーザー情報を照会できます。

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

UserPrincipal.FindByIdentitySystem.DirectoryServices.AccountManagement 名前空間のクラスとして使用できます。これは、ユーザー情報をクエリする最も簡単な方法ですが、最も遅い方法でもあります。

SamAccountName メソッドとユーザー名の手動入力を削除することで、Active Directory 内のすべてのユーザーの情報を照会できます。

System.DirectoryServicesSystem.DirectoryServices.AccountManagement を組み合わせて、AccountManagement ライブラリによって公開されていないプロパティにアクセスする

AccountManagement ライブラリが公開していないプロパティは、UserPrincipal をより一般的なオブジェクトに変換することでアクセスできます。

基になるオブジェクトを Active Directory の UserPrincipal から取得する場合、両方の DirectoryServices 名前空間が重要な役割を果たします。

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

このチュートリアルでは、C# で Active Directory からユーザー情報を照会する 3つの方法を学習しました。 3 番目のハイブリッド メソッドを使用すると、あいまいなユーザー プロパティを取得することもできます。

これらの方法には、読みやすさや簡潔さなどのいくつかの利点があり、Active Directory からユーザー情報のすべてまたは一部をより迅速かつ簡単に取得するのに非常に役立ちます。

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