Здравствуйте 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 );
}
};