क्या AD कैटलॉग पर LDAP क्वेरी ग्लोबल कैटलॉग का उपयोग करते हुए एकल खाते के लिए नेटबायोस डोमेन नाम प्रदान कर सकता है?


11

मैं ADSI संपादन का उपयोग AD में एकल उपयोगकर्ता खाते के LDAP गुणों को देखने के लिए कर रहा हूँ। मुझे userPrincipalName जैसे गुण दिखाई देते हैं, लेकिन मैं पूरी तरह से योग्य डोमेन नाम (FQDN) या नेटबायोस डोमेन नाम के लिए एक नहीं देखता हूं।

हम एक से अधिक डोमेन में एलडीएपी एक्सेस देने के लिए ग्लोबल कैटलॉग (जीसी) स्थापित करेंगे और एक एप्लीकेशन में कॉन्फ़िगरेशन के जरिए हम एलडीएपी प्रॉपर्टीज को यूजर प्रोफाइल प्रॉपर्टीज में मैप करेंगे। विशिष्ट AD के साथ FQDN और netbios डोमेन नाम सभी उपयोगकर्ताओं के लिए समान हैं, लेकिन GC शामिल होने के साथ हमें इस अतिरिक्त जानकारी की आवश्यकता है। हमें वास्तव में केवल netbios डोमेन नाम की आवश्यकता है (FQDN पर्याप्त अच्छा नहीं है)।

हो सकता है कि एक LDAP क्वेरी है जो AD में अधिक शीर्ष-स्तरीय ऑब्जेक्ट से इस जानकारी का अनुरोध करने के लिए किया जा सकता है?

जवाबों:


5

मुझे लगता है कि मैंने हल निकाल लिया। ADSI एडिट का उपयोग करके आप किसी ऑब्जेक्ट (जैसे, उपयोगकर्ता) पर गुण देख सकते हैं, लेकिन डिफ़ॉल्ट रूप से यह "निर्मित" विशेषताओं को फ़िल्टर कर रहा था। गुण स्क्रीन के नीचे दाईं ओर फ़िल्टर बटन का उपयोग करके मैं इन अतिरिक्त विशेषताओं को दिखाने में सक्षम था।

"एमएसडीएस-प्रिंसिपलनाम" को इसके मूल्य के रूप में "[netbios डोमेन नाम] \ [sAMAccountName]" प्रतीत होता है।

अगर मैं AD उपयोगकर्ता और कंप्यूटर में जाता हूं और "उपयोगकर्ता लॉगऑन नाम" को "gwasington@test.kirkdev.local" से बदलकर "gwash2ington@test.kirk2dev.local" करता हूं, तो यह "userPrincipalName" विशेषता को प्रभावित करता है, लेकिन "msDS- नहीं" प्रिंसिपलनाम "विशेषता। यह मेरे मामले में अच्छा है, क्योंकि मेरा दूसरा सिस्टम (SharePoint) इस परिवर्तन को पहचानता नहीं है।

अगर मैं AD उपयोगकर्ता और कंप्यूटर में जाता हूं और "KIRKDEV \ gwashington" से "उपयोगकर्ता लॉगऑन नाम (प्री-विंडोज 2000)" को "KIRKDEV \ g2washington" में बदल देता हूं (ध्यान दें, मैं पहला भाग नहीं बदल सकता) इससे कोई असर नहीं पड़ता "userPrincipalName" विशेषता, लेकिन "msDS-PrincipalName" विशेषता को प्रभावित करता है । यह वही है जो मैं चाहता हूं क्योंकि मेरा दूसरा सिस्टम (SharePoint) इस परिवर्तन को पहचानता है।

साइड नोट: मैंने कहा कि SharePoint परिवर्तन को पहचानता है, लेकिन यह केवल तभी है जब उपयोगकर्ता ने उस SharePoint साइट संग्रह में पहले कभी लॉगिन नहीं किया है। उपयोगकर्ता द्वारा SharePoint साइट संग्रह में लॉग इन करने के बाद, UserInfo तालिका में tp_Login फ़ील्ड को "msDS-PrincipalName" मान के साथ सेट किया जाता है और यह परिवर्तित नहीं होता है। इसलिए, मुझे इसे बदलने के लिए मजबूर करने का एक तरीका ढूंढना पड़ सकता है या बस कहें कि यह परिदृश्य समर्थित नहीं है।


मैंने सत्यापित नहीं किया है कि हम वास्तव में ग्लोबल कैटलॉग से "एमएसडीएस-प्रिंसिपलनाम" क्वेरी कर सकते हैं। वह अगला कदम होगा।
कर्क लीमोहोन

ठीक है, मैं अपने उत्तर को सही के रूप में चिह्नित करने वाला था, लेकिन अब मैं देखता हूं कि ग्लोबल कैटलॉग एमएसडीएस-प्रिंसिपलनाम को क्वेरी नहीं कर सकता है। उघ, अभी भी निश्चित नहीं है कि हम कुछ अनुमान लगाए बिना नेटबायोस डोमेन नाम का पता कैसे लगाएंगे (जैसे कि यह FQDN का पहला भाग है)।
कर्क लीमोहोन

