簡體   English   中英

如何在.NET Core中獲取defaultNamingContext?

[英]How to get the defaultNamingContext in .NET Core?

我正在嘗試在.NET Core中執行ActiveDirectory / LDAP身份驗證。
但是, .NET Core(NetStandard 1.6)中沒有System.DirectoryServices。
因此,我改用Novell.Directory.Ldap,只要您知道rootDSE,它就可以正常工作。

通常,我將獲得ActiveDirectory RootDSE-defaultNamingContext像這樣:

public static string GetRootDSE()
{
    DirectoryEntry rootDSE = new DirectoryEntry("LDAP://rootDSE");
    string defaultNamingContext = rootDSE.Properties["defaultNamingContext"].Value;
    return defaultNamingContext:
}

但是,由於沒有System.DirectoryServices,因此無法執行此操作。
Novell.Directory.Ldap似乎沒有與此等效的功能,或者至少我找不到它。

現在以VBScript為例,您可以像這樣獲得defaultNamingContext:

Set objRootDSE = GetObject("LDAP://rootDSE")
strADsPath = "LDAP://" & objRootDSE.Get("defaultNamingContext")
Set objDomain = GetObject(strADsPath)

因此,我嘗試在C#中使用相同的COM對象(由於.NET Core沒有VB.NET,因此無法調用VB.NET運行時)。
到目前為止,這是我設法做到的:

[System.Runtime.InteropServices.DllImport("Activeds", ExactSpelling = true, 
EntryPoint = "ADsGetObject",
CharSet = System.Runtime.InteropServices.CharSet.Unicode)]
public static extern int ADsGetObject(string path
    , [System.Runtime.InteropServices.In, System.Runtime.InteropServices.Out] ref System.Guid iid
    , [System.Runtime.InteropServices.Out, System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.Interface)] out object ppObject
);


public static void Test()
{
    dynamic ppObject;

    // System.Guid IID_IDirectorySearch = new System.Guid("{ 0x109BA8EC, 0x92F0, 0x11D0, { 0xA7, 0x90, 0x00, 0xC0, 0x4F, 0xD8, 0xD5, 0xA8 } }");
    // System.Guid IID_IADsContainer = new System.Guid("{ 0x001677D0, 0xFD16, 0x11CE, { 0xAB, 0xC4, 0x02, 0x60, 0x8C, 0x9E, 0x75, 0x53 } }");
    System.Guid IID_IADs = new System.Guid("{ 0xFD8256D0, 0xFD15, 0x11CE, { 0xAB, 0xC4, 0x02, 0x60, 0x8C, 0x9E, 0x75, 0x53 } }");
    ADsGetObject("LDAP://rootDSE", ref IID_IADs, out ppObject);
    System.Console.WriteLine(ppObject);

    object objDSE;
    // System.IntPtr objDSE;
    // https://msdn.microsoft.com/en-us/library/aa705950(v=vs.85).aspx
    // https://msdn.microsoft.com/en-us/library/aa746347(v=vs.85).aspx
    // HRESULT Get( [in]  BSTR    bstrName, [out] VARIANT *pvProp);
    // ppObject.Get("defaultNamingContext", out objDSE);

    System.IntPtr bstr = System.Runtime.InteropServices.
      Marshal.StringToBSTR("defaultNamingContext");
    ppObject.Get(bstr, out objDSE);
    System.Console.WriteLine(objDSE);
}

我得到了COM對象(“ ppObject”),在我調用ppObject上的Get之前,它似乎可以正常工作。
我收到"Not Implemented-Exception: Method or process is not implemented."
我究竟做錯了什么 ?

另外,如果有人有更好的方法來在.NET Core中獲取RootDSE,那么我無所不能。

PS:
我知道這僅適用於Windows-我只是將其設置為在Linux上手動配置。

啊,沒關系,我得到了答案:

正如你可以看到這里 ,你可以運行

nslookup -type=srv _ldap._tcp.DOMAINNAME

獲得理想的結果。
所以當你跑步

nslookup -type=srv _ldap._tcp.YourDomain.local

,這表示您在默認DNS中查詢執行機器域的ldap-server記錄,並使用該結果。

您可以使用任何具有.NET Core功能的DNS庫(例如ArSoft)來完成此操作。

挖

public static void Test4()
{
    System.Net.NetworkInformation.IPGlobalProperties ipgp = 
        System.Net.NetworkInformation.IPGlobalProperties.GetIPGlobalProperties();

    // IDnsResolver resolver = new RecursiveDnsResolver(); // Warning: Doesn't work
    IDnsResolver resolver = new DnsStubResolver();

    List<SrvRecord> srvRecords = resolver.Resolve<SrvRecord>("_ldap._tcp." + ipgp.DomainName, RecordType.Srv);

    foreach (SrvRecord thisRecord in srvRecords)
    {
        // System.Console.WriteLine(thisRecord.Name);
        System.Console.WriteLine(thisRecord.Target);
        System.Console.WriteLine(thisRecord.Port);

        // Note: OR LDAPS:// - but Novell doesn't want these parts anyway 
        string url = "LDAP://" + thisRecord.Target + ":" + thisRecord.Port; 
        System.Console.WriteLine(url);
    } // Next thisRecord

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM