#c #windows #windows-vista
#c #Windows #windows-vista
Вопрос:
Я написал следующую функцию в своем мониторе принтера. Если я сохраню свой exe-файл в каталоге Sys32, он будет работать нормально, но как L»c:1MyApp.exe «он никогда не запускает exe-файл. Я использую систему Windows VISTA.
Кто-нибудь может мне помочь в этом?
BOOL StartProcess(PROCESS_INFORMATION *pi, STARTUPINFO *si)
{
BOOL bResult = FALSE;
DWORD dwSessionId = 0,explorerPid = 0;
HANDLE hUserTokenDup = NULL,hPToken=NULL,hProcess=NULL, hUserToken = NULL;
DWORD dwCreationFlags, zp;
LPVOID pEnv =NULL;
DWORD winlogonSessId;
TOKEN_PRIVILEGES tp;
LUID luid;
wchar_t buff[300];
// get session ID
dwSessionId = GetSessionID();
//////////////////////////////////////////
// Find the explorer.exe process
////////////////////////////////////////
PROCESSENTRY32 procEntry;
HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hSnap == INVALID_HANDLE_VALUE)
{
wsprintf(buff,L"StartProcess - INVALID_HANDLE_VALUE %dn",__LINE__);
syslog3(buff);
return FALSE;
}
procEntry.dwSize = sizeof(PROCESSENTRY32);
if (!Process32First(hSnap, amp;procEntry))
{
wsprintf(buff,L"StartProcess - Process32First fails %dn",__LINE__);
syslog3(buff);
return FALSE;
}
do
{
if (wcscmp(procEntry.szExeFile, L"explorer.exe") == 0)
{
// We found a explorer process...
// make sure it's running in the console session
winlogonSessId = 0;
if (ProcessIdToSessionId(procEntry.th32ProcessID, amp;winlogonSessId)
amp;amp; winlogonSessId == dwSessionId)
{
explorerPid = procEntry.th32ProcessID;
break;
}
}
} while (Process32Next(hSnap, amp;procEntry));
////////////////////////////////////////////////////////////////////////
dwCreationFlags = NORMAL_PRIORITY_CLASS | CREATE_NEW_CONSOLE;
ZeroMemory(si, sizeof(STARTUPINFO));
si->cb= sizeof(STARTUPINFO);
si->lpDesktop = L"winsta0\default";
si->wShowWindow = SW_SHOW;
si->dwFlags = STARTF_USESHOWWINDOW;
//ZeroMemory(pi, sizeof(pi));
hProcess = OpenProcess(MAXIMUM_ALLOWED, FALSE, explorerPid);
if(!::OpenProcessToken(hProcess,TOKEN_DUPLICATE|TOKEN_ASSIGN_PRIMARY|TOKEN_ADJUST_SESSIONID
|TOKEN_READ|TOKEN_WRITE,amp;hPToken))
{
SendInfoMessage(TEXT(LNG_ERROR_OPEN_TOKEN),MB_OK, amp;zp);
goto Cleanup;
}
if (!LookupPrivilegeValue(NULL,SE_DEBUG_NAME,amp;luid))
{
goto Cleanup;
}
tp.PrivilegeCount = 1;
tp.Privileges[0].Luid =luid;
tp.Privileges[0].Attributes =SE_PRIVILEGE_ENABLED;
if(!DuplicateTokenEx(hPToken,MAXIMUM_ALLOWED,NULL,
SecurityIdentification,TokenPrimary,amp;hUserTokenDup))
{
goto Cleanup;
}
SetTokenInformation(hUserTokenDup,
TokenSessionId,(void*)dwSessionId,sizeof(DWORD));
if(!AdjustTokenPrivileges(hUserTokenDup,FALSE,amp;tp,sizeof(TOKEN_PRIVILEGES),
(PTOKEN_PRIVILEGES)NULL,NULL))
{
goto Cleanup;
}
pEnv = NULL;
if(CreateEnvironmentBlock(amp;pEnv,hUserTokenDup,TRUE))
{
dwCreationFlags |= CREATE_UNICODE_ENVIRONMENT;
}
else
pEnv = NULL;
wsprintf(buff,L"Now Executing File %dn",__LINE__);
syslog3(buff);
// Launch the process in the client's logon session.
bResult = CreateProcessAsUser(
hUserTokenDup, // client's access token
L"C:\1\MyApp.exe",
NULL, // command line
NULL, // pointer to process SECURITY_ATTRIBUTES
NULL, // pointer to thread SECURITY_ATTRIBUTES
FALSE, // handles are not inheritable
dwCreationFlags, // creation flags
pEnv, // pointer to new environment block
NULL, // name of current directory
si, // pointer to STARTUPINFO structure
pi // receives information about new process
);
RevertToSelf();
DestroyEnvironmentBlock(pEnv);
wsprintf(buff,L"After Executing File %dn",__LINE__);
syslog3(buff);
Cleanup:
//Perform All the Close Handles tasks
if (hUserToken != INVALID_HANDLE_VALUE)
CloseHandle(hUserToken);
if (hProcess != INVALID_HANDLE_VALUE)
CloseHandle(hProcess);
if (hUserTokenDup != INVALID_HANDLE_VALUE)
CloseHandle(hUserTokenDup);
if (hPToken != INVALID_HANDLE_VALUE)
CloseHandle(hPToken);
return bResu<
}
Комментарии:
1. Какое значение возвращает CreateProcessAsUser? Если оно возвращает ноль (указывает на ошибку), что возвращает функция GetLastError()?
2. Я не получаю возвращаемое значение функции CreateProcessAsUser и, следовательно, не могу проверить значение GetLastError. Для exe, присутствующего в каталоге Sys32, я получаю возвращаемое значение как 0 для функции CreateProcessAsUser.
3. @NatashsaD Вы действительно получаете возвращаемое значение. Вы не можете не получить возвращаемое значение из функции! Вы сохраняете его в
bResult
. Пожалуйста, скажите, что это?
Ответ №1:
Вы написали «но как L»c:1MyApp.exe «он никогда не запускает exe-файл». Ты имел в виду, что я»c:\1\MyApp.exe «? Проверьте возвращаемое значение из GetLastError(). Это могут быть права доступа к NTFS / файл не найден или любое другое, знание кода ошибки поможет вам начать.