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 작업에는 두 가지 클래스 집합이 있습니다. 첫 번째는 System.DirectoryServices 네임스페이스를 사용하며 사용하기 더 쉽습니다.

그러나 System.DirectoryServices.AccountManagement 네임스페이스를 특징으로 하는 두 번째 항목만큼 다재다능하지는 않습니다.

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는 관리 코드에서 활성 디렉터리에 쉽게 액세스할 수 있도록 합니다. DirectorySearchersearch 객체는 공통 사용자 이름을 가진 단 한 명의 사용자로 검색 범위를 좁히는 데 도움이 됩니다.

흥미로운 정보에 대해 특정 사용자를 검색할 수 있는 dSearcher.Filter 메서드를 도입하여 LDAP 쿼리를 더 좁힐 수 있습니다. 또한 DirectoryEntryDirectorySearcher 개체는 System.DirectoryServices 네임스페이스에 속하므로 폐기하는 것을 잊지 마십시오.

C#에서 System.DirectoryServices.AccountManagement 네임스페이스를 사용하여 Active Directory에서 사용자 정보 쿼리

주요 목적은 .NET을 통해 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);
      }
    }
  }
}

사용자 정보를 쿼리하는 가장 간단하지만 가장 느린 방법인 System.DirectoryServices.AccountManagement 네임스페이스의 클래스로 UserPrincipal.FindByIdentity를 사용할 수 있습니다.

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에서 사용자 정보를 쿼리하는 세 가지 방법을 배웠습니다. 세 번째 하이브리드 방법을 사용하면 모호한 사용자 속성을 얻을 수도 있습니다.

이러한 방법은 가독성 및 간결함과 같은 몇 가지 이점을 제공하며 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