【问题标题】:LDAP Getting Full user Name C++LDAP 获取完整的用户名 C++
【发布时间】:2012-08-15 10:24:34
【问题描述】:

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

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

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

但是在这一点上,示例使我感到困惑。 我不明白如何给这个服务器一个用户名并接收全名。

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

谁能给我一个建议,我怎样才能得到这些信息?

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

附:对不起英语不好。 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);
}

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 现在我遇到了一些错误。我得到了用户的全名。只需使用“cn”,然后 qDebug 就会向我显示用户的全名。现在我只需要在 Windows 下过滤用户名(并从 AD 获取)。然后我迈出了一大步谢谢@Terry Gardner
    【解决方案2】:

    还有一点其他问题。 下面你会看到得到我需要的东西的线条。 这听起来有点愚蠢,但是当我运行代码时,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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-06
      • 2020-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多