Dapatkah kueri LDAP pada AD memberikan nama domain netbios untuk satu akun saat menggunakan Katalog Global?

11

Saya menggunakan Edit ADSI untuk melihat properti LDAP dari satu akun pengguna dalam AD. Saya melihat properti seperti userPrincipalName, tetapi saya tidak melihat satu untuk nama domain yang sepenuhnya memenuhi syarat (FQDN) atau nama domain netbios.

Kami akan menyiapkan Katalog Global (GC) untuk memberi kami akses LDAP ke beberapa domain dan melalui konfigurasi dalam aplikasi kami memetakan properti LDAP ke properti profil pengguna dalam aplikasi. Dengan AD khas, FQDN dan nama domain netbios adalah sama untuk semua pengguna, tetapi dengan GC yang terlibat, kami memerlukan informasi tambahan ini. Kami benar-benar hanya perlu nama domain netbios (FQDN tidak cukup baik).

Mungkin ada permintaan LDAP yang dapat dilakukan untuk meminta informasi ini dari objek tingkat atas di AD?

Kirk Liemohn
sumber

Jawaban:

5

Saya pikir saya sudah menemukannya. Menggunakan ADSI Edit Anda dapat melihat properti pada objek (misalnya, pengguna), tetapi secara default itu memfilter atribut "dibangun". Menggunakan tombol Filter di kanan bawah layar properti saya bisa menunjukkan atribut tambahan ini.

"MsDS-PrincipalName" tampaknya memiliki "[nama domain netbios] \ [sAMAccountName]" sebagai nilainya.

Jika saya masuk ke Pengguna dan Komputer AD dan mengubah "Nama masuk pengguna" dari "[email protected]" menjadi "[email protected]" ini memengaruhi atribut "userPrincipalName", tetapi bukan "msDS- Atribut PrincipalName ". Ini bagus untuk kasus saya, karena sistem saya yang lain (SharePoint) juga tidak mengenali perubahan ini.

Jika saya masuk ke Pengguna AD dan Komputer dan mengubah "Nama masuk pengguna (pra-Windows 2000)" dari "KIRKDEV \ gwashington" menjadi "KIRKDEV \ g2washington" (perhatikan, bahwa saya tidak dapat mengubah bagian pertama) ini tidak mempengaruhi "userPrincipalName" atribut, tetapi tidak mempengaruhi "msDS-PrincipalName" atribut. Inilah yang saya inginkan karena sistem saya yang lain (SharePoint) mengenali perubahan ini.

Catatan Sisi: Saya mengatakan SharePoint mengenali perubahan, tetapi itu hanya jika pengguna belum pernah masuk ke kumpulan situs SharePoint sebelumnya. Setelah pengguna masuk ke kumpulan situs SharePoint, bidang tp_Login di tabel UserInfo diatur dengan nilai "msDS-PrincipalName" dan itu tampaknya tidak berubah. Jadi, saya mungkin harus menemukan cara untuk memaksa itu diubah atau hanya mengatakan bahwa skenario ini tidak didukung.

Kirk Liemohn
sumber
Saya belum memverifikasi bahwa kita sebenarnya dapat meminta "msDS-PrincipalName" dari Katalog Global. Itu akan menjadi langkah selanjutnya.
Kirk Liemohn
Yah, saya akan menandai jawaban saya sebagai jawaban yang benar, tetapi sekarang saya melihat bahwa Katalog Global tidak dapat meminta msDS-PrincipalName. Ugh, masih tidak yakin bagaimana kami akan mencari tahu nama domain netbios dari sana tanpa membuat beberapa asumsi (seperti itu adalah bagian pertama dari FQDN).
Kirk Liemohn
Mengenai catatan samping saya, lihat serverfault.com/questions/234526/… untuk membantu mendapatkan SharePoint untuk mengenali perubahan login.
Kirk Liemohn
Inilah yang disebut atribut yang dikonstruksi - yaitu dihitung berdasarkan permintaan saat permintaan dibuat untuk suatu objek. Anda tidak dapat memfilternya dalam kueri karena ini.
Brian Desmond
Terima kasih atas info ini - sangat berguna bagi saya ketika meminta melalui LDAP dari SQL Server.
Ian Yates
3

Untuk menjawab pertanyaan terakhir Anda, Anda harus dapat memverifikasi nama NetBios secara manual dengan memeriksa bagian Konfigurasi dan kemudian Partisi Direktori di ADSIEdit:

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

Ini memiliki keduanya namedan netBIOSNameproperti. Kalau tidak, saya pikir Anda harus mendapatkannya dari fqdn / DN seperti yang disarankan oleh squillman.

