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

标签 c uac windows-vista

我正在使用 CreateDesktop() 创建一个临时桌面,应用程序将在其中运行、执行清理操作(同时保持不碍事)并终止。应用程序消失后,我将关闭该桌面。
使用 Windows XP 甚至 Vista 时一切正常。当您启用(烦人的)UAC 时,就会出现问题。

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

我一直在阅读很多有关 Windows 上不同桌面和层以及内存限制的信息。但是,我打开的大多数程序(作为测试场景)都可以,但有一些程序(如 IE、记事本、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) 中再次问了这个问题

最佳答案

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

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

关于使用 Vista UAC (C Windows) 的 CreateDesktop(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1188396/

相关文章:

c - 更快的状态检查

c - 我怎么知道一个数字是否可以从1开始递增4?

c - fork tree C,子进程PID

c - 当我尝试创建二维结构数组时出现段错误

c - list 文件中的 requestExecutionLevel 和 CopyFile() 函数失败

delphi - 如何在普通应用程序和 UAC 提升权限应用程序之间启用拖放

.net - 如何获得受信任/经过验证的发布者?

windows - Windows 上的 Node.Js - 如何清除控制台

Windows Vista 上的 mysql 配置错误

winapi - WS_EX_LAYERED 色键 - Vista 问题