programing

Active Directory에서 사용자 목록을 가져오려면 어떻게 해야 합니까?

skycolor 2023. 4. 22. 09:11
반응형

Active Directory에서 사용자 목록을 가져오려면 어떻게 해야 합니까?

Active Directory에서 사용자 목록을 가져오려면 어떻게 해야 합니까?사용자 이름, 이름, 성을 불러올 수 있는 방법이 있나요?유사한 게시물이 사용된 것을 보았습니다.

 PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "YOURDOMAIN");

Active Directory를 사용해 본 적이 없기 때문에, 전혀 알 수 없습니다.어떤 도움이라도 주시면 감사하겠습니다!

Active Directory를 처음 사용하는 경우 Active Directory가 데이터를 저장하는 방법을 먼저 이해하는 것이 좋습니다.

Active Directory는 실제로는 LDAP 서버입니다.LDAP 서버에 저장되어 있는 오브젝트는 계층적으로 저장됩니다.파일 시스템에 파일을 저장하는 것과 매우 유사합니다.그 때문에, 디렉토리 서버 및 Active Directory 라고 하는 이름이 붙었습니다.

Active Directory의 컨테이너 및 개체는distinguished name인정자 이름은 다음과 같습니다.CN=SomeName,CN=SomeDirectory,DC=yourdomain,DC=com. 기존의 관계형 데이터베이스와 마찬가지로 LDAP 서버에 대해 쿼리를 실행할 수 있습니다.LDAP 쿼리라고 합니다.

그럼 LDAP 쿼리를 실행하는 방법은 여러 가지가 있습니다.NET. DirectorySearcher를 사용할 수 있습니다.System.DirectoryServices또는 SearchRequest에서System.DirectoryServices.Protocol.

질문입니다만, 특별히 사용자 주요 오브젝트를 찾도록 요청하고 있기 때문에, 가장 직관적인 방법은 Principal Searcher를 사용하는 것이라고 생각합니다.System.DirectoryServices.AccountManagement구글과는 다른 많은 예를 쉽게 찾을 수 있다.여기 당신이 요청한 대로 정확히 하고 있는 샘플이 있습니다.

using (var context = new PrincipalContext(ContextType.Domain, "yourdomain.com"))
{
    using (var searcher = new PrincipalSearcher(new UserPrincipal(context)))
    {
        foreach (var result in searcher.FindAll())
        {
            DirectoryEntry de = result.GetUnderlyingObject() as DirectoryEntry;
            Console.WriteLine("First Name: " + de.Properties["givenName"].Value);
            Console.WriteLine("Last Name : " + de.Properties["sn"].Value);
            Console.WriteLine("SAM account name   : " + de.Properties["samAccountName"].Value);
            Console.WriteLine("User principal name: " + de.Properties["userPrincipalName"].Value);
            Console.WriteLine();
        }
    }
}
Console.ReadLine();

AD 사용자 개체에는 여러 속성이 있습니다.특히,givenName를 제공하다First Name그리고.sn를 제공하다Last Name. 사용자 이름에 대해서.사용자 로그온 이름을 의미한 것 같습니다.AD 사용자 개체에는 두 개의 로그온 이름이 있습니다.하나는samAccountNameWindows 2000 이전 사용자 로그온 이름이라고도 합니다. userPrincipalName는 일반적으로 Windows 2000 이후에 사용됩니다.

활성 계정을 필터링하려면 Harvey 코드에 다음을 추가합니다.

 UserPrincipal userPrin = new UserPrincipal(context);
 userPrin.Enabled = true;

처음 사용한 후에.그 후 추가

  searcher.QueryFilter = userPrin;

발견하기 전에 말이야그러면 활동적인 사람들이 나올 거예요

AD를 참조하기 위한 Principle Context가 터무니없이 느립니다(.Validate Credentials에만 사용, 아래 참조).대신 Directory Entry 를 사용합니다.특성.ToLoad()는 필요한 것만 지불합니다.

필터 및 구문은 https://social.technet.microsoft.com/wiki/contents/articles/5392.active-directory-ldap-syntax-filters.aspx에서 확인할 수 있습니다.

속성 : https://learn.microsoft.com/en-us/windows/win32/adschema/attributes-all

using (var root = new DirectoryEntry($"LDAP://{Domain}"))
{
    using (var searcher = new DirectorySearcher(root))
    {
        // looking for a specific user
        searcher.Filter = $"(&(objectCategory=person)(objectClass=user)(sAMAccountName={username}))";
        // I only care about what groups the user is a memberOf
        searcher.PropertiesToLoad.Add("memberOf");

        // FYI, non-null results means the user was found
        var results = searcher.FindOne();

        var properties = results?.Properties;
        if (properties?.Contains("memberOf") == true)
        {
            // ... iterate over all the groups the user is a member of
        }
    }
}

깔끔하고 심플하고 빠릅니다.마법도 없고, 에 대한 반 문서화된 콜도 없습니다.RefreshCache를 사용하여 tokenGroups 또는 to를 가져옵니다.바인드 또는.자격 증명을 검증하기 위한 시도/캐치 중인 Native Object.

사용자 인증:

using (var context = new PrincipalContext(ContextType.Domain))
{
    return context.ValidateCredentials(username, password);
}

물론 여기에서는 @Harvey Kwok의 공로를 인정합니다만, 제 경우는 실제의 유저 프린서펄 리스트를 입수하고 싶었기 때문에, 이 예를 추가하고 싶었습니다.이 쿼리를 미리 필터링하는 것이 더 효율적일 수 있지만, 소규모 환경에서는 모든 항목을 가져오고 나중에 목록에서 필요에 따라 필터링하는 것이 더 쉽습니다.

필요한 내용에 따라 DirectoryEntry에 캐스트할 필요가 없을 수도 있지만 UserPrincipal에서 사용할 수 없는 속성도 있습니다.

using (var searcher = new PrincipalSearcher(new UserPrincipal(new PrincipalContext(ContextType.Domain, Environment.UserDomainName))))
{
    List<UserPrincipal> users = searcher.FindAll().Select(u => (UserPrincipal)u).ToList();
    foreach(var u in users)
        {
            DirectoryEntry d = (DirectoryEntry)u.GetUnderlyingObject();
            Console.WriteLine(d.Properties["GivenName"]?.Value?.ToString() + d.Properties["sn"]?.Value?.ToString());
        }
}

시스템을 포함합니다.Directory Services.dll 다음 코드를 사용합니다.

DirectoryEntry directoryEntry = new DirectoryEntry("WinNT://" + Environment.MachineName);
string userNames="Users: ";

foreach (DirectoryEntry child in directoryEntry.Children)
{
    if (child.SchemaClassName == "User")
    {
        userNames += child.Name + Environment.NewLine   ;         
    }

}
MessageBox.Show(userNames);

언급URL : https://stackoverflow.com/questions/5162897/how-can-i-get-a-list-of-users-from-active-directory

반응형