Я пытаюсь выполнить ActiveDirectory/LDAP-аутентификацию в .NET Core.
Тем не менее, нет System.DirectoryServices в .NET Core (NetStandard 1.6).
Так что вместо этого я использую Novell.Directory.Ldap, который отлично работает, если вы знаете rootDSE.Как получить defaultNamingContext в .NET Core?
Обычно, я хотел бы получить 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)
Так что я пытался использовать один и тот же COM-объекта в C# (так как нет VB.NET для .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."
Что я делаю неправильно?
Кроме того, если у кого-то есть лучший способ получить RootDSE в .NET Core, тогда я все уши.
PS:
Я знаю, что это будет работать только в Windows - я просто установил его для ручной настройки в Linux.