You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
94 lines
3.5 KiB
94 lines
3.5 KiB
|
|
#include "stdafx.h"
|
|
#include "qrythrd.h"
|
|
|
|
|
|
HRESULT
|
|
IssueQuery(LPTHREADDATA ptd)
|
|
{
|
|
HRESULT hres;
|
|
DWORD dwres;
|
|
LPTHREADINITDATA ptid = ptd->ptid;
|
|
LPWSTR pQuery = NULL;
|
|
INT cItems, iColumn;
|
|
INT cMaxResult = MAX_RESULT;
|
|
BOOL fStopQuery = FALSE;
|
|
IDirectorySearch* pDsSearch = NULL;
|
|
LPWSTR pszTempPath = NULL;
|
|
IDsDisplaySpecifier *pdds = NULL;
|
|
ADS_SEARCH_HANDLE hSearch = NULL;
|
|
ADS_SEARCHPREF_INFO prefInfo[3];
|
|
ADS_SEARCH_COLUMN column;
|
|
HDPA hdpaResults = NULL;
|
|
LPQUERYRESULT pResult = NULL;
|
|
WCHAR szBuffer[2048]; // MAX_URL_LENGHT
|
|
INT resid;
|
|
LPWSTR pColumnData = NULL;
|
|
HKEY hkPolicy = NULL;
|
|
USES_CONVERSION;
|
|
|
|
TraceEnter(TRACE_QUERYTHREAD, "QueryThread_IssueQuery");
|
|
|
|
// The foreground gave us a query so we are going to go and issue
|
|
// it now, having done this we will then be able to stream the
|
|
// result blobs back to the caller.
|
|
|
|
hres = QueryThread_GetFilter(&pQuery, ptid->pQuery, ptid->fShowHidden);
|
|
FailGracefully(hres, "Failed to build LDAP query from scope, parameters + filter");
|
|
|
|
Trace(TEXT("Query is: %s"), W2T(pQuery));
|
|
Trace(TEXT("Scope is: %s"), W2T(ptid->pScope));
|
|
|
|
// Get the IDsDisplaySpecifier interface:
|
|
|
|
hres = CoCreateInstance(CLSID_DsDisplaySpecifier, NULL, CLSCTX_INPROC_SERVER, IID_IDsDisplaySpecifier, (void **)&pdds);
|
|
FailGracefully(hres, "Failed to get the IDsDisplaySpecifier object");
|
|
|
|
hres = pdds->SetServer(ptid->pServer, ptid->pUserName, ptid->pPassword, DSSSF_DSAVAILABLE);
|
|
FailGracefully(hres, "Failed to server information");
|
|
|
|
// initialize the query engine, specifying the scope, and the search parameters
|
|
|
|
hres = QueryThread_BuildPropertyList(ptd);
|
|
FailGracefully(hres, "Failed to build property array to query for");
|
|
|
|
hres = ADsOpenObject(ptid->pScope, ptid->pUserName, ptid->pPassword, ADS_SECURE_AUTHENTICATION,
|
|
IID_IDirectorySearch, (LPVOID*)&pDsSearch);
|
|
|
|
FailGracefully(hres, "Failed to get the IDirectorySearch interface for the given scope");
|
|
|
|
prefInfo[0].dwSearchPref = ADS_SEARCHPREF_SEARCH_SCOPE; // sub-tree search
|
|
prefInfo[0].vValue.dwType = ADSTYPE_INTEGER;
|
|
prefInfo[0].vValue.Integer = ADS_SCOPE_SUBTREE;
|
|
|
|
prefInfo[1].dwSearchPref = ADS_SEARCHPREF_ASYNCHRONOUS; // async
|
|
prefInfo[1].vValue.dwType = ADSTYPE_BOOLEAN;
|
|
prefInfo[1].vValue.Boolean = TRUE;
|
|
|
|
prefInfo[2].dwSearchPref = ADS_SEARCHPREF_PAGESIZE; // paged results
|
|
prefInfo[2].vValue.dwType = ADSTYPE_INTEGER;
|
|
prefInfo[2].vValue.Integer = PAGE_SIZE;
|
|
|
|
hres = pDsSearch->SetSearchPreference(prefInfo, ARRAYSIZE(prefInfo));
|
|
FailGracefully(hres, "Failed to set search preferences");
|
|
|
|
hres = pDsSearch->ExecuteSearch(pQuery, ptd->aProperties, ptd->cProperties, &hSearch);
|
|
FailGracefully(hres, "Failed in ExecuteSearch");
|
|
|
|
// pick up the policy value which defines the max results we are going to use
|
|
|
|
dwres = RegOpenKey(HKEY_CURRENT_USER, DS_POLICY, &hkPolicy);
|
|
if ( ERROR_SUCCESS == dwres )
|
|
{
|
|
DWORD dwType, cbSize;
|
|
|
|
dwres = RegQueryValueEx(hkPolicy, TEXT("QueryLimit"), NULL, &dwType, NULL, &cbSize);
|
|
if ( (ERROR_SUCCESS == dwres) && (dwType == REG_DWORD) && (cbSize == SIZEOF(cMaxResult)) )
|
|
{
|
|
RegQueryValueEx(hkPolicy, TEXT("QueryLimit"), NULL, NULL, (LPBYTE)&cMaxResult, &cbSize);
|
|
}
|
|
|
|
RegCloseKey(hkPolicy);
|
|
}
|
|
|
|
|