Truy vấn LDAP trên AD có thể cung cấp tên miền netbios cho một tài khoản khi sử dụng Danh mục chung không?


11

Tôi đang sử dụng Chỉnh sửa ADSI để xem các thuộc tính LDAP của một tài khoản người dùng trong AD. Tôi thấy các thuộc tính như userPrincipalName, nhưng tôi không thấy một thuộc tính nào cho tên miền đủ điều kiện (FQDN) hoặc tên miền netbios.

Chúng tôi sẽ thiết lập Danh mục toàn cầu (GC) để cấp cho chúng tôi quyền truy cập LDAP vào nhiều tên miền và thông qua cấu hình trong một ứng dụng, chúng tôi ánh xạ các thuộc tính LDAP sang các thuộc tính hồ sơ người dùng trong ứng dụng. Với AD điển hình, tên miền FQDN và netbios giống nhau cho tất cả người dùng, nhưng với sự tham gia của GC, chúng tôi cần thông tin bổ sung này. Chúng tôi thực sự chỉ cần tên miền netbios (FQDN không đủ tốt).

Có lẽ có một truy vấn LDAP có thể được thực hiện để yêu cầu thông tin này từ một đối tượng cấp cao hơn trong AD?

Câu trả lời:


5

Tôi nghĩ rằng tôi đã tìm ra nó. Sử dụng Chỉnh sửa ADSI, bạn có thể xem các thuộc tính trên một đối tượng (ví dụ: người dùng), nhưng theo mặc định, nó đã lọc ra các thuộc tính "được xây dựng". Sử dụng nút Bộ lọc ở dưới cùng bên phải của màn hình thuộc tính, tôi có thể hiển thị các thuộc tính bổ sung này.

"MsDS-PrincipalName" dường như có "[tên miền netbios] \ [sAMAccountName]" làm giá trị của nó.

Nếu tôi truy cập Người dùng và Máy tính AD và thay đổi "Tên đăng nhập người dùng" từ "gwasington@test.kirkdev.local" thành "gwash2ington@test.kirk2dev.local" thì điều này ảnh hưởng đến thuộc tính "userPrincipalName", nhưng không ảnh hưởng đến thuộc tính "userPrincipalName" Thuộc tính hiệu trưởng ". Điều này tốt trong trường hợp của tôi, vì hệ thống khác của tôi (SharePoint) cũng không nhận ra sự thay đổi này.

Nếu tôi truy cập Người dùng và Máy tính AD và thay đổi "Tên đăng nhập người dùng (trước Windows 2000)" từ "KIRKDEV \ gwashington" thành "KIRKDEV \ g2washington" (lưu ý rằng tôi không thể thay đổi phần đầu tiên), điều này không ảnh hưởng đến "userPrincipalName" thuộc tính, nhưng không ảnh hưởng đến "msDS-PrincipalName" thuộc tính. Đây chính xác là những gì tôi muốn vì hệ thống khác của tôi (SharePoint) không nhận ra sự thay đổi này.

Lưu ý bên lề: Tôi đã nói SharePoint nhận ra sự thay đổi, nhưng đó chỉ là khi người dùng chưa bao giờ đăng nhập vào bộ sưu tập trang SharePoint đó trước đó. Khi người dùng đã đăng nhập vào tuyển tập trang SharePoint, trường tp_Login trong bảng UserInfo được đặt với giá trị "msDS-PrincipalName" và điều đó dường như không thay đổi. Vì vậy, tôi có thể phải tìm cách buộc phải thay đổi hoặc chỉ nói rằng kịch bản này không được hỗ trợ.


Tôi chưa xác minh rằng chúng tôi thực sự có thể truy vấn "msDS-PrincipalName" từ Danh mục toàn cầu. Đó sẽ là bước tiếp theo.
Kirk Liêmohn

Chà, tôi đã đánh dấu câu trả lời của mình là câu trả lời đúng, nhưng bây giờ tôi thấy rằng Danh mục toàn cầu không thể truy vấn msDS-PrincipalName. Ugh, vẫn không chắc chắn làm thế nào chúng ta sẽ tìm ra tên miền netbios từ đó mà không đưa ra một số giả định (giống như đó là phần đầu tiên của FQDN).
Kirk Liêmohn

