簡體   English   中英

LDAP獲取完整的用戶名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);
}

似乎您正在請求cncommonName ,有時該屬性的值是全名。 如果不是,請嘗試將givenNamesn添加到請求的屬性列表中。 givenName是名字snsurname或名字。

只是其他一些問題。 在下面,您會看到獲得我需要的東西的線。 這聽起來有點愚蠢,但是當我運行代碼時,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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM