我有一个程序,直接运行则可以修改桌面,做了一个守护服务(发现进程不在就启动),在服务里面创建进程,这个时候进程是SYSTEM用户.用了CreateProcessAsUser()后,总算是Administrator用户了,可是桌面死活改不了,请大家帮忙!
//下面是服务程序中的代码
HANDLE hExp = GetProcessHandle("EXPLORER.EXE");
if(hExp == NULL)
return FALSE; OpenProcessToken(hExp,TOKEN_ALL_ACCESS,&hToken);
if(hToken == NULL)
return FALSE; ZeroMemory(&si, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
si.lpDesktop = "winsta0\\default"; TCHAR szParameter[10] = {0}; if(CreateProcessAsUser(hToken,lpAppName,szParameter,NULL,
NULL,FALSE,CREATE_NO_WINDOW,NULL,NULL,&si,&pi))
{
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
}
//下面是服务程序中的代码
HANDLE hExp = GetProcessHandle("EXPLORER.EXE");
if(hExp == NULL)
return FALSE; OpenProcessToken(hExp,TOKEN_ALL_ACCESS,&hToken);
if(hToken == NULL)
return FALSE; ZeroMemory(&si, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
si.lpDesktop = "winsta0\\default"; TCHAR szParameter[10] = {0}; if(CreateProcessAsUser(hToken,lpAppName,szParameter,NULL,
NULL,FALSE,CREATE_NO_WINDOW,NULL,NULL,&si,&pi))
{
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
}
解决方案 »
- 切分窗口并添加listbox控件后如何实现连个窗口的同步下拉
- 圆形控制的实现,以及图片旋转任意角度
- 用RecordsetPtr操作ACCESS数据库出现在问题!!!
- 有关使用RasDial函数进行拨号的问题?
- ADO连Oracle正常编译运行出错.
- 线程里SetTimer的问题,急死了,谢谢各位高手了。
- 关于音频分析
- 问几个系统ID
- 非计算机专业大四学生该如何选择?
- @@@@@%%%%%%%汉字!烦人的汉字!急急!大虾门~~~各位老大,菜鸟有问题:如何提取汉字的点阵字库?什么内码啊,点阵啊,俺头大,各位高手不妨进来坐坐……&&&&&&&********
- 多线程,UDP,数据库的问题
- 请问这是什么问题????
调用设置桌面的函数后,GetLastError()看下
原因是服务程序是和登陆用户无关的,先于WinLogon,而桌面是和用户相关的,一个用户对应一个或多个桌面——当然,只有一个是可见的。
由于修改桌面的程序是被服务程序启动的,因此无法得到用户的信息。
看了一些牛人说可以用DACL和ACEs来做,可是改过后还是不行。因为我对DACL和ACEs不熟,所以希望能有人指点一下。
2 http://www.osronline.com/showthread.cfm?link=102869
HDESK hdesk;
HWINSTA hwinsta;
PROCESS_INFORMATION pi;
PSID psid;
STARTUPINFO si; HANDLE hExp = GetProcessHandle("EXPLORER.EXE");
if(hExp == NULL)
return FALSE; OpenProcessToken(hExp,TOKEN_ALL_ACCESS,&hToken);
if(hToken == NULL)
return FALSE; HWND hDesk = GetDesktopWindow();
// BOOL bOk = ImpersonateLoggedOnUser(hToken);
// GenericLog(Info,"ImpersonateLoggedOnUser %s",bOk?"Ok":"Failed");
GenericLog(Info,"Desktop HWND %s",(hDesk == GetDesktopWindow())?"Equal":"Not Equal");
//
// obtain a handle to the interactive windowstation
//
hwinsta = OpenWindowStation(
"winsta0",
FALSE,
READ_CONTROL | WRITE_DAC
);
if (hwinsta == NULL)
return RTN_ERROR; HWINSTA hwinstaold = GetProcessWindowStation();
GenericLog(Info,"WindowStation Old = %.8x,Curr = %.8x",hwinstaold,hwinsta);
//
// set the windowstation to winsta0 so that you obtain the
// correct default desktop
//
if (!SetProcessWindowStation(hwinsta))
return RTN_ERROR; //
// obtain a handle to the "default" desktop
//
hdesk = OpenDesktop(
"default",
0,
FALSE,
READ_CONTROL | WRITE_DAC |
DESKTOP_WRITEOBJECTS | DESKTOP_READOBJECTS
);
if (hdesk == NULL)
return RTN_ERROR; //
// obtain the logon sid of the user fester
//
if (!ObtainSid(hToken, &psid))
return RTN_ERROR; //
// add the user to interactive windowstation
//
if (!AddTheAceWindowStation(hwinsta, psid))
return RTN_ERROR; //
// add user to "default" desktop
//
if (!AddTheAceDesktop(hdesk, psid))
return RTN_ERROR; //
// free the buffer for the logon sid
//
RemoveSid(&psid); //
// close the handles to the interactive windowstation and desktop
//
CloseWindowStation(hwinsta); CloseDesktop(hdesk);
// ZeroMemory(&si, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
si.lpDesktop = "winsta0\\default"; TCHAR szParameter[10] = {0};
// ShellExecute(NULL,"open",lpAppName,NULL,NULL,SW_HIDE);
if(CreateProcessAsUser(hToken,lpAppName,szParameter,NULL,
NULL,FALSE,CREATE_NO_WINDOW,NULL,NULL,&si,&pi))
{
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
GenericLog(Info,"Running %s ....",lpAppName);
UnregisteTimer(TIMER_CONNECT);
RegisteTimer(TIMER_FEEDDOG,3000);
return 1;
}
else
{
GenericLog(Info,"CreateProcess %s Fails ,reason = %d",lpAppName,GetLastError());
}
SetProcessWindowStation(hwinstaold);
return RTN_OK;
又,我的服务程序是用OpenProcessToken打开EXPLORER.EXE的令牌.在调用CreateProcessAsUser前调用ImpersonateLoggedOnUser,在调用完CreateProcessAsUser()后调用RevertToSelf().
在XP下测试没问题,怎么在Win2000下又不好使了呢?