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

时间:2009-07-27 14:15:25

标签: c uac windows-vista

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

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

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

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

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

感谢代码。

由于

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

//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;

为赏金编辑 当前的答案无法作为答案,如果赏金的时间到期,请不要将此作为赏金的答案。

我错误地按下了“接受”。我在CreateDesktop() with vista and UAC on (C, windows)

中再次提出了这个问题

1 个答案:

答案 0 :(得分:2)

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

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