แบบสอบถาม LDAP บน AD สามารถให้ชื่อโดเมน netbios สำหรับบัญชีเดียวเมื่อใช้แคตตาล็อกส่วนกลางได้หรือไม่?


11

ฉันกำลังใช้ ADSI Edit เพื่อดูคุณสมบัติ LDAP ของบัญชีผู้ใช้เดียวในโฆษณา ฉันเห็นคุณสมบัติเช่น userPrincipalName แต่ฉันไม่เห็นชื่อโดเมนแบบเต็ม (FQDN) หรือชื่อโดเมน netbios

เราจะตั้งค่า Global Catalog (GC) เพื่อให้เราสามารถเข้าถึง LDAP สำหรับหลายโดเมนและผ่านการกำหนดค่าในแอปพลิเคชันที่เราจับคู่คุณสมบัติ LDAP กับคุณสมบัติโปรไฟล์ผู้ใช้ภายในแอปพลิเคชัน ด้วยโฆษณาทั่วไปชื่อโดเมน FQDN และ netbios จะเหมือนกันสำหรับผู้ใช้ทั้งหมด แต่ด้วย GC ที่เกี่ยวข้องเราต้องการข้อมูลเพิ่มเติมนี้ เราต้องการชื่อโดเมน netbios เท่านั้น (FQDN ไม่ดีพอ)

อาจมีแบบสอบถาม LDAP ที่สามารถทำได้เพื่อขอข้อมูลนี้จากวัตถุระดับบนสุดใน AD หรือไม่

คำตอบ:


5

ฉันคิดว่าฉันคิดออก การใช้การแก้ไข ADSI คุณสามารถดูคุณสมบัติบนวัตถุ (เช่นผู้ใช้) แต่โดยค่าเริ่มต้นจะเป็นการกรองแอตทริบิวต์ "ที่สร้างขึ้น" การใช้ปุ่มตัวกรองที่ด้านล่างขวาของหน้าจอคุณสมบัติฉันสามารถแสดงคุณลักษณะเพิ่มเติมเหล่านี้ได้

"msDS-PrincipalName" ดูเหมือนจะมี "[ชื่อโดเมน netbios] \ [sAMAccountName]" เป็นค่า

ถ้าฉันเข้าสู่ผู้ใช้ AD และคอมพิวเตอร์และเปลี่ยน "ชื่อเข้าสู่ระบบผู้ใช้" จาก "gwasington@test.kirkdev.local" เป็น "gwash2ington@test.kirk2dev.local" สิ่งนี้จะส่งผลต่อคุณลักษณะ "userPrincipalName" แต่ไม่ใช่ "msDS- แอ็ตทริบิวต์ PrincipalName " นี่เป็นสิ่งที่ดีในกรณีของฉันเพราะระบบอื่นของฉัน (SharePoint) ไม่รู้จักการเปลี่ยนแปลงนี้

ถ้าฉันเข้าสู่ผู้ใช้ AD และคอมพิวเตอร์และเปลี่ยน "ชื่อผู้ใช้เข้าสู่ระบบ (pre-Windows 2000)" จาก "KIRKDEV \ gwashington" เป็น "KIRKDEV \ g2washington" (หมายเหตุว่าฉันไม่สามารถเปลี่ยนส่วนแรก) สิ่งนี้ไม่ส่งผลกระทบต่อ "userPrincipalName แอตทริบิวต์" แต่ไม่ส่งผลกระทบต่อแอตทริบิวต์ "msDS-PrincipalName" ตรงนี้เป็นสิ่งที่ฉันต้องการเพราะระบบอื่นของฉัน (SharePoint) รับรู้การเปลี่ยนแปลงนี้

หมายเหตุด้านข้าง: ฉันบอกว่า SharePoint รับรู้การเปลี่ยนแปลง แต่นั่นก็ต่อเมื่อผู้ใช้ไม่เคยลงชื่อเข้าใช้ไซต์คอลเลกชัน SharePoint มาก่อน เมื่อผู้ใช้เข้าสู่คอลเลกชันไซต์ SharePoint แล้วฟิลด์ tp_Login ในตาราง UserInfo จะถูกตั้งค่าด้วยค่า "msDS-PrincipalName" และดูเหมือนจะไม่เปลี่ยนแปลง ดังนั้นฉันอาจต้องหาวิธีที่จะบังคับให้เปลี่ยนหรือเพียงแค่บอกว่าสถานการณ์นี้ไม่ได้รับการสนับสนุน


