поднять COM+ объект из ISAPI под другим security
От: Shurick  
Дата: 19.12.01 15:20
Оценка:
Господа!

Возникла следующая проблема:
Необходимо обратиться из ISAPI-DLL (работает в адресном пространстве IIS) к COM+ объекту с правами определенного пользователя. Более того, вызываемый COM+ объект сам определяет с какими правами его вызвали и использует их для обращения к базе данных. Необходимо "подсунуть" объекту имя пользвователя и пароль определенного пользователя.
ISAPI-DLL многопоточная, имеющая пул-потоков с правами опеределенных пользователей и ставящая в очередь задания в случае, если поток с необходимыми правами уже существует.

MSDN читал, сделал все по нему, но COM+ объект по-прежнему меня детектит, как nt authority\system.
Re: поднять COM+ объект из ISAPI под другим security
От: Lokki Зимбабве  
Дата: 19.12.01 16:22
Оценка:
Здравствуйте 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;
}
Re: поднять COM+ объект из ISAPI под другим security
От: VladD2 Российская Империя www.nemerle.org
Дата: 21.12.01 14:58
Оценка:
Здравствуйте Shurick, Вы писали:

S>Господа!


S>Возникла следующая проблема:

S>Необходимо обратиться из ISAPI-DLL (работает в адресном пространстве IIS) к COM+ объекту с правами определенного пользователя. Более того, вызываемый COM+ объект сам определяет с какими правами его вызвали и использует их для обращения к базе данных. Необходимо "подсунуть" объекту имя пользвователя и пароль определенного пользователя.
S>ISAPI-DLL многопоточная, имеющая пул-потоков с правами опеределенных пользователей и ставящая в очередь задания в случае, если поток с необходимыми правами уже существует.

S>MSDN читал, сделал все по нему, но COM+ объект по-прежнему меня детектит, как nt authority\system.


А с какими настройкаи имперсонации запускается COM+-сервер? И как получаются потоки с "с правами опеределенных пользователей"?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.