HRESULT Test() { HRESULT hr = S_OK; IDirectorySearch *pDirectorySearch = NULL; CoInitialize(NULL); do { //hr = GetGC(&pDirectorySearch); hr = EnumAllObject(L"GC:", 0); } while (0); if (pDirectorySearch != NULL) { pDirectorySearch->Release(); pDirectorySearch = NULL; } CoUninitialize(); getchar(); return hr; }
static int smpd_build_spn_list() { HRESULT hr; IDirectoryObject *pSCP = NULL; ADS_ATTR_INFO *pPropEntries = NULL; IDirectorySearch *pSearch = NULL; ADS_SEARCH_HANDLE hSearch = NULL; LPWSTR pszDN; /* distinguished name of SCP. */ LPWSTR pszServiceDNSName; /* service DNS name. */ LPWSTR pszClass; /* name of service class. */ USHORT usPort; /* service port. */ WCHAR pszSearchString[SMPD_MAX_NAME_LENGTH]; char temp_str[SMPD_MAX_NAME_LENGTH]; char temp_str2[SMPD_MAX_NAME_LENGTH]; smpd_host_spn_node_t *iter; /* double t1, t2; */ static int initialized = 0; if (initialized) { return SMPD_SUCCESS; } initialized = 1; /* t1 = PMPI_Wtime(); */ CoInitialize(NULL); /* Get an IDirectorySearch pointer for the Global Catalog. */ hr = GetGCSearch(&pSearch); if (FAILED(hr) || pSearch == NULL) { smpd_err_printf("GetGC failed 0x%x\n", hr); goto Cleanup; } /* Set up a deep search. Thousands of objects are not expected in this example, therefore query for 1000 rows per page.*/ ADS_SEARCHPREF_INFO SearchPref[2]; DWORD dwPref = sizeof(SearchPref)/sizeof(ADS_SEARCHPREF_INFO); SearchPref[0].dwSearchPref = ADS_SEARCHPREF_SEARCH_SCOPE; SearchPref[0].vValue.dwType = ADSTYPE_INTEGER; SearchPref[0].vValue.Integer = ADS_SCOPE_SUBTREE; SearchPref[1].dwSearchPref = ADS_SEARCHPREF_PAGESIZE; SearchPref[1].vValue.dwType = ADSTYPE_INTEGER; SearchPref[1].vValue.Integer = 1000; hr = pSearch->SetSearchPreference(SearchPref, dwPref); if (FAILED(hr)) { smpd_err_printf("Failed to set search prefs: hr:0x%x\n", hr); goto Cleanup; } /* Execute the search. From the GC get the distinguished name of the SCP. Use the DN to bind to the SCP and get the other properties. */ LPWSTR rgszDN[] = {L"distinguishedName"}; /* Search for a match of the product GUID. */ swprintf(pszSearchString, L"keywords=%s", SMPD_SERVICE_VENDOR_GUIDW); hr = pSearch->ExecuteSearch(pszSearchString, rgszDN, 1, &hSearch); /*hr = pSearch->ExecuteSearch(L"keywords=5722fe5f-cf46-4594-af7c-0997ca2e9d72", rgszDN, 1, &hSearch);*/ if (FAILED(hr)) { smpd_err_printf("ExecuteSearch failed: hr:0x%x\n", hr); goto Cleanup; } /* Loop through the results. Each row should be an instance of the service identified by the product GUID. Add logic to select from multiple service instances. */ while (SUCCEEDED(hr = pSearch->GetNextRow(hSearch))) { if (hr == S_ADS_NOMORE_ROWS) { DWORD dwError = ERROR_SUCCESS; WCHAR szError[512]; WCHAR szProvider[512]; ADsGetLastError(&dwError, szError, 512, szProvider, 512); if (ERROR_MORE_DATA == dwError) { continue; } goto Cleanup; } ADS_SEARCH_COLUMN Col; hr = pSearch->GetColumn(hSearch, L"distinguishedName", &Col); pszDN = AllocADsStr(Col.pADsValues->CaseIgnoreString); pSearch->FreeColumn(&Col); /* Bind to the DN to get the other properties. */ LPWSTR lpszLDAPPrefix = L"LDAP://"; DWORD dwSCPPathLength = (DWORD)(wcslen(lpszLDAPPrefix) + wcslen(pszDN) + 1); LPWSTR pwszSCPPath = (LPWSTR)malloc(sizeof(WCHAR) * dwSCPPathLength); if (pwszSCPPath) { wcscpy(pwszSCPPath, lpszLDAPPrefix); wcscat(pwszSCPPath, pszDN); } else { smpd_err_printf("Failed to allocate a buffer\n"); goto Cleanup; } /*wprintf(L"pszDN = %s\n", pszDN);*/ /*FreeADsStr(pszDN);*/ hr = ADsGetObject(pwszSCPPath, IID_IDirectoryObject, (void**)&pSCP); free(pwszSCPPath); if (SUCCEEDED(hr)) { /* Properties to retrieve from the SCP object. */ LPWSTR rgszAttribs[]= { {L"serviceClassName"}, {L"serviceDNSName"}, /*{L"serviceDNSNameType"},*/ {L"serviceBindingInformation"} }; DWORD dwAttrs = sizeof(rgszAttribs)/sizeof(LPWSTR); DWORD dwNumAttrGot; hr = pSCP->GetObjectAttributes(rgszAttribs, dwAttrs, &pPropEntries, &dwNumAttrGot); if (FAILED(hr)) { smpd_err_printf("GetObjectAttributes Failed. hr:0x%x\n", hr); goto Cleanup; } pszServiceDNSName = NULL; pszClass = NULL; iter = (smpd_host_spn_node_t*)malloc(sizeof(smpd_host_spn_node_t)); if (iter == NULL) { smpd_err_printf("Unable to allocate memory to store an SPN entry.\n"); goto Cleanup; } iter->next = NULL; iter->host[0] = '\0'; iter->spn[0] = '\0'; iter->dnshost[0] = '\0'; /* Loop through the entries returned by GetObjectAttributes and save the values in the appropriate buffers. */ for (int i = 0; i < (LONG)dwAttrs; i++) { if ((wcscmp(L"serviceDNSName", pPropEntries[i].pszAttrName) == 0) && (pPropEntries[i].dwADsType == ADSTYPE_CASE_IGNORE_STRING)) { pszServiceDNSName = AllocADsStr(pPropEntries[i].pADsValues->CaseIgnoreString); /*wprintf(L"pszServiceDNSName = %s\n", pszServiceDNSName);*/ } /* if ((wcscmp(L"serviceDNSNameType", pPropEntries[i].pszAttrName) == 0) && (pPropEntries[i].dwADsType == ADSTYPE_CASE_IGNORE_STRING)) { pszServiceDNSNameType = AllocADsStr(pPropEntries[i].pADsValues->CaseIgnoreString); wprintf(L"pszServiceDNSNameType = %s\n", pszServiceDNSNameType); } */ if ((wcscmp(L"serviceClassName", pPropEntries[i].pszAttrName) == 0) && (pPropEntries[i].dwADsType == ADSTYPE_CASE_IGNORE_STRING)) { pszClass = AllocADsStr(pPropEntries[i].pADsValues->CaseIgnoreString); /*wprintf(L"pszClass = %s\n", pszClass);*/ } if ((wcscmp(L"serviceBindingInformation", pPropEntries[i].pszAttrName) == 0) && (pPropEntries[i].dwADsType == ADSTYPE_CASE_IGNORE_STRING)) { usPort=(USHORT)_wtoi(pPropEntries[i].pADsValues->CaseIgnoreString); /*wprintf(L"usPort = %d\n", usPort);*/ } } wcstombs(iter->dnshost, pszServiceDNSName, SMPD_MAX_NAME_LENGTH); wcstombs(temp_str, pszClass, SMPD_MAX_NAME_LENGTH); /*MPIU_Snprintf(iter->spn, SMPD_MAX_NAME_LENGTH, "%s/%s:%d", temp_str, iter->dnshost, usPort);*/ wcstombs(temp_str2, pszDN, SMPD_MAX_NAME_LENGTH); MPIU_Snprintf(iter->spn, SMPD_MAX_NAME_LENGTH, "%s/%s/%s", temp_str, iter->dnshost, temp_str2); MPIU_Strncpy(iter->host, iter->dnshost, SMPD_MAX_NAME_LENGTH); strtok(iter->host, "."); iter->next = spn_list; spn_list = iter; if (pszServiceDNSName != NULL) { FreeADsStr(pszServiceDNSName); } if (pszClass != NULL) { FreeADsStr(pszClass); } } FreeADsStr(pszDN); } Cleanup: /* iter = spn_list; while (iter != NULL) { printf("host : %s\n", iter->host); printf("dnshost: %s\n", iter->dnshost); printf("spn : %s\n", iter->spn); iter = iter->next; } fflush(stdout); */ if (pSCP) { pSCP->Release(); pSCP = NULL; } if (pPropEntries) { FreeADsMem(pPropEntries); pPropEntries = NULL; } if (pSearch) { if (hSearch) { pSearch->CloseSearchHandle(hSearch); hSearch = NULL; } pSearch->Release(); pSearch = NULL; } CoUninitialize(); /* t2 = PMPI_Wtime(); smpd_dbg_printf("build_spn_list took %0.6f seconds\n", t2-t1); */ return SMPD_SUCCESS; }
void wmain( int argc, wchar_t *argv[ ]) { BOOL bIsAttributeQuery = TRUE; BOOL bReturnVerbose = FALSE; LPOLESTR szType = L"attribute"; if (1==argc||(_wcsicmp(argv[1],L"/?") == 0)) { wprintf(L"This program queries the schema for the specified classes or attributes.\n"); wprintf(L"Syntax: getschemainfo [/C|/A][/V][querystring]\n"); wprintf(L"where /C specifies to query for classes.\n"); wprintf(L" /A specifies to query for attributes.\n"); wprintf(L" /V specifies that all properties for the found classes or attributes should be returned.\n"); wprintf(L" querystring is the query criteria in ldap query format.\n"); wprintf(L"Defaults: If neither /A or /C is specified, the query is against both.\n"); wprintf(L" If no /V is specified, the query returns only the ldapDisplayName and cn of the items found.\n"); wprintf(L" If no querystring is specified, the query returns all classes and/or attributes.\n"); wprintf(L"Example: getschemainfo /A (IsSingleValued=TRUE)\n"); wprintf(L"Returns all single-valued attributes in the schema.\n"); wprintf(L"Common querystrings:\n"); wprintf(L"For attributes:\n"); wprintf(L"(cn=Street-Address) to find the attribute with CN of Street-Address.\n"); wprintf(L"(ldapdisplayname=street) to find the attribute with ldapdisplayname of street.\n"); wprintf(L"(IsSingleValued=TRUE) for single-valued attributes.\n"); wprintf(L"(IsSingleValued=FALSE) for mulit-valued attributes.\n"); wprintf(L"(systemFlags:1.2.840.113556.1.4.804:=00000001) for non-replicated attributes\n"); wprintf(L"(systemFlags:1.2.840.113556.1.4.804:=00000004) for constructed attributes\n"); wprintf(L"(searchFlags=1) for indexed attributes.\n"); wprintf(L"(isMemberOfPartialAttributeSet=TRUE) for attributes included in the global catalog\n"); return; } //Handle the command line arguments int maxAlloc=MAX_PATH*2; LPOLESTR pszBuffer = new OLECHAR[maxAlloc]; if ( !pszBuffer ) { wprintf(L"Alloc Failed "); return; } wcscpy_s(pszBuffer, maxAlloc, L""); for (int i = 1;i<argc;i++) { if (_wcsicmp(argv[i],L"/C") == 0) { bIsAttributeQuery = FALSE; szType = L"class"; } else if (_wcsicmp(argv[i],L"/A") == 0) { bIsAttributeQuery = TRUE; szType = L"attribute"; } else if (_wcsicmp(argv[i],L"/V") == 0) { bReturnVerbose = TRUE; } else { if ( IS_BUFFER_ENOUGH(maxAlloc,pszBuffer, argv[i]) > 0 ) { wcscpy_s(pszBuffer,maxAlloc,argv[i]); } else { wprintf(L"The argument is too large "); if ( pszBuffer ) delete [] pszBuffer; return; } } } if (_wcsicmp(pszBuffer,L"") == 0) wprintf(L"\nFinding all %sSchema objects in the schema...\n\n",szType); else wprintf(L"\nFinding %sSchema objects based on query: %s...\n\n",szType, pszBuffer); HRESULT hr = S_OK; //Get rootDSE and the domain container's DN. IADs *pObject = NULL; IDirectorySearch *pSchemaNC = NULL; const unsigned int pathLen = MAX_PATH; LPOLESTR szPath = new OLECHAR[pathLen]; if ( !szPath ) { wprintf(L"Alloc Failed "); delete [] pszBuffer; return; } //Intialize COM CoInitialize(NULL); VARIANT var; hr = ADsOpenObject(L"LDAP://rootDSE", NULL, NULL, ADS_SECURE_AUTHENTICATION, //Use Secure Authentication IID_IADs, (void**)&pObject); if (FAILED(hr)) { wprintf(L"Could not execute query. Could not bind to LDAP://rootDSE.\n"); if (pObject) pObject->Release(); delete [] pszBuffer; delete [] szPath; CoUninitialize(); return; } if (SUCCEEDED(hr)) { hr = pObject->Get(L"schemaNamingContext",&var); if (SUCCEEDED(hr)) { wcscpy_s(szPath,pathLen,L"LDAP://"); if ( IS_BUFFER_ENOUGH(MAX_PATH,szPath, var.bstrVal, SysStringLen(var.bstrVal)) > 0 ) { wcscat_s(szPath,pathLen,var.bstrVal); } else { wprintf(L"The Schema's DN is too large"); pObject->Release(); delete [] pszBuffer; delete [] szPath; CoUninitialize(); return; } hr = ADsOpenObject(szPath, NULL, NULL, ADS_SECURE_AUTHENTICATION, //Use Secure Authentication IID_IDirectorySearch, (void**)&pSchemaNC); if (SUCCEEDED(hr)) { hr = FindAttributesOrClasses(pSchemaNC, //IDirectorySearch pointer to schema naming context. pszBuffer, NULL, bIsAttributeQuery, bReturnVerbose ); if (SUCCEEDED(hr)) { if (S_FALSE==hr) wprintf(L"No %sSchema object could be found based on the query: %s\n",szType,pszBuffer); } else if (0x8007203e==hr) wprintf(L"Could not execute query. An invalid filter was specified.\n"); else wprintf(L"Query failed to run. HRESULT: %x\n",hr); } else { wprintf(L"Could not execute query. Could not bind to the schema container.\n"); } if (pSchemaNC) pSchemaNC->Release(); } VariantClear(&var); } if (pObject) pObject->Release(); delete [] pszBuffer; delete [] szPath; // Uninitialize COM CoUninitialize(); return; }
LDAPAUTH_API BOOL CUGP(char * userin,char *password,char *machine, char * groupin,int locdom) { OSVERSIONINFO ovi = { sizeof ovi }; GetVersionEx( &ovi ); if (ovi.dwPlatformId == VER_PLATFORM_WIN32_NT && ovi.dwMajorVersion >= 5 ) { //Handle the command line arguments. LPOLESTR pszBuffer = new OLECHAR[MAX_PATH*2]; LPOLESTR pszBuffer2 = new OLECHAR[MAX_PATH*2]; LPOLESTR pszBuffer3 = new OLECHAR[MAX_PATH*2]; LPOLESTR pszBuffer4 = new OLECHAR[MAX_PATH*2]; mbstowcs( (wchar_t *) pszBuffer, userin, MAX_PATH ); mbstowcs( (wchar_t *) pszBuffer2, password, MAX_PATH ); mbstowcs( (wchar_t *) pszBuffer3, machine, MAX_PATH ); mbstowcs( (wchar_t *) pszBuffer4, groupin, MAX_PATH ); HRESULT hr = S_OK; //Get rootDSE and the domain container's DN. IADs *pObject = NULL; IADs *pObjectUser = NULL; IADs *pObjectGroup = NULL; IDirectorySearch *pDS = NULL; LPOLESTR szPath = new OLECHAR[MAX_PATH]; LPOLESTR myPath = new OLECHAR[MAX_PATH]; VARIANT var; wcscpy(szPath,L"LDAP://"); wcscat(szPath,L"rootDSE"); wprintf(szPath); wprintf(L"\n"); hr = ADsOpenObject(szPath, pszBuffer, pszBuffer2, ADS_SECURE_AUTHENTICATION, //Use Secure Authentication IID_IADs, (void**)&pObject); if (FAILED(hr)) { wprintf(L"Bind to domain failed %i\n",hr); if (pObject) pObject->Release(); delete [] pszBuffer; delete [] pszBuffer2; delete [] pszBuffer3; delete [] pszBuffer4; delete [] szPath; delete [] myPath; return false; } hr = pObject->Get(L"defaultNamingContext",&var); if (SUCCEEDED(hr)) { wcscpy(szPath,L"LDAP://"); wcscat(szPath,var.bstrVal); VariantClear(&var); if (pObject) { pObject->Release(); pObject = NULL; } wprintf( szPath); wprintf(L"\n"); //Bind to the root of the current domain. hr = ADsOpenObject(szPath,pszBuffer,pszBuffer2, ADS_SECURE_AUTHENTICATION,IID_IDirectorySearch,(void**)&pDS); if (SUCCEEDED(hr)) { if (SUCCEEDED(hr)) { hr = FindUserByName(pDS, pszBuffer, &pObjectUser); if (FAILED(hr)) { wprintf(L"User not found %i\n",hr); delete [] pszBuffer; delete [] pszBuffer2; delete [] pszBuffer3; delete [] szPath; delete [] myPath; if (pDS) pDS->Release(); if (pObjectUser) pObjectUser->Release(); return false; } if (pObjectUser) pObjectUser->Release(); ///////////////////// VNCACCESS hr = FindGroup(pDS, pszBuffer, &pObjectGroup,pszBuffer4); if (pObjectGroup) { pObjectGroup->Release(); pObjectGroup = NULL; } if (FAILED(hr)) wprintf(L"group not found\n"); if (SUCCEEDED(hr)) { wprintf(L"Group found OK\n"); IADsGroup * pIADsG; hr = ADsOpenObject( gbsGroup,pszBuffer, pszBuffer2, ADS_SECURE_AUTHENTICATION,IID_IADsGroup, (void**) &pIADsG); if (SUCCEEDED(hr)) { VARIANT_BOOL bMember = FALSE; hr = pIADsG->IsMember(gbsMember,&bMember); if (SUCCEEDED(hr)) { if (bMember == -1) { wprintf(L"Object \n\n%s\n\n IS a member of the following Group:\n\n%s\n\n",gbsMember,gbsGroup); delete [] pszBuffer; delete [] pszBuffer2; delete [] pszBuffer3; delete [] szPath; delete [] myPath; if (pDS) pDS->Release(); return true; } else { BSTR bsMemberGUID = NULL; IDirectoryObject * pDOMember = NULL; hr = ADsOpenObject( gbsMember,pszBuffer, pszBuffer2, ADS_SECURE_AUTHENTICATION,IID_IDirectoryObject, (void**) &pDOMember); if (SUCCEEDED(hr)) { hr = GetObjectGuid(pDOMember,bsMemberGUID); pDOMember->Release(); pDOMember = NULL; if (RecursiveIsMember(pIADsG,bsMemberGUID,gbsMember,true, pszBuffer, pszBuffer2)) { delete [] pszBuffer; delete [] pszBuffer2; delete [] pszBuffer3; delete [] szPath; delete [] myPath; if (pDS) pDS->Release(); return true; } } }//else bmember }//ismember }//iadsgroup }//Findgroup wprintf(L"USER not found in group\n"); }//user } if (pDS) pDS->Release(); } /*LOGFAILED(pszBuffer3,pszBuffer);*/ delete [] pszBuffer; delete [] pszBuffer2; delete [] pszBuffer3; delete [] szPath; delete [] myPath; return false; } return false; }
//---------------------------------------------------------------------------- // // EnumDeletedObjects() // // Enumerates all of the objects in the Deleted Objects container. // //---------------------------------------------------------------------------- HRESULT EnumDeletedObjects( PWCHAR SearchFilter, BOOLEAN Restore, PDWORD ItemsFound ) { HRESULT hr; IADsContainer *pDeletedObjectsCont = NULL; IDirectorySearch *pSearch = NULL; // Set the attributes to retrieve. LPWSTR rgAttributes[] = {L"cn", L"distinguishedName", L"lastKnownParent"}; *ItemsFound = 0; hr = GetDeletedObjectsContainer(&pDeletedObjectsCont); if(FAILED(hr)) { goto cleanup; } hr = pDeletedObjectsCont->QueryInterface(IID_IDirectorySearch, (LPVOID*)&pSearch); if(FAILED(hr)) { goto cleanup; } ADS_SEARCH_HANDLE hSearch; // Only search for direct children of the container. ADS_SEARCHPREF_INFO rgSearchPrefs[3]; rgSearchPrefs[0].dwSearchPref = ADS_SEARCHPREF_SEARCH_SCOPE; rgSearchPrefs[0].vValue.dwType = ADSTYPE_INTEGER; rgSearchPrefs[0].vValue.Integer = ADS_SCOPE_ONELEVEL; // Search for deleted objects. rgSearchPrefs[1].dwSearchPref = ADS_SEARCHPREF_TOMBSTONE; rgSearchPrefs[1].vValue.dwType = ADSTYPE_BOOLEAN; rgSearchPrefs[1].vValue.Boolean = TRUE; // Set the page size. rgSearchPrefs[2].dwSearchPref = ADS_SEARCHPREF_PAGESIZE; rgSearchPrefs[2].vValue.dwType = ADSTYPE_INTEGER; rgSearchPrefs[2].vValue.Integer = 1000; // Set the search preference hr = pSearch->SetSearchPreference(rgSearchPrefs, ARRAYSIZE(rgSearchPrefs)); if(FAILED(hr)) { goto cleanup; } // Execute the search hr = pSearch->ExecuteSearch( SearchFilter, rgAttributes, ARRAYSIZE(rgAttributes), &hSearch); if(SUCCEEDED(hr)) { // Call IDirectorySearch::GetNextRow() to retrieve the next row of data while(S_OK == (hr = pSearch->GetNextRow(hSearch))) { ADS_SEARCH_COLUMN col; UINT i; // Enumerate the retrieved attributes. for(i = 0; i < ARRAYSIZE(rgAttributes); i++) { hr = pSearch->GetColumn(hSearch, rgAttributes[i], &col); if(SUCCEEDED(hr)) { switch(col.dwADsType) { case ADSTYPE_CASE_IGNORE_STRING: case ADSTYPE_DN_STRING: case ADSTYPE_PRINTABLE_STRING: case ADSTYPE_NUMERIC_STRING: case ADSTYPE_OCTET_STRING: wprintf(L"%s: ", rgAttributes[i]); for(DWORD x = 0; x < col.dwNumValues; x++) { wprintf(col.pADsValues[x].CaseIgnoreString); if((x + 1) < col.dwNumValues) { wprintf(L","); } } wprintf(L"\n"); break; } pSearch->FreeColumn(&col); } } (*ItemsFound)++; wprintf(L"\n"); if( Restore ) { WCHAR answer[MAX_PATH]; wprintf(L"Do you want to restore this object (y/n)? "); fflush( stdout ); _getws( answer ); if( towupper( answer[0] ) == 'Y' ) { ADS_SEARCH_COLUMN colDn, colPn; pSearch->GetColumn(hSearch, rgAttributes[1], &colDn); pSearch->GetColumn(hSearch, rgAttributes[2], &colPn); hr = RestoreDeletedObject( colDn.pADsValues[0].CaseIgnoreString, colPn.pADsValues[0].CaseIgnoreString ); if( FAILED( hr )) { wprintf(L"\nRestore failed: %d\n", hr ); } else { wprintf(L"\nRestore succeeded.\n"); } pSearch->FreeColumn(&colDn); pSearch->FreeColumn(&colPn); } wprintf(L"\n"); } } // Close the search handle to clean up. pSearch->CloseSearchHandle(hSearch); } cleanup: if(pDeletedObjectsCont) { pDeletedObjectsCont->Release(); } if(pSearch) { pSearch->Release(); } return hr; }
void wmain( int argc, wchar_t *argv[ ]) { //Handle the command line arguments. LPOLESTR pszBuffer = NULL; pszBuffer = new OLECHAR[MAX_PATH*2]; if(pszBuffer == NULL) goto ret; if (argv[1] == NULL) { wprintf(L"This program finds a user in the current Window 2000 domain\n"); wprintf(L"and displays its objectSid property in string form.\n"); wprintf(L"This program demonstrates reading a property of type octet string.\n\n"); wprintf(L"Enter Common Name of the user to find:"); if ( !_getws_s(pszBuffer, MAX_PATH*2)) { delete [] pszBuffer; wprintf(L"String exceeded buffer size.\n\n"); return; } } else if ( !wcscpy_s(pszBuffer, MAX_PATH*2, argv[1])) { delete [] pszBuffer; wprintf(L"String exceeded buffer size.\n\n"); return; } //if empty string, exit. if (0==wcscmp(L"", pszBuffer)) goto ret; wprintf(L"\nFinding user: %s...\n",pszBuffer); //Intialize COM CoInitialize(NULL); HRESULT hr = S_OK; //Get rootDSE and the domain container's DN. IADs *pObject = NULL; IDirectorySearch *pDS = NULL; LPOLESTR szPath = NULL; szPath = new OLECHAR[MAX_PATH]; if(szPath == NULL) goto ret; VARIANT var; hr = ADsOpenObject(L"LDAP://rootDSE", NULL, NULL, ADS_SECURE_AUTHENTICATION, //Use Secure Authentication IID_IADs, (void**)&pObject); if (FAILED(hr)) { wprintf(L"Not Found. Could not bind to the domain.\n"); if (pObject) pObject->Release(); goto ret; } VariantInit(&var); hr = pObject->Get(L"defaultNamingContext",&var); if (SUCCEEDED(hr)) { wcscpy_s(szPath,MAX_PATH,L"LDAP://"); wcscat_s(szPath,MAX_PATH,var.bstrVal); VariantClear(&var); if (pObject) { pObject->Release(); pObject = NULL; } //Bind to the root of the current domain. hr = ADsOpenObject(szPath, NULL, NULL, ADS_SECURE_AUTHENTICATION, //Use Secure Authentication IID_IDirectorySearch, (void**)&pDS); if (SUCCEEDED(hr)) { hr = FindUserByName(pDS, //Container to search pszBuffer, //Name of user to find. &pObject); //Return a pointer to the user if (SUCCEEDED(hr)) { //Get the objectSid property hr = pObject->Get(L"objectSid", &var); if (SUCCEEDED(hr)) { LPBYTE pByte = NULL; wprintf (L"----------------------------------------------\n"); wprintf (L"----------Call GetLPBYTEtoOctetString---------\n"); wprintf (L"----------------------------------------------\n"); hr = GetLPBYTEtoOctetString(&var, //IN. Pointer to variant containing the octetstring. &pByte //OUT. Return LPBYTE to the data represented in octetstring. ); PSID pObjectSID = (PSID)pByte; //Convert SID to string. LPOLESTR szSID = NULL; ConvertSidToStringSid(pObjectSID, &szSID); wprintf(L"objectSid:%s\n",szSID); LocalFree(szSID); //Free the buffer. CoTaskMemFree(pByte); } else wprintf(L"Get method failed with hr: %x\n",hr); VariantClear(&var); } else { wprintf(L"User \"%s\" not Found.\n",pszBuffer); wprintf (L"FindUserByName failed with the following HR: %x\n", hr); } if (pObject) pObject->Release(); } if (pDS) pDS->Release(); } ret: if(pszBuffer) delete pszBuffer; if(szPath) delete szPath; //Uninitalize COM CoUninitialize(); return; }
void wmain( int argc, wchar_t *argv[]) { //Handle the command line arguments. int maxAlloc = MAX_PATH*2; LPOLESTR pszBuffer = new OLECHAR[maxAlloc]; wcscpy_s(pszBuffer, maxAlloc, L""); BOOL bReturnVerbose = FALSE; for (int i = 1;i<argc;i++) { if (_wcsicmp(argv[i],L"/V") == 0) { bReturnVerbose = TRUE; } else if ((_wcsicmp(argv[i],L"/?") == 0)|| (_wcsicmp(argv[i],L"-?") == 0)) { wprintf(L"This program queries for users in the current user's domain.\n"); wprintf(L"Syntax: queryusers [/V][querystring]\n"); wprintf(L"where /V specifies that all properties for the found users should be returned.\n"); wprintf(L" querystring is the query criteria in ldap query format.\n"); wprintf(L"Defaults: If no /V is specified, the query returns only the RDN and DN of the items found.\n"); wprintf(L" If no querystring is specified, the query returns all users.\n"); wprintf(L"Example: queryusers (sn=Smith)\n"); wprintf(L"Returns all users with surname Smith.\n"); return; } else { if ( IS_BUFFER_ENOUGH(maxAlloc, pszBuffer, argv[i]) > 0 ) { wcscpy_s(pszBuffer,maxAlloc,argv[i]); } else { wprintf(L"Buffer is too small for the argument"); delete [] pszBuffer; return; } } } if (_wcsicmp(pszBuffer,L"") == 0) wprintf(L"\nFinding all user objects...\n\n"); else wprintf(L"\nFinding user objects based on query: %s...\n\n", pszBuffer); //Initialize COM CoInitialize(NULL); HRESULT hr = S_OK; //Get rootDSE and the current user's domain container DN. IADs *pObject = NULL; IDirectorySearch *pContainerToSearch = NULL; LPOLESTR szPath = new OLECHAR[MAX_PATH]; VARIANT var; hr = ADsOpenObject(L"LDAP://rootDSE", NULL, NULL, ADS_SECURE_AUTHENTICATION, //Use Secure Authentication IID_IADs, (void**)&pObject); if (FAILED(hr)) { wprintf(L"Could not execute query. Could not bind to LDAP://rootDSE.\n"); if (pObject) pObject->Release(); delete [] pszBuffer; delete [] szPath; CoUninitialize(); return; } if (SUCCEEDED(hr)) { hr = pObject->Get(L"defaultNamingContext",&var); if (SUCCEEDED(hr)) { //Build path to the domain container. wcscpy_s(szPath,MAX_PATH,L"LDAP://"); if ( IS_BUFFER_ENOUGH(MAX_PATH, szPath, var.bstrVal) > 0 ) { wcscat_s(szPath,MAX_PATH,var.bstrVal); } else { wprintf(L"Buffer is too small for the domain DN"); delete [] pszBuffer; delete [] szPath; CoUninitialize(); return; } hr = ADsOpenObject(szPath, NULL, NULL, ADS_SECURE_AUTHENTICATION, //Use Secure Authentication IID_IDirectorySearch, (void**)&pContainerToSearch); if (SUCCEEDED(hr)) { hr = FindUsers(pContainerToSearch, //IDirectorySearch pointer to Partitions container. pszBuffer, NULL, //Return all properties -1, // Return all properties bReturnVerbose ); if (SUCCEEDED(hr)) { if (S_FALSE==hr) wprintf(L"No user object could be found.\n"); } else if (0x8007203e==hr) wprintf(L"Could not execute query. An invalid filter was specified.\n"); else wprintf(L"Query failed to run. HRESULT: %x\n",hr); } else { wprintf(L"Could not execute query. Could not bind to the container.\n"); } if (pContainerToSearch) pContainerToSearch->Release(); } VariantClear(&var); } if (pObject) pObject->Release(); delete [] pszBuffer; delete [] szPath; // Uninitialize COM CoUninitialize(); return; }
LDAPAUTHNT4_API BOOL CUGP(char * userin,char *password,char *machine,char *groupin,int locdom) { { //Handle the command line arguments. LPOLESTR pszBuffer = new OLECHAR[MAX_PATH*2]; LPOLESTR pszBuffer2 = new OLECHAR[MAX_PATH*2]; LPOLESTR pszBuffer3 = new OLECHAR[MAX_PATH*2]; LPOLESTR pszBuffer4 = new OLECHAR[MAX_PATH*2]; mbstowcs( (wchar_t *) pszBuffer, userin, MAX_PATH ); mbstowcs( (wchar_t *) pszBuffer2, password, MAX_PATH ); mbstowcs( (wchar_t *) pszBuffer3, machine, MAX_PATH ); mbstowcs( (wchar_t *) pszBuffer4, groupin, MAX_PATH ); HRESULT hr = S_OK; //Get rootDSE and the domain container's DN. IADs *pObject = NULL; IADs *pObjectUser = NULL; IADs *pObjectGroup = NULL; IDirectorySearch *pDS = NULL; LPOLESTR szPath = new OLECHAR[MAX_PATH]; LPOLESTR myPath = new OLECHAR[MAX_PATH]; VARIANT var; ////////////FIND SERVER NEEDED FOR NT4 DWORD dwRet; PDOMAIN_CONTROLLER_INFO pdci; dwRet = DsGetDcName(NULL, NULL, NULL, NULL , DS_PDC_REQUIRED, &pdci); if (ERROR_SUCCESS!=dwRet) { wprintf(L"PDC not found try a rediscover \n"); dwRet = DsGetDcName(NULL, NULL, NULL, NULL , DS_DIRECTORY_SERVICE_REQUIRED|DS_FORCE_REDISCOVERY, &pdci); if (ERROR_SUCCESS!=dwRet) { wprintf(L"PDC not found \n"); delete [] pszBuffer; delete [] pszBuffer2; delete [] pszBuffer3; delete [] pszBuffer4; delete [] szPath; delete [] myPath; return false; } } ////////////////////////////////////////// wcscpy(szPath,L"LDAP://"); wcscat(szPath,pdci->DomainControllerName+2); wcscat(szPath,L"/rootDSE"); wprintf(szPath); wprintf(L"\n"); hr = ADsOpenObject(szPath, pszBuffer, pszBuffer2, ADS_SECURE_AUTHENTICATION, //Use Secure Authentication IID_IADs, (void**)&pObject); if (FAILED(hr)) { bool result=false; delete [] pszBuffer; delete [] pszBuffer2; delete [] pszBuffer3; delete [] pszBuffer4; delete [] szPath; delete [] myPath; return result; } hr = pObject->Get(L"defaultNamingContext",&var); if (SUCCEEDED(hr)) { wcscpy(szPath,L"LDAP://"); wcscat(szPath,pdci->DomainControllerName+2); wcscat(szPath,L"/"); wcscat(szPath,var.bstrVal); VariantClear(&var); if (pObject) { pObject->Release(); pObject = NULL; } wprintf( szPath); wprintf(L"\n"); //Bind to the root of the current domain. hr = ADsOpenObject(szPath,pszBuffer,pszBuffer2, ADS_SECURE_AUTHENTICATION,IID_IDirectorySearch,(void**)&pDS); if (SUCCEEDED(hr)) { if (SUCCEEDED(hr)) { hr = FindUserByName(pDS, pszBuffer, &pObjectUser ); if (FAILED(hr)) { delete [] pszBuffer; delete [] pszBuffer2; delete [] pszBuffer3; delete [] pszBuffer4; delete [] szPath; delete [] myPath; if (pDS) pDS->Release(); if (pObjectUser) pObjectUser->Release(); return false; } if (pObjectUser) pObjectUser->Release(); ///////////////////// VNCACCESS hr = FindGroup(pDS, pszBuffer, &pObjectGroup,pszBuffer4); if (pObjectGroup) { pObjectGroup->Release(); pObjectGroup = NULL; } if (SUCCEEDED(hr)) { wprintf(L"FindGroup OK\n"); IADsGroup * pIADsG; hr = ADsOpenObject( gbsGroup,pszBuffer, pszBuffer2, ADS_SECURE_AUTHENTICATION,IID_IADsGroup, (void**) &pIADsG); if (SUCCEEDED(hr)) { VARIANT_BOOL bMember = FALSE; hr = pIADsG->IsMember(gbsMember,&bMember); if (SUCCEEDED(hr)) { if (bMember == -1) { wprintf(L"Object \n\n%s\n\n IS a member of the following Group:\n\n%s\n\n",gbsMember,gbsGroup); delete [] pszBuffer; delete [] pszBuffer2; delete [] pszBuffer3; delete [] pszBuffer4; delete [] szPath; delete [] myPath; if (pDS) pDS->Release(); return true; } else { BSTR bsMemberGUID = NULL; IDirectoryObject * pDOMember = NULL; hr = ADsOpenObject( gbsMember,pszBuffer, pszBuffer2, ADS_SECURE_AUTHENTICATION,IID_IDirectoryObject, (void**) &pDOMember); if (SUCCEEDED(hr)) { hr = GetObjectGuid(pDOMember,bsMemberGUID); pDOMember->Release(); pDOMember = NULL; if (RecursiveIsMember(pIADsG,bsMemberGUID,gbsMember,true, pszBuffer, pszBuffer2)) { delete [] pszBuffer; delete [] pszBuffer2; delete [] pszBuffer3; delete [] pszBuffer4; delete [] szPath; delete [] myPath; if (pDS) pDS->Release(); return true; } } }//else bmember }//ismember }//iadsgroup }//Findgroup }//user } if (pDS) pDS->Release(); } delete [] pszBuffer; delete [] pszBuffer2; delete [] pszBuffer3; delete [] pszBuffer4; delete [] szPath; delete [] myPath; return false; } return false; }