ฉันไม่ได้ตรวจสอบว่าเราสามารถค้นหา "msDS-PrincipalName" จากแคตตาล็อกทั่วโลกได้ นั่นจะเป็นขั้นตอนต่อไป
Kirk Liemohn

ฉันกำลังจะทำเครื่องหมายคำตอบของฉันว่าถูกต้อง แต่ตอนนี้ฉันเห็นว่าแคตตาล็อกทั่วโลกไม่สามารถสืบค้น msDS-PrincipalName อืมยังไม่แน่ใจว่าเราจะหาชื่อโดเมน netbios จากที่นั่นได้อย่างไรโดยไม่ต้องตั้งสมมติฐาน (เช่นเป็นส่วนแรกของ FQDN)
Kirk Liemohn

เกี่ยวกับบันทึกด้านข้างของฉันโปรดดูserverfault.com/questions/234526/…เพื่อช่วยให้ SharePoint รับรู้การเปลี่ยนแปลงการเข้าสู่ระบบ
Kirk Liemohn

นี่คือสิ่งที่เรียกว่าแอ็ตทริบิวต์ที่สร้างขึ้น - นั่นคือมันคำนวณตามความต้องการเมื่อมีการร้องขอสำหรับวัตถุ คุณไม่สามารถกรองในแบบสอบถามเนื่องจากสิ่งนี้
Brian Desmond

ขอบคุณสำหรับข้อมูลนี้ - มีประโยชน์มากสำหรับฉันเมื่อทำการค้นหาผ่าน LDAP จาก SQL Server
Ian Yates

3

เพื่อตอบคำถามสุดท้ายของคุณคุณควรจะสามารถตรวจสอบชื่อ NetBios ด้วยตนเองได้โดยการตรวจสอบในส่วนของการกำหนดค่าแล้วเลือกพาร์ติชันไดเรกทอรีใน ADSIEdit:

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

นี้มีทั้งคุณสมบัติnameและ netBIOSNameมิฉะนั้นฉันคิดว่าคุณจะต้องได้รับจาก fqdn / DN ตามที่ squillman แนะนำ


ขอบคุณ @BoyMars ฉันมีปัญหาในการค้นหา "CN = การกำหนดค่า" ที่ระดับบนสุดในโดเมนของฉัน ฉันแหย่ไปเล็กน้อยและไม่พบ "การกำหนดค่า" หรือ "ไดเรกทอรีพาร์ติชัน" อย่างไรก็ตามฉันคิดว่าฉันน่าจะเข้าใจแล้ว (กำลังจะโพสต์คำตอบ)
Kirk Liemohn

