AD'deki bir LDAP sorgusu, Genel Katalog kullanılırken tek bir hesap için netbios etki alanı adını sağlayabilir mi?


11

AD'deki tek bir kullanıcı hesabının LDAP özelliklerine bakmak için ADSI Düzenleyicisi'ni kullanıyorum. UserPrincipalName gibi özellikleri görüyorum, ancak tam etki alanı adı (FQDN) veya netbios etki alanı adı için bir tane görmüyorum.

Bize birden fazla etki alanına LDAP erişimi sağlamak için Genel Katalog (GC) oluşturacağız ve bir uygulamadaki yapılandırma yoluyla LDAP özelliklerini uygulama içindeki kullanıcı profili özelliklerine eşleştireceğiz. Tipik AD ile FQDN ve netbios alan adı tüm kullanıcılar için aynıdır, ancak ilgili GC ile bu ek bilgiye ihtiyacımız vardır. Gerçekten sadece netbios alan adına ihtiyacımız var (FQDN yeterince iyi değil).

Belki bu bilgiyi AD'deki daha üst düzey bir nesneden istemek için yapılabilecek bir LDAP sorgusu vardır?

Yanıtlar:


5

Bence anladım. ADSI Düzenleyicisi'ni kullanarak bir nesnenin (ör. Bir kullanıcı) özelliklerine bakabilirsiniz, ancak varsayılan olarak "yapılandırılmış" nitelikleri filtreliyordu. Özellikler ekranının sağ alt kısmındaki Filtre düğmesini kullanarak bu ek özellikleri gösterebildim.

"MsDS-PrincipalName" değeri "[netbios etki alanı adı] \ [sAMAccountName]" değerine sahip gibi görünüyor.

AD Kullanıcıları ve Bilgisayarları'na girip "Kullanıcı oturum açma adı" nı "gwasington@test.kirkdev.local" yerine "gwash2ington@test.kirk2dev.local" olarak değiştirirsem, bu "userPrincipalName" özniteliğini etkiler, ancak "msDS- PrincipalName "özniteliği. Benim durumumda bu iyi, çünkü diğer sistemim (SharePoint) de bu değişikliği tanımıyor.

AD Kullanıcıları ve Bilgisayarları'na girip "Kullanıcı oturum açma adı (Windows 2000 öncesi)" seçeneğini "KIRKDEV \ gwashington" yerine "KIRKDEV \ g2washington" olarak değiştirirsem (ilk bölümü değiştiremediğimi unutmayın) "userPrincipalName" özelliği, ama yok "msDS-PrincipalName" ayrıntısını etkiler. Diğer sistemim (SharePoint) bu değişikliği tanıdığı için bu tam olarak istediğim şey.

Yan Not: SharePoint'in değişikliği tanıdığını söyledim, ancak yalnızca kullanıcı daha önce bu SharePoint sitesi koleksiyonuna daha önce hiç giriş yapmamışsa. Kullanıcı SharePoint site koleksiyonuna giriş yaptıktan sonra, UserInfo tablosundaki tp_Login alanı "msDS-PrincipalName" değeriyle ayarlanır ve bu değişmez. Bu yüzden, değiştirilmeye zorlamak için bir yol bulmam veya sadece bu senaryonun desteklenmediğini söylemem gerekebilir.


Aslında Global Katalog "msDS-PrincipalName" sorgulamak doğrulanmadı. Bir sonraki adım bu olacak.
Kirk Liemohn

Cevabımı doğru olarak işaretlemek üzereydim, ama şimdi Global Kataloğun msDS-PrincipalName'i sorgulayamadığını görüyorum. Ugh, hala bazı varsayımlar yapmadan netbios alan adını nasıl bulacağımızdan emin değilim (FQDN'nin ilk kısmı gibi).
Kirk Liemohn

Yan notumla ilgili olarak, SharePoint'in oturum açma değişikliğini tanımasına yardımcı olmak için serverfault.com/questions/234526/… adresine bakın .
Kirk Liemohn

Bu, yapılandırılmış bir öznitelik olarak adlandırılır - bir nesne için istek yapıldığında istek üzerine hesaplanır. Bu nedenle bir sorguda filtre uygulayamazsınız.
Brian Desmond

Bu bilgi için teşekkürler - SQL Server LDAP üzerinden sorgulama yaparken benim için çok kullanışlı geldi.
Ian Yates

3

Son sorunuzu cevaplamak için, Yapılandırma bölümünü ve ardından ADSIEdit'te Dizin Bölümlerini kontrol ederek NetBios adını manuel olarak doğrulayabilmeniz gerekir:

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

Bu, hem sahiptir nameve netBIOSNameözelliklerini. Aksi takdirde squillman'ın önerdiği gibi bir fqdn / DN'den almanız gerektiğini düşünüyorum.


Teşekkürler @BoyMars. Etki alanımda en üst düzeyde "CN = Yapılandırma" bulmakta bazı sorunlar yaşadım. Biraz araştırdım ve "Yapılandırma" veya "Dizin Bölümleri" bulamadım. Ancak, ben bunu çözmek olabilir düşünüyorum (cevap göndermek üzere).
Kirk Liemohn

