Y
Yulia
Hi all,
Please, help me to solve the next problem.
I use the following C++ code to get users that are members of a
specific group and that are located
under the specified Organization Unit (a.k.a. Search Base).
This code works properly at one Active Directory, but fails at another
Active Directory:
I get 80005008 (=E_ADS_BAD_PARAMETER) in GetFirstRow.
Comment: I know that this problematic AD is mostly overloaded, so I
specified 0 for ADS_SEARCHPREF_TIME_LIMIT.
Thanks in advance for your help!
Yulia
//------------------------------------The code:-----------------
HRESULT hr;
CComPtr<IDirectorySearch> pDSearch;
WCHAR *sADsPath = NULL;
//LDAP filter
nly users that are members of envtGroupDN:
WCHAR* sFilter = "(&(objectCategory=person)(memberOf=envtGroupDN));
//attribute description list:users' logon name in NT (may be
userPrincipalName in AD)
WCHAR* arAttributes[] = {"sAMAccountName"};
ADS_SEARCH_HANDLE hSearch;
ADS_SEARCH_COLUMN hSClmnLogin;
//sADsPath is the path of search base: "LDAP://OU=..."
hr = ADsGetObject(sADsPath,IID_IDirectorySearch,(void**)&pDSearch);
if (FAILED(hr))
{
fwprintf(LOG,L"ADsGetObject() error : %x\n", hr);
...
}
//search preference values are defined in ADS_SEARCHPREF_ENUM
ADS_SEARCHPREF_INFO arSearchPref[3];
//set search scope
arSearchPref[0].dwSearchPref = ADS_SEARCHPREF_SEARCH_SCOPE;
arSearchPref[0].vValue.dwType = ADSTYPE_INTEGER;
arSearchPref[0].vValue.Integer = ADS_SCOPE_SUBTREE;
//set referral chasing option
arSearchPref[1].dwSearchPref = ADS_SEARCHPREF_CHASE_REFERRALS;
arSearchPref[1].vValue.dwType = ADSTYPE_INTEGER;
arSearchPref[1].vValue.Integer = ADS_CHASE_REFERRALS_ALWAYS;
//set referral timeout option
arSearchPref[2].dwSearchPref = ADS_SEARCHPREF_TIME_LIMIT;
arSearchPref[2].vValue.dwType = ADSTYPE_INTEGER;
arSearchPref[2].vValue.Integer = 0;
hr = pDSearch->SetSearchPreference(arSearchPref,
sizeof(arSearchPref)/sizeof(ADS_SEARCHPREF_INFO));
if(FAILED(hr))
{
fwprintf(LOG,L"***Failed to set search preferences, error: %x\n",
hr);
...
}
wchar_t* logonName = NULL;
//start search
hr = pDSearch->ExecuteSearch(sFilter,arAttributes,
sizeof(arAttributes)/sizeof(WCHAR*),&hSearch);
if (SUCCEEDED(hr))
{ //begin processing the result
hr = pDSearch->GetFirstRow(hSearch);
//check for errors:
if(FAILED(hr))
{
fwprintf(LOG,L"***Failed in GetFirstRow, error: %x\n", hr);
...
}
while(hr != S_ADS_NOMORE_ROWS)
{
hr = pDSearch->GetColumn(hSearch,arAttributes[0],&hSClmnLogin);
if (SUCCEEDED(hr))
{
logonName = hSClmnLogin.pADsValues->CaseIgnoreString;
...
pDSearch->FreeColumn(&hSClmnLogin);
}
else
{
fwprintf(LOG,L"***Failed in GetColumn, error: %x\n", hr);
...
pDSearch->FreeColumn(&hSClmnLogin);
pDSearch->CloseSearchHandle(hSearch);
}
hr = pDSearch->GetNextRow(hSearch);
//check for errors:
if(FAILED(hr))
{
fwprintf(LOG,L"***Failed in GetNextRow: %x\n", hr);
...
}
}
pDSearch->CloseSearchHandle(hSearch);
}
Please, help me to solve the next problem.
I use the following C++ code to get users that are members of a
specific group and that are located
under the specified Organization Unit (a.k.a. Search Base).
This code works properly at one Active Directory, but fails at another
Active Directory:
I get 80005008 (=E_ADS_BAD_PARAMETER) in GetFirstRow.
Comment: I know that this problematic AD is mostly overloaded, so I
specified 0 for ADS_SEARCHPREF_TIME_LIMIT.
Thanks in advance for your help!
Yulia
//------------------------------------The code:-----------------
HRESULT hr;
CComPtr<IDirectorySearch> pDSearch;
WCHAR *sADsPath = NULL;
//LDAP filter