ตกลงฉันเพิ่งรู้วิธีไปที่ CN = การกำหนดค่า (ขออภัยมันเป็นเวลาประมาณ 6 ปีแล้วที่ฉันเล่นกับการแก้ไข LDAP และ ADSI) @BoyMars ฉันเห็นสิ่งที่คุณกำลังพูดถึง น่าเสียดายที่การสืบค้นชื่อโดเมน netbios นั้นปรากฏว่าฉันต้องวนลูปวัตถุทั้งหมดภายใต้ CN = พาร์ติชัน CN = การกำหนดค่าและสำหรับแต่ละคนดูว่ามีแอตทริบิวต์ "nETBIOSName" บางทีเคียวรีที่บอกว่าให้วัตถุ crossRef ทั้งหมดซึ่งแอตทริบิวต์ netBIOSName ไม่ใช่ค่า Null จะทำการหลอกลวง ดูเหมือนว่าจะทำในรหัสค่อนข้างง่าย แต่ฉันต้องทำผ่านการกำหนดค่า :-(
Kirk Liemohn

นี่คือหน้าเว็บที่กล่าวถึงวิธีการสอบถาม netbiosname พวกเขากำลังใช้รหัสแม้ว่า ฉันสงสัยว่าสิ่งนี้จะไม่ได้ผลสำหรับฉัน geekswithblogs.net/Tariq/archive/2009/07/30/133813.aspx
Kirk Liemohn

แต่มันจะอธิบายตำแหน่ง "AD เก็บชื่อ netbios ในคอนเทนเนอร์การตั้งชื่อพาร์ติชันซึ่งถูกเก็บไว้ภายในคอนเทนเนอร์การตั้งชื่อการกำหนดค่า"
BoyMars

นี่เป็นแหล่งข้อมูลที่เชื่อถือได้เท่านั้น โดยเฉพาะวัตถุ crossRef ที่กล่าวถึง
Brian Desmond

3

สำหรับแอปพลิเคชัน Microsoft ทำให้สิ่งนี้ตรงไปตรงมาใน. NET สิ่งนี้ควรให้รายชื่อโดเมน Netbios ชื่อที่คุณสามารถใช้เพื่อสร้างรายการของวัตถุที่กำหนดเองด้วยชื่อโดเมน DN / DNS / Netbios หรือพจนานุกรมอ้างอิงข้าม

นอกจากนี้สิ่งที่กำหนดว่าแอตทริบิวต์ที่มีอยู่ในแคตตาล็อกทั่วโลกเป็น (ยังอีก) คุณลักษณะที่เรียกว่า isMemberOfPartialAttributeSet ใช้ Microsoft SysInternals AD Explorer คุณสามารถค้นหาคอนเทนเนอร์ Schema ในโดเมนและค้นหาวัตถุใด ๆ ที่มี 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

2
นั่นควรตรงไปตรงมา ตั้งค่า DN พื้นฐานของคุณเป็น "CN = พาร์ติชัน CN = การกำหนดค่า" + DN ฐานของแอตทริบิวต์โดเมน distinguishedName และตัวกรองการค้นหาเป็น (& (nETBIOSName = *) (dnsRoot = <dns ชื่อของโดเมนโฆษณา>) คุณยังสามารถค้นหาแอ็ตทริบิวต์ ncName แทน dnsRoot หากคุณต้องการจับคู่ส่วนต่อท้าย dn ของโดเมนแทนชื่อ dns
Greg Askew

1

คุณจะต้องแยกมันออกจากdn(ชื่อจำเพาะ) หรือAdsDSPathแอตทริบิวต์ เอนทิตีชื่อโดเมนจะนำหน้าด้วย"DC="ในแอตทริบิวต์เหล่านี้ ด้านซ้ายสุดDC=จะมีชื่อโดเมน netbios ของคุณ

ตัวอย่างเช่น: cn=myuser,ou=users,dc=mydomain,dc=mycompany,dc=com

mydomain คือชื่อโดเมน netbios

แก้ไข:
ตามที่ไบรอันเดสมอนด์ชี้ให้เห็นนี่ไม่จำเป็นต้องเป็นวิธีที่เชื่อถือได้ในการค้นหาชื่อเน็ตเบียสที่แท้จริงมันเป็นเรื่องบังเอิญที่พวกเขามักจะมีความสัมพันธ์ ดูคำตอบ BoyMars สำหรับวิธีการที่เชื่อถือได้


เฝ้าดูขีด จำกัด netbios 15 ตัวอักษรเมื่อใช้ค่าจากสตริง fqdn หรือ DN ฉันไม่ได้เห็นโดเมนจำนวนมากที่ใช้สตริงที่ยาวแม้ว่า :)
BoyMars

ขอบคุณ @squillman แต่เมื่อฉันสร้างโดเมนนี้ฉันได้สร้างชื่อโดเมน netbios ไม่ใช่ส่วนแรกของ FQDN เพียงเพราะมันเป็นไปได้และฉันต้องตรวจสอบขอบเขตเนื่องจากรหัสของฉันต้องทำงานในหลาย ๆ สภาพแวดล้อม ดังนั้นในกรณีของฉัน FQDN คือ test.kirkdev.local (ตัวอย่างผู้ใช้ dn คือ "CN = จอร์จวอชิงตัน, CN = ผู้ใช้, DC = ทดสอบ, 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 เราอาจจัดการกับมันได้ แต่เราต้องการให้มันเป็นส่วนหนึ่งของแบบสอบถาม LDAP ปรากฏว่า dsquery เป็นเครื่องมือบรรทัดคำสั่งของ Windows Server
Kirk Liemohn

1
ขออภัย แต่นี่ไม่ถูกต้อง ไม่มีความสัมพันธ์ใด ๆ ระหว่างส่วนประกอบโดเมนบนสุด (เช่น dc = mydomain) และชื่อ NetBIOS ของโดเมน เป็นเรื่องบังเอิญที่พวกเขาต้องเผชิญ
Brian Desmond

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.