15,472
社区成员
发帖
与我相关
我的任务
分享
#include <windows.h>
#include <stdio.h>
#include <userenv.h>
#pragma comment(lib, "Advapi32.lib")
#pragma comment(lib, "Userenv.lib")
#ifdef UNICODE
#define RunAsUser RunAsUserW
#else
#define RunAsUser RunAsUserA
#endif
BOOL WINAPI RunAsUserW(LPCWSTR userName, LPCWSTR pswd, LPWSTR application)
{
BOOL bRet = FALSE;
do
{
DWORD dwSize = MAX_PATH;
HANDLE hToken;
LPVOID lpvEnv;
PROCESS_INFORMATION pi = {0};
STARTUPINFOW si = {sizeof(STARTUPINFO)};
wchar_t szUserProfile[MAX_PATH] = {0};
if (!LogonUserW(userName,
L".",
pswd,
LOGON32_LOGON_INTERACTIVE,
LOGON32_PROVIDER_DEFAULT,
&hToken))
{
break;
}
if (!CreateEnvironmentBlock(&lpvEnv, hToken, TRUE))
{
break;
}
if (!GetUserProfileDirectoryW(hToken, szUserProfile, &dwSize))
{
break;
}
if (!CreateProcessWithLogonW(userName,
NULL,
pswd,
LOGON_WITH_PROFILE,
NULL,
application,
CREATE_UNICODE_ENVIRONMENT,
NULL,
szUserProfile,
&si,
&pi))
{
DestroyEnvironmentBlock(lpvEnv);
break;
}
DestroyEnvironmentBlock(lpvEnv);
CloseHandle(hToken);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
bRet = TRUE;
} while (FALSE);
return bRet;
}
BOOL WINAPI RunAsUserA(LPCSTR userName, LPCSTR pswd, LPSTR application)
{
BOOL bRet = FALSE;
LPWSTR wUName = NULL;
LPWSTR wPswd = NULL;
LPWSTR wApp = NULL;
do
{
unsigned int nameLen = strlen(userName);
unsigned int pswdLen = strlen(pswd);
unsigned int appLen = strlen(application);
wUName = (LPWSTR)malloc((nameLen + 1) * sizeof(wchar_t));
wPswd = (LPWSTR)malloc((pswdLen + 1) * sizeof(wchar_t));
wApp = (LPWSTR)malloc((appLen + 1) * sizeof(wchar_t));
if(!wUName || !wPswd || !wApp)
{
break;
}
memset(wUName, 0, (nameLen + 1) * sizeof(wchar_t));
memset(wPswd, 0, (pswdLen + 1) * sizeof(wchar_t));
memset(wApp, 0, (appLen + 1) * sizeof(wchar_t));
MultiByteToWideChar(GetACP(), 0, userName, nameLen, wUName, nameLen + 1);
MultiByteToWideChar(GetACP(), 0, pswd, pswdLen, wPswd, pswdLen + 1);
MultiByteToWideChar(GetACP(), 0, application, appLen, wApp, appLen + 1);
bRet = RunAsUserW(wUName, wPswd, wApp);
} while (FALSE);
if(wUName)
{
free(wUName);
}
if(wPswd)
{
free(wPswd);
}
if(wApp)
{
free(wApp);
}
return bRet;
}
int main(int argc, char** argv)
{
if(argc != 4)
{
printf("Usage: %s username password application\n", argv[0]);
return 1;
}
if(!RunAsUser(argv[1], argv[2], argv[3]))
{
printf("创建进程失败\n");
}
return 0;
}