Здравствуйте! Прошу сильно не бить за повтор вопроса — я перерыл весб форум однако вопрос так и не разрешился.
Задача:
Есть два офиса, соединенные выделенкой, в одном офисе есть БД, 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+ компоненту находящемуся в другом домене?
Заранее спасибо!