Я пробую приведенный ниже пример программы, но он не ссылается из-за неразрешенного внешнего символа как для IID_IADs
, так и для IID_IADsContainer
.
Какую библиотеку я могу включить, чтобы решить эту проблему?
#include <windows.h>
#include <activeds.h>
#include <comdef.h>
#include <iostream>
#pragma comment(lib, "Activeds.lib")
int main() {
HRESULT hr = CoInitialize(NULL);
if (FAILED(hr)) {
std::cout << "Failed to initialize COM library." << std::endl;
return 1;
}
IADsContainer* pContainer = NULL;
hr = ADsOpenObject(L"LDAP://DC=mydomain,DC=com", NULL, NULL, ADS_SECURE_AUTHENTICATION, IID_IADsContainer, (void**)&pContainer);
if (FAILED(hr)) {
std::cout << "Failed to bind to Active Directory." << std::endl;
CoUninitialize();
return 1;
}
IEnumVARIANT* pEnum = NULL;
hr = ADsBuildEnumerator(pContainer, &pEnum);
if (FAILED(hr)) {
std::cout << "Failed to get enumerator." << std::endl;
pContainer->Release();
CoUninitialize();
return 1;
}
VARIANT var;
ULONG lFetch;
IDispatch* pDispatch = NULL;
IADs* pADs = NULL;
BSTR bstrClass;
while (S_OK == ADsEnumerateNext(pEnum, 1, &var, &lFetch)) {
pDispatch = V_DISPATCH(&var);
hr = pDispatch->QueryInterface(IID_IADs, (void**)&pADs);
if (SUCCEEDED(hr)) {
hr = pADs->get_Class(&bstrClass);
if (SUCCEEDED(hr)) {
if (_wcsicmp(bstrClass, L"computer") == 0) {
BSTR bstrName;
hr = pADs->get_Name(&bstrName);
if (SUCCEEDED(hr)) {
std::wcout << L"Computer: " << bstrName << std::endl;
SysFreeString(bstrName);
}
}
SysFreeString(bstrClass);
}
pADs->Release();
}
VariantClear(&var);
}
ADsFreeEnumerator(pEnum);
pContainer->Release();
CoUninitialize();
return 0;
}
@RbMm, использующий __uuidof, жалуется на ошибку C2787: «_GUID»: с этим объектом не связан ни один GUID. Ошибка C2660: «ADsOpenObject»: функция не принимает 5 аргументов. Ошибка C2787: «_GUID»: с этим объектом не связан ни один GUID.. . но связывание с ADSIid.lib сработало (как вы это обнаружили?)
В образце программы все равно не перечислены компьютеры...
какой компилятор вы используете? вместо IID_PPV_ARGS(&pContainer)
IID_IADsContainer, (void**)&pContainer
должен работать на CL(msvc). IID_PPV_ARGS(&pContainer)
равен __uuidof(IADsContainer), (void**)&pContainer
эта программа все равно не выводит список компьютеров - это уже совсем другой вопрос. как ты это нашел (ADSIid.lib)? это не тривиально, если подумать?
Он работает с WinNT вместо LDAP. VS2022 я собирал.
VS2022, который я использовал для сборки - c или c++? msvc или clang? (MSVC поддерживает оба). если msvc c++ - __uuidof(IADsContainer), (void**)&pContainer
или IID_PPV_ARGS(&pContainer)
должно работать. вероятно, вы используете c
Я вполне уверен, что компилятор C отклонит std::cout << "whatever";
, потому что это недопустимый C.
@user3161924 user3161924 «связывание с ADSIid.lib сработало (как вы это обнаружили?)» - Вы читали документацию? Настройка Visual C++ 6.0 для разработки ADSI
Модуль c++ 14, msvc, __uuidof не работал, связывание с adsiid.lib работало.
@RemyLebeau указал на правильное решение , Настройка среды разработки Microsoft Visual C++ 6.0.
- Укажите каталог включения и библиотеки. Выберите Инструменты | Параметры. Перейдите на вкладку «Каталог» и укажите путь к ADSI. заголовочные файлы.
- Включите файл Activeds.h в свой проект.
- Добавьте файлы Activeds.lib и Adsiid.lib во входные данные компоновщика для ваш проект.
используйте
__uuidof(IADsContainer)
и__uuidof(IADs)
. или ссылку наADSIid.Lib
, но лучше используйте__uuiodf