Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Принудительная переинициализация ADSI 
:(
    Опции темы
mihryak
Дата 6.1.2010, 01:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 731
Регистрация: 28.4.2007
Где: С-Пб

Репутация: нет
Всего: 36



Если в приложении начать использовать 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...y2064405/0.html
PM MAIL ICQ   Вверх
jonie
Дата 6.1.2010, 01:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 7
Всего: 118



Я очень далек от 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 ессно)


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
mihryak
Дата 6.1.2010, 02:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 731
Регистрация: 28.4.2007
Где: С-Пб

Репутация: нет
Всего: 36



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

193 - это комбинация значений ADS_AUTHENTICATION_ENUM, опытным дебажным путём получена во время изучения кода SystemDirectoryServices (с этим значением вызывается)

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

Это сообщение отредактировал(а) mihryak - 6.1.2010, 02:12
PM MAIL ICQ   Вверх
jonie
Дата 6.1.2010, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 7
Всего: 118



в общем внутри ADsOpenObject вызывается ldap_init...
Тут вот пишут что надо флаг указывать ADS_SERVER_BIND, если указывается явно сервер (как я понимаю у вас указывается).

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

Добавлено через 1 минуту и 34 секунды
кстати, LdapGetLastError должна быть интересна...


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
mihryak
Дата 6.1.2010, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 731
Регистрация: 28.4.2007
Где: С-Пб

Репутация: нет
Всего: 36



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

уже попробовал, не помогло
а с остальным - спасибо, буду ковыряться
PM MAIL ICQ   Вверх
mihryak
Дата 10.1.2010, 02:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 731
Регистрация: 28.4.2007
Где: С-Пб

Репутация: нет
Всего: 36



прошу прощения за паузу, отложил на время вопрос

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

наверное, буду пытаться решить задачу каким-нибудь совершенно иным способом, вот только придумать бы его smile с WMI большинство подзадач решаются, но с некоторыми натыкаюсь на подобный беспролазный затык
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.3811 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.