Tamam, sadece nasıl CN = Yapılandırma almak için anladım (üzgünüm, LDAP ve ADSI Edit ile oynadım yaklaşık 6 yıl oldu). @BoyMars, neden bahsettiğinizi anlıyorum. Ne yazık ki, netbios etki alanı adını sorgulamak için, CN = Partitions, CN = Configuration altında tüm nesneler arasında döngü gerekiyor gibi görünüyor ve her biri için bir "nETBIOSName" özniteliği olup olmadığını görmek. Belki netBIOSName özniteliğinin boş olmadığı tüm crossRef nesnelerini bana veren bir sorgu hile yapar. Bu kod yapmak nispeten kolay görünüyor, ama bunu yapılandırma yoluyla yapmak zorunda. :-(
Kirk Liemohn

Burada netbiosname sorgusunun nasıl sorgulanacağını açıklayan bir sayfa bulunmaktadır. Yine de kod kullanıyorlar. Bunun benim için işe yaramayacağından şüpheleniyorum. geekswithblogs.net/Tariq/archive/2009/07/30/133813.aspx
Kirk Liemohn

ancak "AD, netbios adını yapılandırma adlandırma kapsayıcısının içinde depolanan Bölümler adlandırma kapsayıcısında depolar."
BoyMars

Bu tek yetkili bilgi kaynağıdır. Özellikle, bahsedilen crossRef nesnesi.
Brian Desmond

3

Başvuru için mi? Microsoft, bunu .NET'te oldukça basit hale getirir. Bu, etki alanı DN / DNS / Netbios adlarına veya çapraz başvuru sözlüklerine sahip özel nesnelerin bir listesini oluşturmak için kullanabileceğiniz etki alanı Netbios adlarının bir listesini sağlamalıdır.

Ayrıca, bir özniteliğin Genel Katalog'ta kullanılabilir olup olmadığını belirleyen şey, isMemberOfPartialAttributeSet adı verilen (yine başka bir) özniteliktir. Microsoft SysInternals AD Gezgini'ni kullanarak bir etki alanındaki Şema kapsayıcısını arayabilir ve bir GC sorgusu için kullanılabilen tüm öznitelikleri görmek için isMemberOfPartialAttributeSet = true değerine sahip herhangi bir nesneyi arayabilirsiniz.

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;
}

Cevabınız için teşekkürler, ancak bunu Windows olmayan bir makineden çalıştırmam gerekiyor. Ancak, gerekirse, .NET'te kendi web hizmetimi oluşturabilir ve diğer makineye bu bilgileri sağlayabilirim. Bu bir geri dönüş yaklaşımı olabilir.
Kirk Liemohn

2
Bu da açık olmalı. Temel DN'nizi "CN = Bölümler, CN = Yapılandırma" + alan ayırt ediciAdı özniteliğinin temel DN'si olarak ayarlayın ve arama filtresini (& (nETBIOSName = *) (dnsRoot = <dns AD etki alanı adı>)) olarak ayarlayın. Dns adı yerine etki alanının dn sonekini eşleştirmek istiyorsanız, dnsRoot yerine ncName özniteliğini de arayabilirsiniz.
Greg Askew

1

Onu dn(ayırt ediciAd) veya AdsDSPathözniteliklerden ayrıştırmanız gerekir . Alan adı varlıklarına "DC="bu özelliklerde önek eklenir . En soldaki DC=netbios alan adınızı içerecektir.

Örneğin: cn=myuser,ou=users,dc=mydomain,dc=mycompany,dc=com

mydomain netbios alan adıdır.

DÜZENLEME:
Brian Desmond'un belirttiği gibi, bu gerçek netbios adını bulmanın mutlaka yetkili yolu değildir, genellikle birbirleriyle ilişkili olmaları tesadüfidir. Yetkili yol için BoyMars'ın cevabına bakınız.


Bir fqdn veya DN dizesinden değerleri kullanırken 15 karakter netbios sınırı için izlemek, ben olsa uzun bir dize kullanan birçok etki alanı görmedim :)
BoyMars

Teşekkürler @squillman, ancak bu etki alanını oluşturduğumda, netbios etki alanı adını FQDN'nin ilk kısmı değil , sadece mümkün olduğu ve kodumun birden fazla ortamda çalışması gerektiği için sınırları kontrol etmem gerektiği için yaptım. Yani benim durumumda FQDN test.kirkdev.local (örnek kullanıcı dn "CN = George Washington, CN = Kullanıcılar, DC = test, DC = kirkdev, DC = yerel"), ancak netbios etki alanı adı kirkdev.
Kirk Liemohn

Windows kullanıyorsanız, dsquery computer OU=OU,OU=You,OU=Need,DC=local.domain -o rdntırnak işaretleri arasında NetBIOS adı ile istediğinizi verir. Göreli olduğu için, tam yolu elde etmenize gerek yoktur. Bu OP rağmen yardımcı olur emin değilim; LDAP hakkında sordu, bu yüzden bu saf bir LDAP yanıtı değil.
songei2f

@alharaka yorum için teşekkürler, ancak MS olmayan bir bilgisayardan AD sorgusu yapıyoruz. Potansiyel olarak bununla başa çıkabiliriz, ancak bunun bir LDAP sorgusunun parçası olmasını gerçekten istiyoruz. Dsquery bir Windows Server komut satırı aracı gibi görünüyor.
Kirk Liemohn

1
Üzgünüm ama bu yanlış. Üst etki alanı bileşeni (örneğin, dc = etki alanım) ile etki alanının NetBIOS adı arasında kesinlikle HİÇBİR ilişki yoktur. Anlaşmaları sadece ortak bir tesadüf.
Brian Desmond

0

Kullanıcı Asıl Adı veya DN'niz varsa, değerleri çevirmek için ActiveDS COM kitaplığını kullanabilirsiniz. Aşağıda UserPrincipalName'i NT4 (NetBios) adına çevirmek için bir örnek verilmiştir.

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);
        }
    }
}

Cevabınız için teşekkürler, ancak bunu Windows olmayan bir makineden ve ideal olarak bir LDAP sorgusu aracılığıyla yapmam gerekiyor.
Kirk Liemohn
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.