CreateDesktop()与Vista的UAC(C视窗)(CreateDesktop() wit

2019-09-21 02:00发布

我使用CreateDesktop()建立一个临时的桌面,应用程序将运行,执行清除操作(而其余的方式进行),并终止。 我关闭该桌面一旦应用程序已经一去不复返了。 使用Windows XP和Vista的,甚至当一切都很好。 当您启用(烦人)UAC的问题出现。

一切都OK,当你创建一个桌面,但是当你调用CreateProcess的()到桌面它使打开的应用程序上的User32.dll异常崩溃上打开的程序。

我一直在阅读了很多关于Windows上的不同的台式机和层和内存的限制。 然而,最让我打开(如测试场景)的程序都OK,但也有少数(如IE浏览器,记事本,计算器和我自己的应用程序)会导致崩溃。

任何人有为什么发生在Vista的UAC的,或者更具体地说,这些具体的程序的任何想法? 如何解决这一问题?

任何人有关于如何创建一个桌面和那里打开一个应用程序,而不在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;

编辑赏金目前的答案propesed不能算作一个答案,请不要如果赏金的时间后其设置为答案,赏金。

我按下了“接受”的错误。 我再次问这个问题在CreateDesktop()与Vista和UAC的(C,窗口)

Answer 1:

有趣的问题......我不希望bewteen的UAC /非UAC方案的差异,除非启动所需的程序管理员权限(我怀疑记事本或钙一样)。 无论如何,你尝试过在调用CreateProcess的前设置线程的桌面()?

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


文章来源: CreateDesktop() with Vista UAC (C Windows)