Re[14]: Как воспользоваться Cloaking?
От: Konstantin Sokolovskiy  
Дата: 28.02.02 14:25
Оценка:
Здравствуйте Lexey, Вы писали:

L>У меня тут другой вопрос возник, а как имперсонация делается?


Вот код класса, отвечающего за это дело:

class CPwdacImpersonator
{
public:
    CPwdacImpersonator( void )
        : m_loggedUser( GetUserName(), GetDomain(), GetPassword() )
    {
        m_impersonated = !m_loggedUser ? false : ::ImpersonateLoggedOnUser( m_loggedUser ) != FALSE;
    }
    ~CPwdacImpersonator( void )
    {
        if( m_impersonated )
        {
            ::RevertToSelf();
        }
    }
    operator bool() const
    {
        return( m_impersonated );
    }
protected:
    class LoggedUser
    {
    public:
        LoggedUser( LPCTSTR lpszUserName, LPCTSTR lpszDomain, LPCTSTR lpszPassword )
        {
            if( !::LogonUser(
                const_cast< LPTSTR >( lpszUserName ),
                const_cast< LPTSTR >( lpszDomain ),
                const_cast< LPTSTR >( lpszPassword ),
                LOGON32_LOGON_BATCH,
                LOGON32_PROVIDER_DEFAULT,
                &m_hToken ) )
            {
                m_hToken = NULL;
            }
        }
        ~LoggedUser( void )
        {
            if( m_hToken != NULL )
            {
                ::CloseHandle( m_hToken );
            }
        }
        operator HANDLE() const
        {
            return( m_hToken );
        }
        operator !() const
        {
            return( m_hToken == NULL );
        }
    protected:
        HANDLE m_hToken;
    };
protected:
    bool m_impersonated;
    TString m_userName;
    TString m_domain;
    TString m_password;
    LoggedUser m_loggedUser;
protected:
    LPCTSTR GetUserName( void )
    {
        _ASSERTE( _Module.m_pRegData != NULL );
        return( m_userName = _Module.m_pRegData->m_service.m_impersonation.m_userName );
    }
    LPCTSTR GetDomain( void )
    {
        _ASSERTE( _Module.m_pRegData != NULL );
        return( m_domain = _Module.m_pRegData->m_service.m_impersonation.m_domain );
    }
    LPCTSTR GetPassword( void )
    {
        _ASSERTE( _Module.m_pRegData != NULL );
        return( m_password = _Module.m_pRegData->m_service.m_impersonation.m_password );
    }
};
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.