Как получить членов в локальной группе windows, используя LDAP и c ++ - PullRequest
0 голосов
/ 20 апреля 2020

Я пытаюсь получить список членов локальной группы в 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...