WCHAR* sFilter = "(&(objectCategory=person)(memberOf=envtGroupDN));
//attribute description list:users' logon name in NT (may be
userPrincipalName in AD)
WCHAR* arAttributes[] = {"sAMAccountName"};
ADS_SEARCH_HANDLE hSearch;
ADS_SEARCH_COLUMN hSClmnLogin;
//sADsPath is the path of search base: "LDAP://OU=..."
hr = ADsGetObject(sADsPath,IID_IDirectorySearch,(void**)&pDSearch);
if (FAILED(hr))
{
fwprintf(LOG,L"ADsGetObject() error : %x\n", hr);
...
}
//search preference values are defined in ADS_SEARCHPREF_ENUM
ADS_SEARCHPREF_INFO arSearchPref[3];
//set search scope
arSearchPref[0].dwSearchPref = ADS_SEARCHPREF_SEARCH_SCOPE;
arSearchPref[0].vValue.dwType = ADSTYPE_INTEGER;
arSearchPref[0].vValue.Integer = ADS_SCOPE_SUBTREE;
//set referral chasing option
arSearchPref[1].dwSearchPref = ADS_SEARCHPREF_CHASE_REFERRALS;
arSearchPref[1].vValue.dwType = ADSTYPE_INTEGER;
arSearchPref[1].vValue.Integer = ADS_CHASE_REFERRALS_ALWAYS;
//set referral timeout option
arSearchPref[2].dwSearchPref = ADS_SEARCHPREF_TIME_LIMIT;
arSearchPref[2].vValue.dwType = ADSTYPE_INTEGER;
arSearchPref[2].vValue.Integer = 0;
hr = pDSearch->SetSearchPreference(arSearchPref,
sizeof(arSearchPref)/sizeof(ADS_SEARCHPREF_INFO));
if(FAILED(hr))
{
fwprintf(LOG,L"***Failed to set search preferences, error: %x\n",
hr);
...
}
wchar_t* logonName = NULL;
//start search
hr = pDSearch->ExecuteSearch(sFilter,arAttributes,
sizeof(arAttributes)/sizeof(WCHAR*),&hSearch);
if (SUCCEEDED(hr))
{ //begin processing the result
hr = pDSearch->GetFirstRow(hSearch);
//check for errors:
if(FAILED(hr))
{
fwprintf(LOG,L"***Failed in GetFirstRow, error: %x\n", hr);
...
}
while(hr != S_ADS_NOMORE_ROWS)
{
hr = pDSearch->GetColumn(hSearch,arAttributes[0],&hSClmnLogin);
if (SUCCEEDED(hr))
{
logonName = hSClmnLogin.pADsValues->CaseIgnoreString;
...
pDSearch->FreeColumn(&hSClmnLogin);
}
else
{
fwprintf(LOG,L"***Failed in GetColumn, error: %x\n", hr);
...
pDSearch->FreeColumn(&hSClmnLogin);
pDSearch->CloseSearchHandle(hSearch);
}
hr = pDSearch->GetNextRow(hSearch);
//check for errors:
if(FAILED(hr))
{
fwprintf(LOG,L"***Failed in GetNextRow: %x\n", hr);
...
}
}
pDSearch->CloseSearchHandle(hSearch);
}