Я пытаюсь получить список членов локальной группы в windows. Я знаю, как это делается с помощью поиска в каталоге при подключении к ldap: // rootdse . Но это доменные группы. Я не знаю, как получить интерфейс поиска в каталоге при попытке получить пользователей в локальной группе.
Это код, который я использую для получения членов группы из LDAP Сервер:
HRESULT performSearch(BAB::WString& query, LPWSTR* columns, DWORD colCnt, searchResults& results)
{
HRESULT hr = S_OK;
if (!m_pSearch)
return E_POINTER;
DWORD dwLength = MAX_PATH * 2;
// Specify subtree search.
ADS_SEARCHPREF_INFO SearchPrefs;
SearchPrefs.dwSearchPref = ADS_SEARCHPREF_SEARCH_SCOPE;
SearchPrefs.vValue.dwType = ADSTYPE_INTEGER;
SearchPrefs.vValue.Integer = ADS_SCOPE_SUBTREE;
DWORD dwNumPrefs = 1;
// Set search preference.
hr = m_pSearch->SetSearchPreference(&SearchPrefs, dwNumPrefs);
if (FAILED(hr))
return hr;
ADS_SEARCH_HANDLE hSearch = NULL;
if (SUCCEEDED(hr = m_pSearch->ExecuteSearch((LPWSTR)query.c_str(), columns, colCnt, &hSearch)))
{
if (SUCCEEDED(hr = m_pSearch->GetFirstRow(hSearch)))
{
while (hr != S_ADS_NOMORE_ROWS)
{
searchVals val;
LPWSTR pszColumnName;
while (m_pSearch->GetNextColumnName(hSearch, &pszColumnName) != S_ADS_NOMORE_COLUMNS)
{
ADS_SEARCH_COLUMN col;
if (SUCCEEDED(hr = m_pSearch->GetColumn(hSearch, pszColumnName, &col)))
{
val[pszColumnName] = getColVal(col);
m_pSearch->FreeColumn(&col);
}
FreeADsMem(pszColumnName);
}
results.push_back(val);
hr = m_pSearch->GetNextRow(hSearch);
}
}
}
return hr;
}
IADs* pObject = NULL;
VARIANT var;
VariantInit(&var);
if (SUCCEEDED(hr = ADsOpenObject(L"LDAP://rootDSE", NULL, NULL, ADS_SECURE_AUTHENTICATION, IID_IADs, (void**)&pObject)))
{
if (SUCCEEDED(hr = pObject->Get(CComBSTR(L"defaultNamingContext"), &var)))
{
BAB::WString wsPath = L"LDAP://";
wsPath += var.bstrVal;
hr = ADsOpenObject(wsPath.c_str(), NULL, NULL, ADS_SECURE_AUTHENTICATION, IID_IDirectorySearch, (void**)&m_pSearch);
}
VariantClear(&var);
if (pObject)
pObject->Release();
}
searchResults results;
BAB::WString query;
query.Format(L"(&(objectCategory=group)(cn=%s))", wszGroup);
LPWSTR groupColumns[] = { (LPWSTR)L"distinguishedName" };
performSearch(query, groupColumns, sizeof(groupColumns) / sizeof(LPWSTR), results);
if (results.size())
{
LPWSTR userColumns[] = { (LPWSTR)L"sAmAccountName", (LPWSTR)L"objectSid", (LPWSTR)L"objectGUID", (LPWSTR)L"distinguishedName" };
query.Format(L"(&(objectCategory=user)(memberOf=%s))", results[0][BAB::WString(L"distinguishedName")].c_str());
performSearch(query, userColumns, sizeof(userColumns) / sizeof(LPWSTR), members);
}