0
我正在用C++編寫一個程序,該程序連接到Active Directory服務器,搜索內容,然後將該內容轉儲到終端。我的問題是,我能夠成功進行身份驗證和連接的唯一方法是使用用戶的顯示名稱(例如測試用戶)。我想改變這種身份驗證方法來改爲使用用戶的登錄名。 (如[email protected])使用用戶登錄名稱而不是顯示名稱對Active Directory進行身份驗證
這裏是負責建立會話的代碼:
char * _hostName = "The_Computer_Name";
char * _dn = "CN=Test User,DC=EXAMPLE,DC=COM";
char * _ps = "The_Password123";
int ldap_Query::session_init(){
if (_pLdapConnection != nullptr) return 0;
_pLdapConnection = ldap_init(_hostName, LDAP_PORT);
if (_pLdapConnection == nullptr) {
int err = ldap_get_option(_pLdapConnection, LDAP_OPT_ERROR_NUMBER, &err);
throw LdapQueryException(ldap_err2string(err));
}
unsigned long lRtn = ldap_simple_bind_s(_pLdapConnection, _dn,_ps);
if (lRtn != LDAP_SUCCESS) {
ldap_unbind(_pLdapConnection);
_pLdapConnection = nullptr;
throw LdapQueryException(ldap_err2string(lRtn));
}
return 0;
}
我想我正在尋找被稱爲用戶主體名稱,但還沒有看到使用它進行身份驗證的示例。我試過用「CN = Tuser,DC = EXAMPLE,DC = COM」來代替_dn,但是沒有運氣。
感謝您的幫助!
您能澄清一下:「您需要使用服務帳戶或匿名(如果允許)使用其提供的userprincipalname屬性搜索用戶。」?這是否意味着,我需要嘗試使用管理員帳戶進行身份驗證,或嘗試先不使用憑據進行連接,然後使用該過濾器執行搜索?似乎我可能只是使用這些憑證執行搜索記錄,而不是嘗試以用戶身份進行身份驗證。 – Josh 2014-12-04 16:24:28
是的,你需要綁定到目錄,以便你可以搜索它。某些目錄將被配置爲允許匿名綁定,並可能將一部分屬性返回給匿名綁定。這在Active Directory中不典型。您通常需要綁定一個可搜索的服務帳戶,以便您可以找到該用戶。你在使用用戶的憑據做一個捕獲22,但是;您需要一個DN才能執行綁定,但在綁定之前無法獲取DN。通常,應用程序將與目錄服務器建立開放連接以搜索用戶。 – 2014-12-04 17:18:16
如果您面向更多以Windows爲中心的工具,則可以直接使用upn,DOMAIN \ username進行綁定,但您在此時放棄了LDAP的靈活性。 – 2014-12-04 17:19:33