AD의 LDAP 쿼리가 글로벌 카탈로그를 사용할 때 단일 계정에 netbios 도메인 이름을 제공 할 수 있습니까?


11

ADSI 편집을 사용하여 AD에서 단일 사용자 계정의 LDAP 속성을 봅니다. userPrincipalName과 같은 속성이 표시되지만 FQDN (정규화 된 도메인 이름) 또는 netbios 도메인 이름에 대한 속성이 표시되지 않습니다.

여러 도메인에 대한 LDAP 액세스를 제공하기 위해 GC (Global Catalog)를 설정하고 응용 프로그램의 구성을 통해 LDAP 속성을 응용 프로그램 내의 사용자 프로필 속성에 매핑합니다. 일반적인 AD에서는 FQDN과 netbios 도메인 이름이 모든 사용자에게 동일하지만 GC와 관련하여이 추가 정보가 필요합니다. netbios 도메인 이름 만 있으면됩니다 (FQDN이 충분하지 않음).

AD의 최상위 개체에서이 정보를 요청하기 위해 수행 할 수있는 LDAP 쿼리가 있습니까?

답변:


5

내가 알아 낸 것 같아 ADSI 편집을 사용하면 개체 (예 : 사용자)의 속성을 볼 수 있지만 기본적으로 "구성된"속성을 필터링했습니다. 속성 화면의 오른쪽 하단에있는 필터 버튼을 사용하여 이러한 추가 속성을 표시 할 수있었습니다.

"msDS-PrincipalName"의 값은 "[netbios 도메인 이름] \ [sAMAccountName]"인 것으로 보입니다.

AD 사용자 및 컴퓨터로 이동하여 "사용자 로그온 이름"을 "gwasington@test.kirkdev.local"에서 "gwash2ington@test.kirk2dev.local"로 변경하면 "msDS-"가 아닌 "userPrincipalName"특성에 영향을줍니다. PrincipalName "속성입니다. 다른 시스템 (SharePoint)도이 변경 사항을 인식하지 못하기 때문에이 경우에 좋습니다.

AD 사용자 및 컴퓨터로 이동하여 "사용자 로그온 이름 (Windows 2000 이전)"을 "KIRKDEV \ gwashington"에서 "KIRKDEV \ g2washington"으로 변경하면 (첫 번째 부분은 변경할 수 없음) 이것은 영향을 미치지 않습니다. "userPrincipalName 사용"속성 있지만 않습니다 은 "MSDS-의 PrincipalName"속성에 영향을 미칩니다. 다른 시스템 (SharePoint)이이 변경 사항을 인식하기 때문에 이것이 내가 원하는 것입니다.

참고 : SharePoint에서는 변경 내용을 인식하지만 사용자가 이전에 해당 SharePoint 사이트 모음에 로그인 한 적이없는 경우에만 해당됩니다. 사용자가 SharePoint 사이트 모음에 로그인하면 UserInfo 테이블의 tp_Login 필드가 "msDS-PrincipalName"값으로 설정되며 변경되지 않는 것 같습니다. 따라서 강제로 변경 하거나이 시나리오가 지원되지 않는다고 말하는 방법을 찾아야 할 수도 있습니다.


글로벌 카탈로그에서 "msDS-PrincipalName"을 실제로 쿼리 할 수 ​​있는지 확인하지 못했습니다. 다음 단계가 될 것입니다.
Kirk Liemohn

글쎄, 내 대답을 올바른 것으로 표시하려고했지만 이제 글로벌 카탈로그가 msDS-PrincipalName을 쿼리 할 수 ​​없다는 것을 알았습니다. 어쨌든 FQDN의 첫 부분과 같이 몇 가지 가정없이 netbios 도메인 이름을 어떻게 알아낼 지 여전히 확실하지 않습니다.
Kirk Liemohn

참고 사항에 대해서는 SharePoint가 로그인 변경을 인식하도록하는 데 도움이되는 serverfault.com/questions/234526/… 을 참조하십시오 .
Kirk Liemohn

이를 생성 된 속성이라고합니다. 즉, 객체에 대한 요청이있을 때 요청시 계산됩니다. 이 때문에 쿼리에서 필터링 할 수 없습니다.
Brian Desmond 2012

이 정보에 감사드립니다-SQL Server에서 LDAP를 통해 쿼리 할 때 매우 유용했습니다.
Ian Yates

3

마지막 질문에 대답하려면 ADSIEdit의 구성 섹션과 디렉터리 파티션을 확인하여 NetBios 이름을 수동으로 확인할 수 있어야합니다.

