BOOL (WINAPI* CreateProcessWithLogonW)(
LPCWSTR lpUsername, // user's name
LPCWSTR lpDomain, // user's domain
LPCWSTR lpPassword, // user's password
DWORD dwLogonFlags, // logon option
LPCWSTR lpApplicationName, // executable module name
LPWSTR lpCommandLine, // command-line string
DWORD dwCreationFlags, // creation flags
LPVOID lpEnvironment, // new environment block
LPCWSTR lpCurrentDirectory, // current directory name
LPSTARTUPINFOW lpStartupInfo, // startup information
LPPROCESS_INFORMATION lpProcessInfo // process information
);
//
// process
//
//
// 0 - success
// 1 - auth error
// 3 - create proc error
// 2 - MultiByteToWideChar error
// 4 - LoadLibrary error
int RunAs(char *szModule, char *szParam, char *szDomain, char *szUser, char *szPswd, DWORD dwFlags )
{
int iRet = 2; // default: unicode translate error
int iLen = 0;
wchar_t *wDom = NULL;
wchar_t *wUsr = NULL;
wchar_t *wPss = NULL;
wchar_t *wMod = NULL;
wchar_t *wPar = NULL;
STARTUPINFOW l_StartupInfo;
ZeroMemory(&l_StartupInfo, sizeof(l_StartupInfo));
l_StartupInfo.cb = sizeof(l_StartupInfo);
PROCESS_INFORMATION l_ProcessInfo;
DWORD dwErr = 0;
HMODULE hMod = LoadLibrary("advapi32.dll");
if( hMod == NULL )
{
// ERROR
return 4;
}
else
{
*((DWORD*)&CreateProcessWithLogonW) = (DWORD)GetProcAddress(hMod, "CreateProcessWithLogonW");
if ( CreateProcessWithLogonW == NULL )
{
// ERROR
return 4;
}
}
// calc unicode len
iLen = MultiByteToWideChar( CP_ACP, 0, szDomain, -1, NULL, 0 );
if(iLen != 0 )
{
wDom = new wchar_t[iLen + 1];
if( MultiByteToWideChar( CP_ACP, 0, szDomain, -1, wDom, iLen ) != 0 )
{
iLen = MultiByteToWideChar( CP_ACP, 0, szUser, -1, NULL, 0 );
if( iLen != 0 )
{
wUsr = new wchar_t[iLen + 1];
if( MultiByteToWideChar( CP_ACP, 0, szUser, -1, wUsr, iLen ) != 0 )
{
iLen = MultiByteToWideChar( CP_ACP, 0, szPswd, -1, NULL, 0 );
if( iLen != 0 )
{
wPss = new wchar_t[iLen + 1];
if( MultiByteToWideChar( CP_ACP, 0, szPswd, -1, wPss, iLen ) )
{
iLen = MultiByteToWideChar( CP_ACP, 0, szModule, -1, NULL, 0 );
if( iLen != 0 )
{
wMod = new wchar_t[iLen + 1];
if( MultiByteToWideChar( CP_ACP, 0, szModule, -1, wMod, iLen ) )
{
iLen = MultiByteToWideChar( CP_ACP, 0, szParam, -1, NULL, 0 );
if( iLen != 0)
{
wPar = new wchar_t[iLen + 1];
if( MultiByteToWideChar( CP_ACP, 0, szParam, -1, wPar, iLen ) )
{
//////////////////////////////
if( !CreateProcessWithLogonW(wUsr, wDom, wPss, dwFlags, wMod, wPar, 0, NULL, NULL, &l_StartupInfo, &l_ProcessInfo) )
{
// ERROR
dwErr = GetLastError();
// authentification error
if( dwErr == 1326 )
{
iRet = 1;
}
else
{
iRet = 3;
}
}
else
{
// SUCCESSED
iRet = 0;
}
//////////////////////////////////////////
}
delete[] wPar;
}
}
delete[] wMod;
}
}
delete[] wPss;
}
}
delete[] wUsr;
}
}
delete[] wDom;
}
FreeLibrary(hMod);
return iRet;
}
|