![](/img/trans.png)
[英]CreateProcessAsUser from c++ service creates process but no console
[英]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.