//---------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1996 - 2000. // // File: drt.cxx // // Contents: Main for DS Srch // // // //---------------------------------------------------------------------------- // // System Includes // #define INC_OLE2 #include // // CRunTime Includes // #include #include #include #include // // Public OleDs includes // // // Private defines // #define BAIL_ON_NULL(p) \ if (!(p)) { \ goto error; \ } #define BAIL_ON_FAILURE(hr) \ if (FAILED(hr)) { \ goto error; \ } #include "activeds.h" #include "main.hxx" // // Globals representing the parameters // LPWSTR pszSearchBase, pszSearchFilter, pszAttrNames[10], pszAttrList; DWORD dwNumberAttributes = -1, dwMaxRows = (DWORD) -1; // // Preferences // BOOL fASynchronous=FALSE, fDerefAliases=FALSE, fAttrsOnly=FALSE; DWORD fSizeLimit, fTimeLimit, dwTimeOut, dwPageSize, dwSearchScope; ADS_SEARCHPREF_INFO pSearchPref[10]; ADS_SORTKEY pSortKey[10]; DWORD nSortKeys = 0; DWORD dwCurrPref = 0; LPWSTR pszUserName=NULL, pszPassword=NULL; DWORD dwAuthFlags=0; DWORD cErr=0; char *prefNameLookup[] = { "ADS_SEARCHPREF_ASYNCHRONOUS", "ADS_SEARCHPREF_DEREF_ALIASES", "ADS_SEARCHPREF_SIZE_LIMIT", "ADS_SEARCHPREF_TIME_LIMIT", "ADS_SEARCHPREF_ATTRIBTYPES_ONLY", "ADS_SEARCHPREF_SEARCH_SCOPE", "ADS_SEARCHPREF_TIMEOUT", "ADS_SEARCHPREF_PAGESIZE", "ADS_SEARCHPREF_PAGED_TIME_LIMIT", "ADS_SEARCHPREF_CHASE_REFERRALS" "ADS_SEARCHPREF_CACHE_RESULTS" }; //+--------------------------------------------------------------------------- // // Function: main // // Synopsis: // //---------------------------------------------------------------------------- INT main(int argc, char * argv[]) { HRESULT hr=S_OK; IDirectorySearch *pDSSearch=NULL; ADS_SEARCH_HANDLE hSearchHandle=NULL; ADS_SEARCH_COLUMN Column; DWORD nRows = 0, i; LPWSTR pszColumnName = NULL; const int buffSize = 256; #if 0 // Enable if you want to test binary values in filters and send // pszBinaryFilter instead of pszSearchFilter in ExecuteSearch WCHAR pszBinaryFilter[buffSize] = L"objectSid="; LPWSTR pszDest = NULL; BYTE column[100] = { 0x01, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x15, 0x00, 0x00, 0x00, 0x59, 0x51, 0xb8, 0x17, 0x66, 0x72, 0x5d, 0x25, 0x64, 0x63, 0x3b, 0x0b, 0x29, 0x99, 0x21, 0x00 }; hr = ADsEncodeBinaryData ( column, 28, &pszDest ); wcsncat_s( pszBinaryFilter, buffSize, pszDest ,wcslen(pszDest) ); FreeADsMem( pszDest ); #endif // // Sets the global variables with the parameters // hr = ProcessArgs(argc, argv); BAIL_ON_FAILURE(hr); hr = CoInitialize(NULL); if (FAILED(hr)) { printf("CoInitialize failed\n") ; return(1) ; } hr = ADsOpenObject( pszSearchBase, pszUserName, pszPassword, dwAuthFlags, IID_IDirectorySearch, (void **)&pDSSearch ); if(pszUserName) ZeroMemory((PVOID)pszUserName,wcslen(pszUserName)*sizeof(WCHAR)); if(pszPassword) ZeroMemory((PVOID)pszPassword,wcslen(pszPassword)*sizeof(WCHAR)); #if 0 // If you want to go with the default credentials hr = ADsGetObject( pszSearchBase, IID_IDirectorySearch, (void **)&pDSSearch ); #endif BAIL_ON_FAILURE(hr); if (dwCurrPref) { hr = pDSSearch->SetSearchPreference( pSearchPref, dwCurrPref ); BAIL_ON_FAILURE(hr); if (hr != S_OK) { for (i=0; iExecuteSearch( pszSearchFilter, pszAttrNames, dwNumberAttributes, &hSearchHandle ); BAIL_ON_FAILURE(hr); hr = pDSSearch->GetNextRow( hSearchHandle ); BAIL_ON_FAILURE(hr); while (hr != S_ADS_NOMORE_ROWS && nRows < dwMaxRows) { nRows++; if (dwNumberAttributes == -1) { hr = pDSSearch->GetNextColumnName( hSearchHandle, &pszColumnName ); BAIL_ON_FAILURE(hr); while (hr != S_ADS_NOMORE_COLUMNS) { hr = pDSSearch->GetColumn( hSearchHandle, pszColumnName, &Column ); if (FAILED(hr) && hr != E_ADS_COLUMN_NOT_SET) goto error; if (SUCCEEDED(hr)) { PrintColumn(&Column, pszColumnName); pDSSearch->FreeColumn(&Column); } FreeADsMem(pszColumnName); hr = pDSSearch->GetNextColumnName( hSearchHandle, &pszColumnName ); BAIL_ON_FAILURE(hr); } printf("\n"); } else { for ( i=0; iGetColumn( hSearchHandle, pszAttrNames[i], &Column ); if (hr == E_ADS_COLUMN_NOT_SET) continue; BAIL_ON_FAILURE(hr); PrintColumn(&Column, pszAttrNames[i]); pDSSearch->FreeColumn(&Column); } printf("\n"); } hr = pDSSearch->GetNextRow( hSearchHandle ); BAIL_ON_FAILURE(hr); } wprintf (L"Total Rows: %d\n", nRows); if (cErr) { wprintf (L"%d warning(s) ignored", cErr); } if (hSearchHandle) pDSSearch->CloseSearchHandle(hSearchHandle); FREE_INTERFACE(pDSSearch); FREE_UNICODE_STRING(pszSearchBase) ; FREE_UNICODE_STRING(pszSearchFilter) ; FREE_UNICODE_STRING(pszAttrList) ; FREE_UNICODE_STRING(pszUserName) ; FREE_UNICODE_STRING(pszPassword) ; for(i=0;iCloseSearchHandle(hSearchHandle); FREE_INTERFACE(pDSSearch); FREE_UNICODE_STRING(pszSearchBase) ; FREE_UNICODE_STRING(pszSearchFilter) ; FREE_UNICODE_STRING(pszAttrList) ; FREE_UNICODE_STRING(pszUserName) ; FREE_UNICODE_STRING(pszPassword) ; for(i=0;i= 10) { BAIL_ON_FAILURE(E_FAIL); } pSearchPref[dwCurrPref].vValue.ProviderSpecific.dwLength = sizeof(ADS_SORTKEY) * nAttr; pSearchPref[dwCurrPref].vValue.ProviderSpecific.lpValue = (LPBYTE) pSortKey; } else if (!_stricmp(pszCurrPref, "cacheResults")) { pSearchPref[dwCurrPref].dwSearchPref = ADS_SEARCHPREF_CACHE_RESULTS; pSearchPref[dwCurrPref].vValue.dwType = ADSTYPE_BOOLEAN; if (!_stricmp(pszCurrPrefValue, "yes" )) pSearchPref[dwCurrPref].vValue.Boolean = TRUE; else if (!_stricmp(pszCurrPrefValue, "no" )) pSearchPref[dwCurrPref].vValue.Boolean = FALSE; else BAIL_ON_FAILURE(E_FAIL); } else BAIL_ON_FAILURE(E_FAIL); dwCurrPref++; break; case 'n': argc--; currArg++; if (argc <= 0) BAIL_ON_FAILURE (E_FAIL); dwMaxRows = atoi(argv[currArg]); break; default: BAIL_ON_FAILURE(E_FAIL); } argc--; currArg++; } // // Check for Mandatory arguments; // if (!pszSearchBase || !pszSearchFilter) BAIL_ON_FAILURE(E_FAIL); if (dwNumberAttributes == 0) { // // Get all the attributes // dwNumberAttributes = -1; } return (S_OK); error: PrintUsage(); return E_FAIL; } LPWSTR RemoveWhiteSpaces( LPWSTR pszText) { LPWSTR pChar; if(!pszText) return (pszText); while(*pszText && iswspace(*pszText)) pszText++; for(pChar = pszText + wcslen(pszText) - 1; pChar >= pszText; pChar--) { if(!iswspace(*pChar)) break; else *pChar = L'\0'; } return pszText; }