Здравствуйте Shurick, Вы писали:
S>Господа!
S>Возникла следующая проблема:
S>Необходимо обратиться из ISAPI-DLL (работает в адресном пространстве IIS) к COM+ объекту с правами определенного пользователя. Более того, вызываемый COM+ объект сам определяет с какими правами его вызвали и использует их для обращения к базе данных. Необходимо "подсунуть" объекту имя пользвователя и пароль определенного пользователя.
S>ISAPI-DLL многопоточная, имеющая пул-потоков с правами опеределенных пользователей и ставящая в очередь задания в случае, если поток с необходимыми правами уже существует.
S>MSDN читал, сделал все по нему, но COM+ объект по-прежнему меня детектит, как nt authority\system.
попробуй сделать что-нить на основе вот этого:
// dcConn.cpp : Implementation of CVbDCOMApp and DLL registration.
#include "stdafx.h"
#include "vbDCOM.h"
#include "dcConn.h"
#include "C:\personal\projects\DSAAddin\ComErr.h"
/////////////////////////////////////////////////////////////////////////////
//
STDMETHODIMP CdcConn::InterfaceSupportsErrorInfo(REFIID riid)
{
static const IID* arr[] =
{
&IID_IdcConn,
};
for (int i=0;i<sizeof(arr)/sizeof(arr[0]);i++)
{
if (InlineIsEqualGUID(*arr[i],riid))
return S_OK;
}
return S_FALSE;
}
STDMETHODIMP CdcConn::CreateEx(BSTR *szMachine, BSTR *szProgid,BSTR *szIfid, IUnknown **pR, long *rv)
{
// TODO: Add your implementation code here
CComErr cerr;
CLSID sCLSID={0};
IID sIID={0};
COSERVERINFO mSI={0};
COAUTHINFO mAI={0};
COAUTHIDENTITY mAUID={0};
IDispatch* pID=NULL;
MULTI_QI mQI={0};
try
{
cerr = CLSIDFromProgID(*szProgid,&sCLSID);
cerr = IIDFromString(*szIfid,&sIID);
mAI.dwAuthnSvc=RPC_C_AUTHN_WINNT;
mAI.dwAuthzSvc=RPC_C_AUTHZ_NONE;
mAI.pwszServerPrincName=NULL;
mAI.dwImpersonationLevel=3;
mAI.dwCapabilities=EOAC_NONE;
mAI.dwAuthnLevel=RPC_C_AUTHN_LEVEL_CALL;
mAUID.Domain=mszDom;
mAUID.Password=mszPass;
mAUID.User=mszUser;
mAUID.DomainLength=wcslen(mAUID.Domain);
mAUID.UserLength=wcslen(mAUID.User);
mAUID.PasswordLength=wcslen(mAUID.Password);
mAUID.Flags=SEC_WINNT_AUTH_IDENTITY_UNICODE;
mAI.pAuthIdentityData=&mAUID;
mSI.pwszName=*szMachine;
mSI.pAuthInfo=&mAI;
mQI.pIID=&sIID;
cerr=CoCreateInstanceEx(sCLSID,NULL,CLSCTX_REMOTE_SERVER,&mSI,1,&mQI);
cerr = CoSetProxyBlanket(
mQI.pItf,
RPC_C_AUTHN_WINNT,
RPC_C_AUTHZ_NONE,
NULL,
RPC_C_AUTHN_LEVEL_CALL,
2,
&mAUID,
0);
}
catch (CComErr * ce)
{
return ce->m_hr;
}
CComPtr<IUnknown> pIDSP;
pIDSP=mQI.pItf;
pIDSP.CopyTo(pR);
return S_OK;
}
STDMETHODIMP CdcConn::SetCreds(BSTR *szUser, BSTR *szPass, BSTR *szDom, long *rv)
{
// TODO: Add your implementation code here
mszDom=::SysAllocString(*szDom);
mszUser=::SysAllocString(*szUser);
mszPass=::SysAllocString(*szPass);
return S_OK;
}