मेरे साइड नोट के बारे में, लॉगिन परिवर्तन को पहचानने के लिए SharePoint प्राप्त करने में सहायता के लिए serverfault.com/questions/234526/… देखें ।
Kirk Liemohn

इसे एक निर्मित विशेषता कहा जाता है - कि जब किसी वस्तु के लिए अनुरोध किया जाता है, तो इसकी मांग पर गणना की जाती है। आप इस वजह से क्वेरी में इसे फ़िल्टर नहीं कर सकते।
ब्रायन डेसमंड

इस जानकारी के लिए धन्यवाद - SQL सर्वर से LDAP के माध्यम से क्वेरी करते समय मेरे लिए बहुत काम आया।
इयान येट्स

3

अपने अंतिम प्रश्न का उत्तर देने के लिए आपको ADSIEBIT में कॉन्फ़िगरेशन अनुभाग और फिर निर्देशिका विभाजन की जाँच करके मैन्युअल रूप से नेटबायोस नाम को सत्यापित करने में सक्षम होना चाहिए:

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

यह दोनों nameऔर netBIOSNameगुण है। अन्यथा मुझे लगता है कि आपको स्क्वीडमैन के सुझाव के अनुसार इसे fqdn / DN से प्राप्त करना होगा।


धन्यवाद @BoyMars। मुझे अपने डोमेन में शीर्ष स्तर पर "CN = कॉन्फ़िगरेशन" खोजने में कुछ परेशानी हुई। मैंने थोड़ा सा चारों ओर देखा और "कॉन्फ़िगरेशन" या "निर्देशिका विभाजन" नहीं खोज सका। हालांकि, मुझे लगता है कि मेरे पास इसका पता लग सकता है (उत्तर पोस्ट करने के बारे में)।
Kirk Liemohn

ठीक है, मुझे अभी पता चला है कि CN = कॉन्फ़िगरेशन कैसे प्राप्त करें (क्षमा करें, यह लगभग 6 साल हो गया है क्योंकि मैंने LDAP और ADSI संपादन के साथ खेला है)। @ बॉयर्स, मैं देख रहा हूं कि आप किस बारे में बात कर रहे हैं। दुर्भाग्य से, netbios डोमेन नाम को क्वेरी करने के लिए है, ऐसा प्रतीत होता है कि मुझे CN = विभाजन, CN = कॉन्फ़िगरेशन के तहत सभी वस्तुओं के माध्यम से लूप करने की आवश्यकता है और प्रत्येक के लिए यह देखें कि क्या इसमें "nETBIOSName" विशेषता है। हो सकता है कि एक क्वेरी जो कहती है कि मुझे सभी क्रॉसरीफ ऑब्जेक्ट दें, जहां netBIOSName विशेषता शून्य नहीं है, यह चाल चलेगा। कोड में ऐसा करना अपेक्षाकृत आसान लगता है, लेकिन मुझे कॉन्फ़िगरेशन के माध्यम से ऐसा करना होगा। :-(
Kirk Liemohn

यहाँ एक पृष्ठ है जो चर्चा करता है कि कैसे netbiosname को क्वेरी करना है। वे कोड का उपयोग कर रहे हैं, हालांकि। मुझे संदेह है कि यह मेरे लिए काम नहीं करेगा। geekswithblogs.net/Tariq/archive/2009/07/30/133813.aspx
Kirk Liemohn

लेकिन यह स्थान को समझाता है "विज्ञापन नेटबायोस नाम को विभाजन नामकरण कंटेनर में संग्रहीत करता है जो कॉन्फ़िगरेशन नोडल कंटेनर के अंदर संग्रहीत होता है।"
बॉयमैर्स

यह सूचना का एकमात्र आधिकारिक स्रोत है। विशेष रूप से, क्रॉसआरफ ऑब्जेक्ट का उल्लेख किया गया है।
ब्रायन डेसमंड

3

एक आवेदन के लिए? Microsoft इसे .NET में बहुत सीधा बनाता है। यह आपको डोमेन नेटबायस नामों की एक सूची प्रदान करता है, जिसका उपयोग आप डोमेन डीएन / डीएनएस / नेटबायोस नाम, या क्रॉस-रेफरेंसिंग शब्दकोशों के साथ कस्टम ऑब्जेक्ट्स की सूची बनाने के लिए कर सकते हैं।

इसके अलावा, यह निर्धारित करता है कि क्या कोई विशेषता वैश्विक कैटलॉग में उपलब्ध है (अभी तक कोई अन्य) विशेषता जिसे isMemberOfPartialAttributeSet कहा जाता है। Microsoft SysInternals AD Explorer का उपयोग करके, आप स्कीमा कंटेनर को एक डोमेन में खोज सकते हैं, और किसी भी ऑब्जेक्ट के लिए खोज कर सकते हैं जिसमें isMemberOfPartialAttributeSet = 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;
}

