在windows服务中调用其他进程失败,该如何处理

在windows服务中调用其他进程失败
如题,


BOOL GetTokenByName(HANDLE &hToken, LPWSTR lpName)
{
if (!lpName)
{
return FALSE;
}
HANDLE         hProcessSnap = NULL;
BOOL           bRet = FALSE;
PROCESSENTRY32 pe32 = { 0 };

hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hProcessSnap == INVALID_HANDLE_VALUE)
return (FALSE);

pe32.dwSize = sizeof(PROCESSENTRY32);

if (Process32First(hProcessSnap, &pe32))
{
do
{
if (!_tcscmp(pe32.szExeFile, lpName))
{
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION,
FALSE, pe32.th32ProcessID);
bRet = OpenProcessToken(hProcess, TOKEN_ALL_ACCESS, &hToken);
CloseHandle(hProcessSnap);
return (bRet);
}
} while (Process32Next(hProcessSnap, &pe32));
bRet = TRUE;
}
else
bRet = FALSE;

CloseHandle(hProcessSnap);
return (bRet);
}

BOOL RunProcess(LPCWSTR lpImage)
{
if (!lpImage)
{
return FALSE;
}
HANDLE hToken;
if (!GetTokenByName(hToken, L"EXPLORER.EXE"))
{
return FALSE;
}
STARTUPINFO si;
PROCESS_INFORMATION pi;

ZeroMemory(&si, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
si.lpDesktop = TEXT("winsta0\\default");

BOOL bResult = CreateProcessAsUser(hToken, lpImage, NULL, NULL, NULL,
FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi);
CloseHandle(hToken);
if (bResult)
{
WriteToLog("CreateProcessAsUser ok!\r\n");
}
else
{
WriteToLog("CreateProcessAsUser false!\r\n");
int iError = GetLastError();
char pp[50];
sprintf_s(pp, "error id: %d", iError);

WriteToLog(pp);
}
return bResult;
}

这段代码是网上找的,结果运行错误,在win7 64位上,GetLastError返回183错误。
------解决思路----------------------
183错误官方解释是:"当文件已存在时,无法创建该文件"