CN=MYNETBIOSNAME,CN=Partitions,CN=Configuration,DC=mydomain,DC=internal

여기에는 속성 namenetBIOSName속성 이 모두 있습니다. 그렇지 않으면 squillman이 제안한대로 fqdn / DN에서 가져 와야한다고 생각합니다.


@BoyMars 감사합니다. 내 도메인의 최상위에서 "CN = Configuration"을 찾는 데 문제가있었습니다. 나는 조금 둘러보고 "구성"또는 "디렉토리 파티션"을 찾을 수 없었습니다. 그러나, 나는 이것을 알아낼 수 있다고 생각합니다 (답을 게시하려고합니다).
Kirk Liemohn

좋아, 방금 CN = Configuration에 도달하는 방법을 알아 냈습니다 (죄송합니다. LDAP 및 ADSI 편집을 수행한지 약 6 년이 지났습니다). @BoyMars, 당신이 무슨 말을하는지 봅니다. 불행히도, netbios 도메인 이름을 쿼리하는 것입니다. CN = Partitions, CN = Configuration 아래의 모든 개체를 반복해야하며 각 개체마다 "nETBIOSName"특성이 있는지 확인해야합니다. netBIOSName 속성이 null이 아닌 모든 crossRef 객체를 알려주는 쿼리가 트릭을 수행 할 수 있습니다. 이것은 코드에서 비교적 쉬운 것처럼 보이지만 구성을 통해이 작업을 수행해야합니다. :-(
Kirk Liemohn

다음은 netbiosname을 쿼리하는 방법을 설명하는 페이지입니다. 그러나 그들은 코드를 사용하고 있습니다. 나는 이것이 효과가 없을 것이라고 생각한다. geekswithblogs.net/Tariq/archive/2009/07/30/133813.aspx
Kirk Liemohn

그러나 "AD는 구성 이름 지정 컨테이너 안에 저장된 파티션 이름 지정 컨테이너에 netbios 이름을 저장합니다."라는 위치를 설명합니다.
BoyMars

이것은 유일한 권위있는 정보원입니다. 특히 crossRef 객체가 언급되었습니다.
브라이언 데스몬드

3

응용 프로그램의 경우? Microsoft는 이것을 .NET에서 매우 간단하게 만듭니다. 도메인 DN / DNS / Netbios 이름 또는 상호 참조 사전을 사용하여 사용자 지정 개체 목록을 만드는 데 사용할 수있는 도메인 Netbios 이름 목록을 제공해야합니다.

또한 글로벌 카탈로그에서 속성을 사용할 수 있는지 여부는 isMemberOfPartialAttributeSet이라는 속성입니다. Microsoft SysInternals AD 탐색기를 사용하면 도메인에서 스키마 컨테이너를 검색하고 isMemberOfPartialAttributeSet = true 인 개체를 검색하여 GC 쿼리에 사용할 수있는 모든 특성을 볼 수 있습니다.

using System.DirectoryServices;
using System.DirectoryServices.ActiveDirectory;

private void GetNetbiosNamesTest()
{
    DomainCollection domains = Forest.GetCurrentForest().Domains;
    foreach (Domain domain in domains)
    {
        Console.WriteLine("Domain Netbios name: {0}", this.GetDomainNetBiosName(domain));
    }
}

private string GetDomainNetBiosName(Domain domain)
{
    ForestRootDirectoryEntry = Forest.GetCurrentForest().RootDomain.GetDirectoryEntry();
    string forestConfigurationBindPath = String.Format("LDAP://CN=Partitions,CN=Configuration,{0}", ForestRootDirectoryEntry.Properties["distinguishedName"].Value);
    ForestRootConfigurationDirectoryEntry = new DirectoryEntry(forestConfigurationBindPath);

    string netBiosName = String.Empty;

    using (DirectorySearcher directorySearcher = new DirectorySearcher(ForestRootConfigurationDirectoryEntry))
    {
        directorySearcher.Filter = String.Format("(&(nETBIOSName=*)(dnsRoot={0}))", domain.Name);
        directorySearcher.PropertiesToLoad.AddRange(new String[] { "dnsRoot", "nETBIOSName" });
        var result = directorySearcher.FindOne();

        if ((result != null) && (result.Properties.Contains("nETBIOSName"))) netBiosName = result.Properties["nETBIOSName"][0].ToString();
    }
    return netBiosName;
}

답변 주셔서 감사하지만 Windows가 아닌 컴퓨터 에서이 작업을 실행해야합니다. 그러나 필요한 경우 .NET에서 자체 웹 서비스를 만들고 다른 컴퓨터 에이 정보를 제공 할 수 있다고 생각합니다. 대체 방법이 될 수 있습니다.
Kirk Liemohn 2016

2
또한 간단해야합니다. 기본 DN을 "CN = Partitions, CN = Configuration"+ 도메인 distinguishedName 특성의 기본 DN으로 설정하고 검색 필터를 (& (nETBIOSName = *) (dnsRoot = <dns AD 도메인 이름>))으로 설정하십시오. dns 이름 대신 도메인의 dn 접미사를 일치 시키려면 dnsRoot 대신 ncName 속성을 검색 할 수도 있습니다.
Greg Askew

1

dn(distinguishedName) 또는 AdsDSPath속성 에서 구문 분석해야 합니다. "DC="이러한 속성 에는 도메인 이름 엔터티가 접두사로 사용 됩니다. 가장 왼쪽 DC=에는 netbios 도메인 이름이 포함됩니다.

예를 들면 다음과 같습니다. cn=myuser,ou=users,dc=mydomain,dc=mycompany,dc=com

mydomain netbios 도메인 이름입니다.

편집 :
Brian Desmond가 지적했듯이 이것이 실제 netbios 이름을 찾는 권위있는 방법은 아니지만 일반적으로 상호 연관되는 것은 우연의 일치 일뿐입니다. 권위있는 방법은 BoyMars의 답변을 참조하십시오.


FQDN을 또는 DN 문자열의 값을 사용하는 경우, 내가 긴하지만 :) 캐릭터 라인을 사용하는 많은 도메인 보지 NetBIOS를 15 개 문자의 제한을 감시
BoyMars