उत्तर के लिए धन्यवाद, लेकिन मुझे इसे गैर-विंडोज मशीन से चलाने की आवश्यकता है। हालाँकि, अगर मुझे लगता है कि मुझे जरूरत है कि मैं अपनी खुद की वेब सेवा .NET में बना सकूं और इस जानकारी के साथ दूसरी मशीन प्रदान कर सकूं। यह एक गिरावट वाला दृष्टिकोण हो सकता है।
कर्क लीमोहेन

2
वह भी सीधा होना चाहिए। अपने बेस DN को "CN = पार्टीशन, CN = कॉन्फ़िगरेशन" + डोमेन के विशिष्ट DN नाम विशेषता में सेट करें, और ((nETBIOSName = *) (dnsRoot = AD डोमेन का नाम dnsR)) के लिए खोज फ़िल्टर। आप dnsRoot के बजाय ncName विशेषता की खोज कर सकते हैं, यदि आप dns नाम के बजाय डोमेन के dn प्रत्यय से मेल खाना चाहते हैं।
ग्रेग आस्कु

1

आपको इसे dn(विशिष्ट नाम) या AdsDSPathविशेषताओं में से पार्स करना होगा । डोमेन नाम संस्थाएँ "DC="इन विशेषताओं के साथ उपसर्ग करती हैं । सबसे बाईं ओर DC=आपका नेटबायोस डोमेन नाम होगा।

उदाहरण के लिए: cn=myuser,ou=users,dc=mydomain,dc=mycompany,dc=com

mydomain netbios डोमेन नाम है।

EDIT:
जैसा कि ब्रायन डेसमंड बताते हैं, यह जरूरी नहीं कि वास्तविक नेटबायोस नाम खोजने के लिए आधिकारिक तरीका है, यह केवल संयोग है कि वे आमतौर पर सहसंबंधित हैं। आधिकारिक तरीके के लिए बॉयमार्ज़ का उत्तर देखें।


एक fqdn या DN स्ट्रिंग से मानों का उपयोग करते समय 15 वर्णों की नेटबायस सीमा के लिए देखें, मैंने कई डोमेन नहीं देखे हैं जो एक स्ट्रिंग का उपयोग करते हैं, हालांकि लंबे समय तक :)
BoyMars

धन्यवाद @squillman, लेकिन जब मैंने इस डोमेन को बनाया तो मैंने जानबूझकर नेटबायस डोमेन नाम FQDN का पहला हिस्सा नहीं बनाया है क्योंकि यह संभव था और मुझे सीमाओं की जांच करने की आवश्यकता है क्योंकि मेरे कोड को कई वातावरणों में काम करना है। तो मेरे मामले में FQDN का परीक्षण है ।kirkdev.local (उदाहरण उपयोगकर्ता dn "CN = जॉर्ज वाशिंगटन, CN = उपयोगकर्ता, DC = परीक्षण, DC = kirkdev, DC = स्थानीय") लेकिन netbios डोमेन नाम kirkdev है।
कर्क लीमोहोन

यदि आप Windows का उपयोग कर रहे हैं, dsquery computer OU=OU,OU=You,OU=Need,DC=local.domain -o rdnतो आपको वह दिया जाता है जो आप चाहते हैं, उद्धरण चिह्नों में NetBIOS नाम के साथ। चूंकि यह सापेक्ष है, आपको पूर्ण पथ प्राप्त करने की आवश्यकता नहीं होगी। यकीन नहीं होता कि इससे ओपी को मदद मिलेगी; उन्होंने LDAP के बारे में पूछा, तो यह शुद्ध LDAP उत्तर नहीं है।
गीतई

@alharaka टिप्पणी के लिए धन्यवाद, लेकिन हम एक गैर-एमएस कंप्यूटर से विज्ञापन की क्वेरी कर रहे हैं। हम इसके साथ संभावित रूप से निपट सकते हैं, लेकिन हम वास्तव में इसे LDAP क्वेरी का हिस्सा बनाना चाहते हैं। ऐसा प्रतीत होता है कि dsquery एक विंडोज सर्वर कमांड लाइन टूल है।
कर्क लीमोहोन

1
क्षमा करें, लेकिन यह गलत है। शीर्ष डोमेन घटक (जैसे dc = mydomain) और डोमेन के NetBIOS नाम के बीच बिल्कुल कोई संबंध नहीं है। यह सिर्फ एक सामान्य संयोग है कि वे सहमत हैं।
ब्रायन डेसमंड

0

यदि आपके पास उपयोगकर्ता प्रधान नाम या डीएन है, तो आप मूल्यों का अनुवाद करने के लिए 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);
        }
    }
}

उत्तर के लिए धन्यवाद, लेकिन मुझे गैर-विंडोज मशीन से और आदर्श रूप से LDAP क्वेरी के माध्यम से ऐसा करने की आवश्यकता है।
कर्क लीमोहेन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.