Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Принудительная переинициализация ADSI


Автор: mihryak 6.1.2010, 01:17
Если в приложении начать использовать ADSI, вызвав ADsOpenObject (или ADsGetObject), то после установки нового ADSI-провайдера (IIS в моём случае), работа с ним будет невозможна до перезапуска самого приложения
Код

int _tmain(int argc, _TCHAR* argv[])
{
    IADs *pObject;
    HRESULT hr;

    CoInitialize(NULL);

    hr = ADsOpenObject(L"LDAP://TestDomain.local/RootDSE", NULL, NULL, 193, IID_IADs, (void**) &pObject);
    if(SUCCEEDED(hr)) // succeeded
    {
        pObject->Release();
    }
    // install iis here
    hr = ADsOpenObject(L"IIS://localhost/W3SVC/1", NULL, NULL, 193, IID_IADs, (void**) &pObject);
    if(SUCCEEDED(hr)) // not succeeded
    {
        pObject->Release();
    }

    CoUninitialize();
    return 0;
}


столкнулся с этим в .нет приложении, доковырялся до плюсов, думаю, что если удастся найти плюсовое решение, то и в .нете его сумею как-нибудь прикрутить
вот моя тема в .нетовом разделе, там побольше информации о порядке вызовов и самой проблеме - http://forum.vingrad.ru/forum/topic-286010/anchor-entry2064405/0.html

Автор: jonie 6.1.2010, 01:50
Я очень далек от ldap, но поставил себе ADAM для тестов и попробывал такой код выполнить, всё ок:
Код

int _tmain(int argc, _TCHAR* argv[])
{
    IADs *pObject;
    HRESULT hr;
    CoInitialize(NULL);
    hr = ADsOpenObject(L"LDAP://localhost:50000/CN=Configuration,CN={D63DC98B-B7FC-468E-B9CD-BCA5EE0203C5}", NULL, NULL, 0, IID_IADs, (void**) &pObject);
    if(SUCCEEDED(hr))
    {
        pObject->Release();
    }

    hr = ADsOpenObject(L"LDAP://localhost:50000/RootDSE", NULL, NULL, 0, IID_IADs, (void**) &pObject);
    if(SUCCEEDED(hr))
    {
        pObject->Release();
    }
    DWORD err = GetLastError();

    CoUninitialize();
    return 0;
}

или как-нибудь на ADAM можно симитировать проблему?

кстати, число 193 непонятно откуда...

Добавлено через 3 минуты и 9 секунд
кстати и с "IIS://localhost" тоже нет проблем (у меня стоит iis ессно)

Автор: mihryak 6.1.2010, 02:01
на начало выполнения кода ИИСа не должно быть в системе, нужно его удалить через компоненты системы, например (через роли дольше получается)
после прохождения первого вызова AdsOpenObject нужно повисеть на бряке, устанавливая в это время ИИС, как установится - продолжить работу

193 - это комбинация значений http://msdn.microsoft.com/en-us/library/aa772247%28VS.85%29.aspx, опытным дебажным путём получена во время изучения кода SystemDirectoryServices (с этим значением вызывается)

сейчас перепроверил 193
с этим значением получается домен (Domain.GetCurrentDomain()), оно равно AuthenticationTypes.Sealing | AuthenticationTypes.Signing | AuthenticationTypes.Secure
для простой DirectoryEntry там просто ADS_SECURE_AUTHENTICATION   = 0x1, но это роли не играет, проблема воспроизводится как с 1, так и с 193

Автор: jonie 6.1.2010, 11:28
в общем внутри ADsOpenObject вызывается http://msdn.microsoft.com/en-us/library/aa366938%28VS.85%29.aspx...
http://msdn.microsoft.com/en-us/library/ms806997.aspx вот пишут что надо флаг указывать ADS_SERVER_BIND, если указывается явно сервер (как я понимаю у вас указывается).

Кстати, можно взять сниффер и посмотреть какие запросы идут (ониж идут по ldap один фиг).... и поразмыслить.
Ну, на крайний случай, можно, наверняка, вызвать CoUninitialize + CoInitialize ....

Добавлено через 1 минуту и 34 секунды
кстати, http://msdn.microsoft.com/en-us/library/aa366119%28VS.85%29.aspx должна быть интересна...

Автор: mihryak 6.1.2010, 11:49
Цитата(jonie @  6.1.2010,  12:28 Найти цитируемый пост)
CoUninitialize + CoInitialize

уже попробовал, не помогло
а с остальным - спасибо, буду ковыряться

Автор: mihryak 10.1.2010, 02:08
прошу прощения за паузу, отложил на время вопрос

LdapGetLastError упорно возрвращает 0 (LDAP_ADMIN_LIMIT_EXCEEDED), даже если её вызвать в самой первой строчке
ковыряния с ldap_init и флагами тоже ничего не дали, к сожалению
есть подозрение, что работа с ИИСом вообще к ldap не относится (http://msdn.microsoft.com/en-us/library/aa772235%28VS.85%29.aspx)

наверное, буду пытаться решить задачу каким-нибудь совершенно иным способом, вот только придумать бы его smile с WMI большинство подзадач решаются, но с некоторыми натыкаюсь на подобный беспролазный затык

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)