DCOM & Windows 98
От: shilnik Россия  
Дата: 09.04.04 05:13
Оценка:
Привет всем!
Вопрос такой:
На сервере (W2K) зарегистрирован DCOM, клиент установлен на W98. Клиент должен обрабатывать события с сервера. Для этого в DCOMCNFG надо дать разрешение на доступ к DCOM клиента. !!! Открываю DCOMCNFG, на там на вкладке Default Permissions кнопка Edit default НЕДОСТУПНА (серая то есть ). Как быть?
Re: DCOM & Windows 98
От: Mr. None Россия http://mrnone.blogspot.com
Дата: 09.04.04 11:32
Оценка:
Здравствуйте, shilnik, Вы писали:

S>Привет всем!

S>Вопрос такой:
S>На сервере (W2K) зарегистрирован DCOM, клиент установлен на W98. Клиент должен обрабатывать события с сервера. Для этого в DCOMCNFG надо дать разрешение на доступ к DCOM клиента. !!! Открываю DCOMCNFG, на там на вкладке Default Permissions кнопка Edit default НЕДОСТУПНА (серая то есть ). Как быть?

Нет под рукой Win 9x, но что-то мне подсказывает, что так оно и должно быть — не умеет 9x рулить правами. Если я не ошибаюсь, то туда даже лазить не надо, я решал в точности такую же задачу некоторое время назад. И решал её следующим способом:
1) через CoInitializeSecurity на клиенте убирал всю секьюрность — CoInitializeSecurity( 0, -1, 0, 0, RPC_C_AUTHN_LEVEL_NONE, RPC_C_IMP_LEVEL_IMPERSONATE, 0, EOAC_NONE, 0 );
2) на сервере перед вызовом через CoSetProxyBlanket изменял настройки безопасности прокси клиентского объекта — отключал всю секьюрность для него к чёртовой бабушке: CoSetProxyBlanket( eventObj, RPC_C_AUTHN_NONE, RPC_C_AUTHZ_NONE, 0, RPC_C_AUTHN_LEVEL_NONE, RPC_C_IMP_LEVEL_IDENTIFY, 0, EOAC_NONE );
А вот глобальные настройки DCOM`а на клиентской машине (там вообще Win95 стояла), кажись были выставлены по-умолчанию...
Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
Re[2]: DCOM & Windows 98
От: shilnik Россия  
Дата: 13.04.04 02:27
Оценка:
Здравствуйте, Mr. None, Вы писали:

MN>Нет под рукой Win 9x, но что-то мне подсказывает, что так оно и должно быть — не умеет 9x рулить правами. Если я не ошибаюсь, то туда даже лазить не надо, я решал в точности такую же задачу некоторое время назад. И решал её следующим способом:

MN>1) через CoInitializeSecurity на клиенте убирал всю секьюрность — CoInitializeSecurity( 0, -1, 0, 0, RPC_C_AUTHN_LEVEL_NONE, RPC_C_IMP_LEVEL_IMPERSONATE, 0, EOAC_NONE, 0 );
MN>2) на сервере перед вызовом через CoSetProxyBlanket изменял настройки безопасности прокси клиентского объекта — отключал всю секьюрность для него к чёртовой бабушке: CoSetProxyBlanket( eventObj, RPC_C_AUTHN_NONE, RPC_C_AUTHZ_NONE, 0, RPC_C_AUTHN_LEVEL_NONE, RPC_C_IMP_LEVEL_IDENTIFY, 0, EOAC_NONE );
MN>А вот глобальные настройки DCOM`а на клиентской машине (там вообще Win95 стояла), кажись были выставлены по-умолчанию...

А можно поподробнее, желательно с примерами. Где конкретно эти функции вызывать. У меня серверная часть написана на VB6, клиентская на Delphi 7. Объект из клиента вызывается так:


      ITBLoader:=CoclsTBLoad.CreateRemote(mConf.ServerName);
      oTBLoader:=TclsTBLoad.Create(Application);
      oTBLoader.ConnectTo(ITBLoader);
      oTBLoader.OnChangeState:=onChangeState;
      nRet:=oTBLoader.Load();
Re[3]: DCOM & Windows 98
От: Mr. None Россия http://mrnone.blogspot.com
Дата: 13.04.04 03:53
Оценка:
Здравствуйте, shilnik, Вы писали:

S>Здравствуйте, Mr. None, Вы писали:


S>А можно поподробнее, желательно с примерами. Где конкретно эти функции вызывать. У меня серверная часть написана на VB6, клиентская на Delphi 7. Объект из клиента вызывается так:


Клиент (C++ Builder 6.0):
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
    try
    {

        CoInitializeEx(NULL, COINIT_MULTITHREADED);
    CoInitializeSecurity( 0, -1, 0, 0, RPC_C_AUTHN_LEVEL_NONE, RPC_C_IMP_LEVEL_IMPERSONATE, 0, EOAC_NONE, 0 );
    Application->Initialize();
    Application->CreateForm(__classid(TMainForm), &MainForm);
    Application->Run();
    }
    catch(Exception &exception)
    {
    Application->ShowException(&exception);
    }
}



Сервер (M$VC 7.0):
void CEvents::FireOnSomeEvent()
{
    // Интерфейс клиентский обработчика
    IClientEvents *eventObj = 0;
    // Указатель на прокси клиента у меня храниться в GIT`е
    m_spEvents.CopyTo(&eventObj);

    HRESULT hRes = CoSetProxyBlanket( eventObj,
                      RPC_C_AUTHN_NONE,
                      RPC_C_AUTHZ_NONE,
                      0,
                      RPC_C_AUTHN_LEVEL_NONE,
                      RPC_C_IMP_LEVEL_IDENTIFY,
                      0,
                      EOAC_NONE );
    hRes = eventObj->OnSomeEvent();

    eventObj->Release();
}


FireOnAsyncOpen() вызывается на сервере, когда необходимо отправить клиенту сообщение
Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.