![](/img/trans.png)
[英]Getting the full-name of the current user, returns an empty string (C#/C++)
[英]LDAP Getting Full user Name C++
我在辦公室寫一個小應用程序。 在此應用程序中,我必須獲取完整的用戶名。 它是用Qt / C ++編寫的
我喜歡通過LDAP獲取此信息。 現在,我可以連接到我們的Active Directory服務器,並且可以連接到搜索功能。
此信息來自Microsoft編寫的示例。
但是在這一點上,示例使我感到困惑。 我不知道如何為該服務器提供用戶名並接收全名。
鏈接到Microsoft示例: http : //msdn.microsoft.com/zh-cn/library/windows/desktop/aa367016(v=vs.85).aspx
有人可以給我建議我如何獲取此信息?
謝謝,並最好的問候克里斯;)
PS對不起,英語不好。 PSS,如果我錯過了某些內容,或者您需要更多信息,請說出來。
LDAP_query.cpp:
#include <settings.h>
#include <ui_settings.h>
#include <mainwindow.h>
#include <ui_mainwindow.h>
#include <QtGui>
#include <QString>
//Header Files for LDAP Query
#include <windows.h>
#include <winldap.h>
#include <winber.h>
#include <rpc.h>
#include <rpcdce.h>
#include <stdio.h>
void MainWindow::LDAP_query(QString name)
{
//Name contains the username
PWCHAR hostName = NULL;
PWCHAR Domain = NULL;
PWCHAR pMyDN = NULL;
PWCHAR pUserName;
PWCHAR pPassword;
LDAP* pLdapConnection = NULL;
ULONG version = LDAP_VERSION3;
ULONG getOptSuccess = 0;
ULONG connectSuccess = 0;
INT returnCode = 0;
// Convert String hostname to a wchar_t*
char *hostName_2 = "Server.office.com";
QString Test = QString::fromAscii(hostName_2);
hostName = (WCHAR*)(Test.utf16());
//Connverting Char to WCHAR to connect to Directory
char *pMyDN_2 = "Ou=directory,Dc=Name,DC=office";
QString test2 = QString::fromAscii(pMyDN_2);
pMyDN = (WCHAR*)(test2.utf16());
//Open Connection
pLdapConnection = ldap_init(hostName, LDAP_PORT);
//Setting Connection Parm's
ldap_set_option(pLdapConnection, LDAP_OPT_PROTOCOL_VERSION, (void*)&version);
ldap_connect(pLdapConnection, NULL);
returnCode = ldap_bind_s(pLdapConnection, pMyDN, NULL, LDAP_AUTH_NEGOTIATE);
if(returnCode == LDAP_SUCCESS)
{
ui->InputA->setText("Connection sucessfull");
}
else
{
ui->InputA->setText("Connection unsucessfull");
}
//Variables for Search Results
LDAPMessage* pSearchResult;
PWCHAR pMyFilter = NULL;
char *pMyFilter_2 = "(&(objectCategory=person)(objectClass=user))";
QString Test7 = QString::fromAscii(pMyFilter_2);
pMyFilter = (WCHAR*)(Test7.utf16());
PWCHAR pMyAttributes[6];
ULONG errorCode = LDAP_SUCCESS;
pMyAttributes[0] = (WCHAR*)QString("cn").utf16();
pMyAttributes[1] = (WCHAR*)QString("company").utf16();
pMyAttributes[2] = (WCHAR*)QString("department").utf16();
pMyAttributes[3] = (WCHAR*)QString("telephoneNumber").utf16();
pMyAttributes[4] = (WCHAR*)QString("memberOf").utf16();
pMyAttributes[5] = NULL;
errorCode = ldap_search_s(
pLdapConnection, // Session handle
pMyDN, // DN to start search
LDAP_SCOPE_SUBTREE, // Scope
pMyFilter, // Filter
pMyAttributes, // Retrieve list of attributes
0, // Get both attributes and values
&pSearchResult); // [out] Search results
if (errorCode != LDAP_SUCCESS)
{
ui->InputB->setText("ldap_search_s failed with");
ldap_unbind_s(pLdapConnection);
if(pSearchResult != NULL)
ldap_msgfree(pSearchResult);
}
else
ui->InputB->setText("ldap_search succeeded \n");
//here i like to receive the user's full name
//Closing Connection
ldap_unbind(pLdapConnection);
ui->Test_Ausgabe -> setText(name);
}
似乎您正在請求cn
或commonName
,有時該屬性的值是全名。 如果不是,請嘗試將givenName
和sn
添加到請求的屬性列表中。 givenName
是名字sn
是surname
或名字。
只是其他一些問題。 在下面,您會看到獲得我需要的東西的線。 這聽起來有點愚蠢,但是當我運行代碼時,pMyAttributes [0]中的Attributes將永遠不會顯示。 我不在乎,因為我不需要此信息,但似乎它是正確的。 我有點害怕我以后會得到錯誤的信息,而我的程序也會得到錯誤的信息。
使用“ PWCHAR pMyAttributes [4];”的設置過濾器 什么都不顯示
但是將過濾器設置為“ PWCHAR pMyAttributes [5];” 這樣,我得到了我想要的一切。 有人可以解釋一下嗎?
PWCHAR pMyAttributes[4];
ULONG errorCode = LDAP_SUCCESS;
pMyAttributes[0] = (WCHAR*)QString("sn").utf16();
pMyAttributes[1] = (WCHAR*)QString("mailNickname").utf16();
pMyAttributes[2] = (WCHAR*)QString("cn").utf16();
pMyAttributes[3] = NULL;
顯示用戶的代碼:
// Get the number of entries returned.
ULONG numberOfEntries;
numberOfEntries = ldap_count_entries(
pLdapConnection, // Session handle
pSearchResult); // Search result
/*if(numberOfEntries == NULL)
{
qDebug("ldap_count_entries failed with 0x%0lx \n",errorCode);
ldap_unbind_s(pLdapConnection);
if(pSearchResult != NULL)
ldap_msgfree(pSearchResult);
}
else
qDebug("ldap_count_entries succeeded \n");
*/
qDebug("The number of entries is: %d \n", numberOfEntries);
//----------------------------------------------------------
// Loop through the search entries, get, and output the
// requested list of attributes and values.
//----------------------------------------------------------
LDAPMessage* pEntry = NULL;
PWCHAR pEntryDN = NULL;
ULONG iCnt = 0;
char* sMsg;
BerElement* pBer = NULL;
PWCHAR pAttribute = NULL;
PWCHAR* ppValue = NULL;
ULONG iValue = 0;
for( iCnt=0; iCnt < numberOfEntries; iCnt++ )
{
// Get the first/next entry.
if( !iCnt )
pEntry = ldap_first_entry(pLdapConnection, pSearchResult);
else
pEntry = ldap_next_entry(pLdapConnection, pEntry);
// Output the entry number.
qDebug("ENTRY NUMBER %i \n", iCnt);
// Get the first attribute name.
pAttribute = ldap_first_attribute(
pLdapConnection, // Session handle
pEntry, // Current entry
&pBer); // [out] Current BerElement
// Output the attribute names for the current object
// and output values.
while(pAttribute != NULL)
{
// Output the attribute name.
QString abc = QString::fromWCharArray(pAttribute);
qDebug() << "abc" << abc;
// Get the string values.
ppValue = ldap_get_values(
pLdapConnection, // Session Handle
pEntry, // Current entry
pAttribute); // Current attribute
// Print status if no values are returned (NULL ptr)
if(ppValue == NULL)
{
qDebug(": [NO ATTRIBUTE VALUE RETURNED]");
}
// Output the attribute values
else
{
iValue = ldap_count_values(ppValue);
if(!iValue)
{
qDebug(": [BAD VALUE LIST]");
}
else
{
// Output the first attribute value
QString abc2 = QString::fromWCharArray(*ppValue);
qDebug()<< "abc2" << abc2;
qDebug()<< "iValue" << iValue;
// Output more values if available
ULONG z;
for(z=1; z<iValue; z++)
{
QString abc3 = QString::fromWCharArray(ppValue[z]);
qDebug() << "abc3" << abc3;
}
}
}
// Free memory.
if(ppValue != NULL)
ldap_value_free(ppValue);
ppValue = NULL;
ldap_memfree(pAttribute);
// Get next attribute name.
pAttribute = ldap_next_attribute(
pLdapConnection, // Session Handle
pEntry, // Current entry
pBer); // Current BerElement
qDebug("\n");
}
if( pBer != NULL )
ber_free(pBer,0);
pBer = NULL;
}
//Closing Connection
ldap_unbind(pLdapConnection);
ui->Test_Ausgabe -> setText(name);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.