Опять COM+ клиент и сервер в разных доменах
От: Mental Sky  
Дата: 19.12.02 09:10
Оценка:
Здравствуйте! Прошу сильно не бить за повтор вопроса — я перерыл весб форум однако вопрос так и не разрешился.

Задача:

Есть два офиса, соединенные выделенкой, в одном офисе есть БД, COM+ компонент (VB) для доступа к ней. В другом офисе — клиент (CPP Builder 6.0) и прокся для этого компонента. Сетевые домены этих офисов разные. Сервера — Win2k.
На стороне сервера у компонента секьюрити настроена так: активируется он от своей учетной записи, Authentication Level = Packet, Impersonation Level = Identyfy. Настроена ролевая безопасность — есть учетная запись которая имеет доступ к компоненту.

Для доступа к компоненты пробовались два метода:

1) через CoCreateInstance(CLSID_MyClass, NULL, CLSCTX_REMOTE_SERVER, IID_MyClassIface, (void**)&ifc )

В этом случае конечно получаем отлуп — я не знаю как в таком случае серверная сторона поймет — кто делает вызов.

2) через CoCreateInstanceEx(CLSID_RCCPaymentClass, NULL, CLSCTX_REMOTE_SERVER, &info, 1, &qi));

info заполняем так:

WideString wstrServerName("blahblah");
WideString wstrDomain("blahblah");
WideString wstrUser("blahblah");
WideString wstrPassword("blahblah");

COAUTHIDENTITY identity;
identity.User = (USHORT*)wstrUser.c_bstr();
identity.UserLength = wstrUser.Length();
identity.Domain = (USHORT*)wstrDomain.c_bstr();
identity.DomainLength = wstrDomain.Length();
identity.Password = (USHORT*)wstrPassword.c_bstr();
identity.PasswordLength = wstrPassword.Length();
identity.Flags = SEC_WINNT_AUTH_IDENTITY_UNICODE;

COAUTHINFO auth;
auth.dwAuthnSvc = RPC_C_AUTHN_DEFAULT;
auth.dwAuthzSvc = RPC_C_AUTHZ_NONE;
auth.pwszServerPrincName = NULL;
auth.dwAuthnLevel = RPC_C_AUTHN_LEVEL_PKT;
auth.dwImpersonationLevel = RPC_C_IMP_LEVEL_IDENTIFY;
auth.pAuthIdentityData = &identity;
auth.dwCapabilities = EOAC_NONE;

COSERVERINFO info;
memset(&info, 0, sizeof(info));
info.pwszName = wstrServerName.c_bstr();
info.pAuthInfo = &auth;



MULTI_QI qi;
memset(&qi, 0, sizeof(qi));
qi.pIID = &IID_IID_MyClassIface;

Тут такие результаты:

В сети, где это все будет работать ообще сразу получаем "RPC Server not available", хотя когда используем CoCreateInstance — получаем AcessDenied

В местной сети, но при почти равных условиях — клиент в домене — а сервер вне домена, при использовании CoCreateInstance — получать IUnknown получается только если отрубить у компонента COM+ Security. если все настроить как надо — Acсess Denied, причем компонент даже не активируется, хотя если клиент и сервер в домене — все работает.

Если пользовать CoCreateInstanceEx и при отключенной безопасность — если компонент не был активирован — то Access Denied, если я сам его вручную стартану — то получаем доступ... при настроенных секьюрити — не получаем доступ в любом случае.

Короче я не знаю уже что делать — октрывать доступ — опасно, безопастность настроена правильно — у нас в домене работает COM+ сервера и клиенты, все ок.

Вот вопросы:

Я так понимаю при CoCreateInstance мы ходим через прокси, а при CoCreateInstanceEx — не всегда? почему я получаю RPC server unavailable? почему того же не получаю при использовании CoCreateInstance? Понимаю что мало исходных данных, подскажите — я нарою

Как все таки быть в случае CoCreateInstance? как через эту команду получить доступ к COM+ компоненту находящемуся в другом домене?

Заранее спасибо!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.