BoyMars
sumber
Terima kasih @BoyMars. Saya mengalami masalah menemukan "CN = Konfigurasi" di tingkat atas di domain saya. Saya mencari sedikit dan tidak dapat menemukan "Konfigurasi" atau "Direktori Partisi". Namun, saya pikir saya mungkin sudah memikirkan hal ini (akan mengirim jawaban).
Kirk Liemohn
OK, saya baru tahu cara menuju ke CN = Konfigurasi (maaf, sudah sekitar 6 tahun sejak saya bermain-main dengan LDAP dan ADSI Edit). @ BoyMars, saya mengerti apa yang Anda bicarakan. Sayangnya, untuk menanyakan nama domain netbios, tampaknya saya perlu mengulang semua objek di bawah CN = Partitions, CN = Configuration dan untuk masing-masing melihat apakah ia memiliki atribut "nETBIOSName". Mungkin kueri yang mengatakan beri saya semua objek crossRef di mana atribut netBIOSName tidak nol akan melakukan trik. Tampaknya ini relatif mudah dilakukan dalam kode, tetapi saya harus melakukan ini melalui konfigurasi. :-(
Kirk Liemohn
Ini adalah halaman yang membahas bagaimana cara menanyakan netbiosname. Mereka menggunakan kode. Saya menduga ini tidak akan berhasil untuk saya. geekswithblogs.net/Tariq/archive/2009/07/30/133813.aspx
Kirk Liemohn
tetapi itu menjelaskan lokasi "AD menyimpan nama netbios dalam wadah penamaan partisi yang disimpan di dalam wadah penamaan konfigurasi."
BoyMars
Ini adalah satu-satunya sumber informasi otoritatif. Secara khusus, objek crossRef disebutkan.
Brian Desmond
3

Untuk aplikasi? Microsoft membuat ini cukup mudah di .NET. Ini akan memberi Anda daftar nama Netbios domain yang dapat Anda gunakan untuk membuat daftar objek kustom dengan domain DN / DNS / Netbios nama, atau kamus referensi silang.

Juga, apa yang menentukan apakah suatu atribut tersedia di Katalog Global adalah (yang lain) atribut yang disebut isMemberOfPartialAttributeSet. Menggunakan Microsoft SysInternals AD Explorer, Anda dapat mencari wadah Schema di domain, dan mencari objek apa pun yang memiliki isMemberOfPartialAttributeSet = true untuk melihat semua atribut yang tersedia untuk permintaan 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;
}
Greg Askew
sumber
Terima kasih atas jawabannya, tetapi saya perlu menjalankan ini dari mesin non-Windows. Namun, jika diperlukan saya kira saya bisa membuat layanan web saya sendiri di .NET dan memberikan mesin ini dengan informasi ini. Itu bisa menjadi pendekatan mundur.
Kirk Liemohn
2
Itu juga harus langsung. Setel DN dasar Anda menjadi "CN = Partisi, CN = Konfigurasi" + DN dasar dari atribut domain differentiifiedName, dan filter pencarian menjadi (& (nETBIOSName = *) (dnsRoot = <dns nama domain AD>>)). Anda juga dapat mencari atribut ncName alih-alih dnsRoot, jika Anda ingin mencocokkan dengan akhiran dn dari domain alih-alih nama dns.
Greg Askew
1

Anda harus menguraikannya baik dari dn(dibedakan Nama) atau AdsDSPathatribut. Entitas nama domain diawali dengan "DC="atribut ini. Paling kiri DC=akan berisi nama domain netbios Anda.

Sebagai contoh: cn=myuser,ou=users,dc=mydomain,dc=mycompany,dc=com

mydomain adalah nama domain netbios.

EDIT:
Seperti yang ditunjukkan Brian Desmond, ini belum tentu cara otoritatif untuk menemukan nama netbios yang sebenarnya, itu hanya kebetulan bahwa mereka biasanya berkorelasi. Lihat jawaban BoyMars untuk cara otoritatif.

squillman
sumber
perhatikan batas netbios 15 karakter saat menggunakan nilai-nilai dari string fqdn atau DN, saya belum melihat banyak domain yang menggunakan string yang sangat lama :)
BoyMars
Terima kasih @squillman, tetapi ketika saya membuat domain ini saya sengaja membuat nama domain netbios bukan menjadi bagian pertama dari FQDN hanya karena itu mungkin dan saya perlu memeriksa batas-batas karena kode saya harus bekerja di beberapa lingkungan. Jadi dalam kasus saya, FQDN adalah test.kirkdev.local (contoh pengguna dn adalah "CN = George Washington, CN = Pengguna, DC = tes, DC = kirkdev, DC = lokal") tetapi nama domain netbios adalah kirkdev.
Kirk Liemohn
Jika Anda menggunakan Windows, dsquery computer OU=OU,OU=You,OU=Need,DC=local.domain -o rdnberikan apa yang Anda inginkan, dengan nama NetBIOS dalam tanda kutip. Karena itu relatif, Anda tidak perlu mendapatkan path lengkap. Tidak yakin apakah ini akan membantu OP; dia bertanya tentang LDAP, jadi ini bukan jawaban LDAP murni.
songei2f
@alharaka terima kasih atas komentarnya, tetapi kami meminta AD dari komputer non-MS. Kami berpotensi menanganinya, tetapi kami benar-benar ingin ini menjadi bagian dari kueri LDAP. Tampaknya dsquery adalah alat baris perintah Windows Server.
Kirk Liemohn
1
Maaf tapi ini tidak benar. Sama sekali TIDAK ada hubungan antara komponen domain atas (mis. Dc = mydomain) dan nama NetBIOS dari domain tersebut. Itu hanya kebetulan umum bahwa mereka setuju.
Brian Desmond
0

Jika Anda memiliki Nama Pokok Pengguna atau DN, Anda dapat menggunakan pustaka ActiveDS COM untuk menerjemahkan nilai-nilai. Di bawah ini adalah contoh untuk menerjemahkan nama UserPrincipalName ke 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);
        }
    }
}
Jeff
sumber
Terima kasih atas jawabannya, tetapi saya perlu melakukan ini dari mesin non-Windows dan idealnya melalui kueri LDAP.
Kirk Liemohn