CreateProcessAsUser && Services problem
От: Ayreon85 Украина  
Дата: 14.01.08 09:03
Оценка:
Я пишу сервис. На виртуальной машине, на которой я его тестирую стоит WinXP с FUS. Сервис при получении WTS_SESSION_LOGON:
case WTS_SESSION_LOGON:
Sleep(2000);
{
HANDLE userToken1,userToken2;
if(!WTSQueryUserToken(lParam, &userToken1)) vncLog.Print("WTSQueryUserToken Error \n");

if (!DuplicateTokenEx( *((PHANDLE)&userToken1),MAXIMUM_ALLOWED, NULL ,SecurityImpersonation, TokenPrimary,&userToken2 ))
{
CString str;
DWORD dError = GetLastError();
str.Format("DuplicateToken1 Error — %d",dError);
vncLog.Print("%s",(LPCTSTR)str);
//return 1;
}

PROCESS_INFORMATION ppi;
STARTUPINFO ssi;

ZeroMemory(&ssi, sizeof(ssi));
ssi.cb = sizeof(ssi);
ssi.lpDesktop = "winsta0\\default";
ZeroMemory(&ppi, sizeof(ppi));


SetLastError(0);

if(!CreateProcessAsUser(userToken2,"C:\\BOX.exe",NULL,NULL,NULL,FALSE,NULL,NULL,"C:\\",&ssi, &ppi))
{

try
{
DWORD dError = GetLastError();
CString str;
str.Format("SessionID = %d \n %s \nCreateProcessAsUser1 Error — %d \n ",lParam,(LPCTSTR)strFuncName,dError);
vncLog.Print("%s",(LPCTSTR)str);


}
catch(...)
{
throw;
}
if(userToken1!=NULL) CloseHandle(userToken1);
if(userToken2!=NULL) CloseHandle(userToken2);
return 1;

}

return 0;
}
Все работает нормально, если есть Sleep(2000) перед началом ;
Вопрос — как обойтись без слипа(чего ждать, думаю что надо ждать создания "Winsta0\default" но не знаю как)
буду признателе если кто нибудь скажет что делать?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.