@squillman에게 감사하지만이 도메인을 만들었을 때 의도적으로 netbios 도메인 이름 이 FQDN의 첫 번째 부분이 아니 도록 만들었습니다 . 여러 환경에서 코드가 작동해야하므로 경계를 확인해야합니다. 내 경우에는 FQDN은 test.kirkdev.local (예 : 사용자 dn은 "CN = George Washington, CN = Users, DC = test, DC = kirkdev, DC = local")이지만 netbios 도메인 이름은 kirkdev입니다.
Kirk Liemohn

Windows를 사용 dsquery computer OU=OU,OU=You,OU=Need,DC=local.domain -o rdn하는 경우 NetBIOS 이름을 따옴표로 묶어 원하는 것을 제공하십시오. 상대적이므로 전체 경로를 얻을 필요가 없습니다. 이것이 OP에 도움이 될지 확실하지 않습니다. 그는 LDAP에 대해 물었으므로 이것은 순수한 LDAP 답변이 아닙니다.
songei2f

@alharaka는 의견을 보내 주셔서 감사하지만 MS가 아닌 컴퓨터에서 AD를 쿼리하고 있습니다. 잠재적으로 처리 할 수 ​​있지만 실제로는 이것이 LDAP 쿼리의 일부가되기를 원합니다. dsquery는 Windows Server 명령 줄 도구 인 것으로 보입니다.
Kirk Liemohn

1
죄송하지만 이건 틀 렸습니다. 최상위 도메인 구성 요소 (예 : dc = mydomain)와 도메인의 NetBIOS 이름 사이에는 아무런 관계가 없습니다. 그들이 공통적으로 우연의 일치 일뿐입니다.
브라이언 데스몬드

0

사용자 프린시 펄 이름 또는 DN이있는 경우 ActiveDS COM 라이브러리를 사용하여 값을 변환 할 수 있습니다. 아래는 UserPrincipalName을 NT4 (NetBios) 이름으로 변환하는 예입니다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ActiveDs;

namespace Foo.Repository.AdUserProfile
{
    public class ADUserProfileValueTranslate
    {
        public static string ConvertUserPrincipalNameToNetBiosName(string userPrincipleName)
        {
            NameTranslate nameTranslate = new NameTranslate();
            nameTranslate.Set((int)ADS_NAME_TYPE_ENUM.ADS_NAME_TYPE_USER_PRINCIPAL_NAME, userPrincipleName);
            return nameTranslate.Get((int) ADS_NAME_TYPE_ENUM.ADS_NAME_TYPE_NT4);
        }
    }
}

답변 주셔서 감사하지만 Windows 이외의 컴퓨터에서 이상적으로 LDAP 쿼리를 통해이 작업을 수행해야합니다.
Kirk Liemohn 2016
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.