使用Vista UAC的CreateDesktop()(C Windows)

我正在使用CreateDesktop()来创建一个临时桌面,其中应用程序将运行,执行清理操作(同时保持不受影响)并终止。 一旦应用程序消失,我就关闭了桌面。 使用Windows XP甚至Vista时,一切都很好。 启用(恼人的)UAC时会出现问题。

创建桌面时一切正常,但是当您调用CreateProcess()在该桌面上打开程序时,它会导致打开的应用程序崩溃,User32.dll上出现exception。

我一直在阅读很多关于Windows上不同桌面和图层以及内存限制的内容。 但是,我打开的大多数程序(作为测试场景)都可以,但是一些程序(如IE,Notepad,Calc和我自己的应用程序)会导致崩溃。

任何人都知道为什么会在使用UAC的Vista上发生这种情况,或者更具体地针对这些特定程序? 以及如何解决这个问题?

任何人都有一个很好的例子来说明如何创建一个桌面并在那里打开一个应用程序,而无需在Vista下使用UAC切换到它?

代码表示赞赏。

谢谢

编辑:这是我正在使用的代码。

//Security SECURITY_ATTRIBUTES sa; HDESK dOld; HDESK dNew; BOOL switchdesk, switchdesk2, closedesk; int AppPid; sa.bInheritHandle = TRUE; sa.lpSecurityDescriptor = NULL; sa.nLength = sizeof(SECURITY_ATTRIBUTES); //Get handle to current desktop dOld = OpenDesktopA("default", 0, TRUE, DESKTOP_SWITCHDESKTOP| DESKTOP_WRITEOBJECTS| DESKTOP_READOBJECTS| DESKTOP_ENUMERATE| DESKTOP_CREATEWINDOW| DESKTOP_CREATEMENU); if(!dOld) { printf("Failed to get current desktop handle !!\n\n"); return 0; } //Make a new desktop dNew = CreateDesktopA("kaka", 0, 0, 0, DESKTOP_SWITCHDESKTOP| DESKTOP_WRITEOBJECTS| DESKTOP_READOBJECTS| DESKTOP_ENUMERATE| DESKTOP_CREATEWINDOW| DESKTOP_CREATEMENU, &sa); if(!dNew) { printf("Failed to create new desktop !!\n\n"); return 0; } AppPid = PerformOpenApp(SomeAppPath); if(AppPid == 0) { printf("failed to open app, err = %d\n", GetLastError()); } else { printf("App pid = %d\n", AppPid); } closedesk = CloseDesktop(dNew); if(!closedesk) { printf("Failed to close new desktop !!\n\n"); return 0; } return 0; 

编辑Bounty目前的答案无法作为答案,如果赏金的时间到期,请不要将其设置为赏金的答案。

我错误地按了“接受”。 我在CreateDesktop()中用vista和UAC再次问了这个问题(C,windows)

有趣的问题……除非启动的程序需要管理员权限(我怀疑记事本或计算方法是否存在),否则我不希望UAC /非UAC场景出现差异。 无论如何,您是否尝试在调用CreateProcess()之前设置线程的桌面?

 HDESK hOld = GetThreadDesktop( GetCurrentThreadId() ); HDESK hNew = OpenDesktop( "name", 0, FALSE, GENERIC_ALL ); SetThreadDesktop( hNew ); CreateProcess( ... ); SetThreadDesktop( hOld ); CloseDesktop( hNew );