簡體   English   中英

CreateProcessAsUser創建空白/黑色窗口

[英]CreateProcessAsUser creates blank/black window

我正在使用CreateProcessAsUser在用戶指定的憑據下創建一個進程。

我希望發布代碼的相關部分。 讓我知道您是否想看更多。

第一個LogonUser獲得令牌:

result = LogonUser(
        username,
        wcschr(username, '@') ? NULL : (domain ? domain : L"."),
        password,
        LOGON32_LOGON_INTERACTIVE,
        LOGON32_PROVIDER_DEFAULT,
        &hrunastoken);

然后,我加載配置文件,將STARTUPINFO結構的lpDesktop值設置為NULL(這使其使用調用進程的桌面),然后調用CreateProcessAsUser:

result = CreateProcessAsUser(
        hrunastoken,
        NULL,
        apptorun,
        NULL,
        NULL,
        FALSE,
        CREATE_UNICODE_ENVIRONMENT,
        envblock ? envblock : NULL,
        NULL,
        &si,
        &pi);

這可以正常工作-登錄並成功創建進程,然后進程“運行”。 問題在於它創建的窗口是黑色的,如以下以我的程序開始的記事本過程的屏幕截圖所示:

記事本屏幕截圖

可能相關的上下文:

我的帳戶是具有完全管理員權限的Windows 7計算機上的本地帳戶,並且已使用該帳戶登錄。 我使用psexec(Sysinternals實用程序)打開在本地系統帳戶下交互運行的命令提示符。 我正在從該命令提示符啟動程序。 我要傳遞給它的憑據來自我的帳戶。

我沒有對windowstations / desktop進行任何權限; 我假設我創建的進程應具有這些權限,因為該進程是在會話中創建的,並且使用與我已經登錄的帳戶相同的權限-盡管首先要通過SYSTEM帳戶。 使用Process Explorer,我看不到通過程序打開或正常打開的進程對windowstation / desktop的值和句柄的權限的任何區別。 也許這是完全不相關的。

我也不能使用CreateProcessWithLogonW函數,因為它必須在從SYSTEM帳戶運行時必須可以工作-該函數以及Windows附帶的“ runas”程序在SYSTEM下不能工作。

有趣的是,除非我在SYSTEM帳戶下運行它,否則無法使用當前方法打開進程,因為“客戶端未擁有所需的特權”,因此無法比較啟動我的窗口時創建的窗口。我的帳戶與SYSTEM帳戶下的程序...

窗口站和桌面的默認DACL授予對登錄SID(對於當前登錄會話是唯一的)的完全訪問權限,而不是對用戶的SID的完全訪問權限。 (用戶的SID也出現在窗口站的DACL中,但只有有限的權限。它沒有出現在桌面DACL中。)

LogonUser的調用將生成一個新會話(和關聯的登錄SID),而不是重用現有會話,因此您的進程無權訪問桌面,而對Window Station的訪問卻很少。 (實際上,我對進程如何管理完全有些困惑;當我嘗試重現您的結果時,該進程立即退出,退出代碼為0xC0000142,如預期的那樣。)

此答案中的第二段代碼顯示了如何更改窗口站和桌面上的DACL,以使進程正常運行。 (但是,這可能不是最佳解決方案,具體取決於您的特定目標。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM