LDAP获取完整用户名C ++

时间:2012-08-15 10:24:35

标签: c++ qt qt4 ldap ldap-query

我正在办公室写一个小应用程序。 在此应用程序中,我必须获得完整的UserName。 它是用Qt / C ++编写的

我想通过LDAP获取此信息。 现在我可以连接到我们的Active Directory服务器并可以连接到搜索功能。

此信息来自Microsoft编写的示例。

但是在这一点上,例子让我感到困惑。 我不知道如何为此服务器提供用户名并获得全名。

链接到Microsoft示例:http://msdn.microsoft.com/en-us/library/windows/desktop/aa367016(v=vs.85).aspx

有人可以告诉我如何获取此信息吗?

谢谢,并致以最诚挚的问候 克里斯;)

P.S。对不起英语不好。 P.S.S如果我错过了某些东西,或者你需要更多信息,只需说出来。

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);
}

2 个答案:

答案 0 :(得分:0)

您似乎在申请cncommonName,有时该属性的值是全名。如果不是,请尝试将givenNamesn添加到请求的属性列表中。 givenName是名字snsurname或姓氏。

答案 1 :(得分:0)

还有一点其他问题。 下面你会看到获得我需要的东西的线条。 这听起来有点愚蠢,但是当我运行代码时,pMyAttributes [0]中的属性将永远不会显示。 我不在乎,因为我不需要这些信息,但它似乎是对的。 我有点害怕我以后会得到错误信息和我的程序会得到错误。

使用“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);
}