2016-11-02 16 views
2

私は.NET CoreでActiveDirectory/LDAP認証をしようとしています。
ただし、.NET Core(NetStandard 1.6)にSystem.DirectoryServicesはありません。
代わりに、Novell.Directory.Ldapを使用します。これは、rootDSEを知っている限り、正常に動作します。何System.DirectoryServicesがないので、私はそれを行うことはできません、しかし.NETコアでdefaultNamingContextを取得する方法は?

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

通常、私はこのようなのActiveDirectoryでrootDSE-defaultNamingContextになるだろう。
Novell.Directory.Ldapはそれと同等の機能を持っていないか、少なくとも私はそれを見つけることができません。

は今のVBScriptの例のために、あなたはこのようにdefaultNamingContextを得ることができる:だから私は、.NETのコアのためのVB.NETがないので、C#(同じCOM-オブジェクトを使用しようとした

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

、私は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上で手動で設定するように設定しています。

答えて

4

ああ、気にしないが、私は答えを得た:

あなたがhereを見ることができるように、あなたが希望する結果を得るために

nslookup -type=srv _ldap._tcp.DOMAINNAME 

を実行することができます。
ですから、

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

を実行すると、あなたが実行するマシンのドメインのLDAPサーバのレコードのデフォルト-DNSを照会し、その結果を使用することを意味しています。

これは、ArSoftなどの.NET Core対応のDNSライブラリで行うことができます。

Dig

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 

} 
関連する問題