如何在.NET Core中获取defaultNamingContext?

weixin_38066498 2019-09-12 03:42:11

我想在.NET Core中执行ActiveDirectory/LDAP-Authentication。 但是,在.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的核心没有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做工精细。 我在那里得到"Not Implemented-Exception: Method or process is not implemented." 我在做什么错?另外,如果有人有更好的方式在.NET Core中获得RootDSE,那么我就会全神贯注。 PS: 我知道这只适用于Windows - 我只是将它设置为在Linux上手动配置。






...全文
53 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_38095754 2019-09-12
  • 打赏
  • 举报
回复

啊,没关系,我得到了答案: 正如你可以看到here,你可以运行 nslookup -type=srv _ldap._tcp.DOMAINNAME ,以获得期望的结果。 所以,当你运行 nslookup -type=srv _ldap._tcp.YourDomain.local ,这意味着你查询默认DNS的执行机器的域的LDAP服务器的记录,并使用该结果。 您可以使用任何支持.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 }

430

社区成员

发帖
与我相关
我的任务
社区描述
其他技术讨论专区
其他 技术论坛(原bbs)
社区管理员
  • 其他技术讨论专区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