Về lưu ý phụ của tôi, hãy xem serverfault.com/questions/234526/, để giúp SharePoint nhận ra thay đổi đăng nhập.
Kirk Liêmohn

Đây là thứ được gọi là thuộc tính được xây dựng - được tính theo yêu cầu khi yêu cầu được thực hiện cho một đối tượng. Bạn không thể lọc nó trong một truy vấn vì điều này.
Brian Desmond

Cảm ơn thông tin này - rất hữu ích cho tôi khi truy vấn qua LDAP từ SQL Server.
Ian Yates

3

Để trả lời câu hỏi cuối cùng của bạn, bạn sẽ có thể xác minh tên NetBios theo cách thủ công bằng cách kiểm tra phần Cấu hình và sau đó Phân vùng thư mục trong ADSIEdit:

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

Điều này có cả hai namenetBIOSNametính chất. Mặt khác, tôi nghĩ rằng bạn phải lấy nó từ một fqdn / DN như squillman gợi ý.


Cảm ơn @BoyMars. Tôi gặp một số khó khăn khi tìm "CN = Cấu hình" ở cấp cao nhất trong miền của mình. Tôi chọc một chút và không thể tìm thấy "Cấu hình" hoặc "Phân vùng thư mục". Tuy nhiên, tôi nghĩ rằng tôi có thể đã tìm ra điều này (sắp đăng câu trả lời).
Kirk Liêmohn

OK, tôi chỉ tìm ra cách truy cập CN = Cấu hình (xin lỗi, đã khoảng 6 năm kể từ khi tôi chơi xung quanh với LDAP và Chỉnh sửa ADSI). @BoyMars, tôi thấy những gì bạn đang nói về. Thật không may, là để truy vấn tên miền netbios, có vẻ như tôi cần phải lặp qua tất cả các đối tượng trong CN = Partitions, CN = Cấu hình và cho mỗi người xem nó có thuộc tính "nETBIOSName" không. Có thể một truy vấn cho tôi biết tất cả các đối tượng crossRef trong đó thuộc tính netBIOSName không null sẽ thực hiện thủ thuật. Điều này có vẻ tương đối dễ thực hiện trong mã, nhưng tôi phải làm điều này thông qua cấu hình. :-(
Kirk Liêmohn

Đây là một trang thảo luận về cách truy vấn netbiosname. Họ đang sử dụng mã, mặc dù. Tôi nghi ngờ rằng điều này sẽ không làm việc cho tôi. geekswithbloss.net/Tariq/archive/2009/07/30/133813.aspx
Kirk

nhưng nó giải thích vị trí "AD lưu trữ tên netbios trong vùng chứa tên phân vùng được lưu trữ bên trong thùng chứa tên cấu hình."
BoyMars

Đây là nguồn thông tin có thẩm quyền duy nhất. Cụ thể, đối tượng crossRef đã đề cập.
Brian Desmond

3

Đối với một ứng dụng? Microsoft thực hiện điều này khá đơn giản trong .NET. Điều này sẽ cung cấp cho bạn một danh sách các tên miền Netbios mà bạn có thể sử dụng để tạo danh sách các đối tượng tùy chỉnh với tên miền DN / DNS / Netbios hoặc từ điển tham chiếu chéo.

Ngoài ra, những gì xác định nếu một thuộc tính có sẵn trong Danh mục chung là (thuộc tính khác) được gọi là isMemberOfPartialAttributionSet. Sử dụng Microsoft SysIternals AD Explorer, bạn có thể tìm kiếm bộ chứa Schema trong một miền và tìm kiếm bất kỳ đối tượng nào có isMemberOfPartialAttributionSet = true để xem tất cả các thuộc tính có sẵn cho truy vấn 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;
}

Cảm ơn câu trả lời, nhưng tôi cần chạy nó từ một máy không chạy Windows. Tuy nhiên, nếu cần tôi đoán tôi có thể tạo dịch vụ web của riêng mình bằng .NET và cung cấp cho máy khác thông tin này. Đó có thể là một cách tiếp cận dự phòng.
Kirk Liêmohn

2
Điều đó cũng nên đơn giản. Đặt DN cơ sở của bạn thành "CN = Phân vùng, CN = Cấu hình" + DN cơ sở của thuộc tính phân biệt tên miền và bộ lọc tìm kiếm thành (& (nETBIOSName = *) (dnsRoot = <dns tên miền AD>)). Bạn cũng có thể tìm kiếm thuộc tính ncName thay vì dnsRoot, nếu bạn muốn khớp với hậu tố dn của tên miền thay vì tên dns.
Greg Askew

1

Bạn sẽ phải phân tích nó ra khỏi dn(tên phân biệt) hoặc AdsDSPaththuộc tính. Các thực thể tên miền được tiền tố "DC="trong các thuộc tính này. Phần ngoài cùng bên trái DC=sẽ chứa tên miền netbios của bạn.

Ví dụ: cn=myuser,ou=users,dc=mydomain,dc=mycompany,dc=com

mydomain là tên miền netbios.

EDIT:
Như Brian Desmond chỉ ra, đây không nhất thiết là cách có thẩm quyền để tìm tên netbios thực tế, nó chỉ đơn thuần là sự trùng hợp ngẫu nhiên mà chúng thường tương quan. Xem câu trả lời của BoyMars cho cách có thẩm quyền.


xem giới hạn của netbios là 15 ký tự khi sử dụng các giá trị từ chuỗi fqdn hoặc DN, tôi chưa thấy nhiều tên miền sử dụng một chuỗi dài như vậy :)
BoyMars

Cảm ơn @squillman, nhưng khi tôi tạo tên miền này, tôi đã cố tình biến tên miền netbios không phải là phần đầu tiên của FQDN chỉ vì nó có thể và tôi cần kiểm tra các ranh giới vì mã của tôi phải hoạt động trong nhiều môi trường. Vì vậy, trong trường hợp của tôi, FQDN là test.kirkdev.local (ví dụ người dùng dn là "CN = George Washington, CN = Users, DC = test, DC = kirkdev, DC = local") nhưng tên miền netbios là kirkdev.
Kirk Liêmohn

Nếu bạn đang sử dụng Windows, dsquery computer OU=OU,OU=You,OU=Need,DC=local.domain -o rdncung cấp cho bạn những gì bạn muốn, với tên NetBIOS trong dấu ngoặc kép. Vì nó là tương đối, bạn sẽ không cần có được đường dẫn đầy đủ. Không chắc chắn nếu điều này sẽ giúp OP mặc dù; ông đã hỏi về LDAP, vì vậy đây không phải là câu trả lời LDAP thuần túy.
songei2f

@alharaka cảm ơn vì nhận xét, nhưng chúng tôi đang truy vấn AD từ máy tính không phải MS. Chúng tôi có khả năng có thể đối phó với nó, nhưng chúng tôi thực sự muốn đây là một phần của truy vấn LDAP. Dường như DSquery là một công cụ dòng lệnh Windows Server.
Kirk Liêmohn

1
Xin lỗi nhưng điều này không chính xác. Hoàn toàn KHÔNG có mối quan hệ nào giữa thành phần tên miền hàng đầu (ví dụ: dc = mydomain) và tên NetBIOS của tên miền. Đó chỉ là một sự trùng hợp phổ biến mà họ đồng ý.
Brian Desmond

0

Nếu bạn có Tên hiệu trưởng người dùng hoặc DN, bạn có thể sử dụng thư viện COM ActiveDS để dịch các giá trị. Dưới đây là một ví dụ để dịch tên UserPrincipalName sang tên 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);
        }
    }
}

Cảm ơn câu trả lời, nhưng tôi cần thực hiện điều này từ một máy không chạy Windows và lý tưởng nhất là thông qua truy vấn LDAP.
Kirk Liêmohn
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.