I'm writing a little Application at my Office. In this Application i have to get the full UserName. It's written in Qt / C++
I like to get this Information over LDAP. Now i can connect to our Active Directory Server and can connect to the Search function.
This information is from an example written by Microsoft.
But at this Point the Example confuses me. I Don't get it how i can give this Server an Username and receive the Full Name.
Link to the Microsoft example: http://msdn.microsoft.com/en-us/library/windows/desktop/aa367016(v=vs.85).aspx
Can someone give me an Advice how i can get this Information?
Thanks and With best regards Chris ;)
PS Sorry for the bad English. PSS and if i missed Something or you need more Information just say it.
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);
}
It appears that you are requesting the cn
or commonName
, sometimes the value of that attribute is the full name. If it is not, try adding givenName
and sn
to the list of requested attributes. givenName
is the first name sn
is the surname
or last name.
Just a little other Question. Below you see the Lines which get the things i Need. It sounds a little Stupid but when i run the code the Attributes which are in pMyAttributes[0], will never be Displayed. I don't care because i don't need this Information but it don's seems like it is Right. I'm a little Scared that i will get later wrong Information and my Programm will get Error's.
Settings Filters With "PWCHAR pMyAttributes[4];" will Display nothing
But Setting Filter "PWCHAR pMyAttributes[5];" like that and i get Everything i wanted. Can someone Explain this ?
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;
Code for Displaying the user's:
// 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);
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.