作爲在登錄屏幕(用於桌面控制)中產生進程的服務運行的項目的一部分,我們調用OpenProcessToken(),然後將其複製並創建一個進程。這可以在LocalSystem下按預期成功運行,但這不適用於域帳戶。代碼片段如下...OpenProcessToken()給出「訪問被拒絕」
procedure LaunchProcess;
var dwPid, dwSessionId: DWord;
hUserToken, hProcess: THANDLE;
begin
dwPid := GetProcessID('winlogon.exe', WTSGetActiveConsoleSessionId);
hProcess := OpenProcess(MAXIMUM_ALLOWED, FALSE, dwPid);
if (not OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY or TOKEN_DUPLICATE or
TOKEN_ASSIGN_PRIMARY or TOKEN_ADJUST_SESSIONID or TOKEN_READ or TOKEN_WRITE, hUserToken)) then
raise Exception.Create('OpenProcessToken failed (' + SysErrorMessage(GetLastError) + ').');
{...go on to duplicate token, create environment and launch process...}
end;
完整的周邊支持功能的來源可以找到here。
這是它有點模糊。我瞭解OpenProcessToken()需要特權,這最終是爲什麼我得到錯誤,但是我不清楚我需要什麼特權,以及如何有效地將其分配給域帳戶。
This會提示所需的權限是SeTcbPrivilege(「作爲操作系統的一部分」)。
我已閱讀微軟頁面(無法鏈接,沒有足夠的信譽 - 對不起),這表明可以使用本地或組安全策略將SeTcbPrivilege分配給域帳戶。還有人提出,目標進程(即winlogon.exe)可能只是不允許以外的其他任何LocalSystem來獲取其令牌。
我試圖明確配置域帳戶使用賬戶的服務,但在本地安全和組策略,已經重新啓動並執行gporesult
,以確保該政策已經生效,但每次whoami /priv
回報SeTcbPrivilege被禁用
我的問題是,如果這甚至是可能的(我可以使用域帳戶獲得winlogon.exe令牌),如果是的話可以以編程方式設置權限,還是需要通過GPO? (如果是這樣,考慮到我以前的嘗試使用GPO沒有效果,它怎麼可能)
謝謝弗雷德,我給一個去今晚稍後,我只是想確認的那種我需要驅動權限激活的來源,是否像[this](https://www.nexusdb.com/support/index.php?q=node/26886)? –
對不起,這絕對是我不熟悉的一個領域。從你所說的我知道有兩個動作在這裏 - **激活**這是爲用戶分配權限的過程(大概是持久的),然後**啓用**這大概發生在調用OpenProcessToken之前()?你不僅幫助我解決了這個問題,還幫助了我解決了另一個問題,我真的很感激它,它有點尷尬,因爲你的答案應該足以讓我繼續下去,但是如果你有任何指針,API函數,這將幫助我一起真的很感激。 –
@Ross,添加或激活可以使用GPO或LSA完成,您仍然需要使用原始文章中使用的AdjustTokenPrivileges來啓用它,所以人們會認爲您知道該做什麼。是的,您必須先啓用它呼叫是需要它的。我在form.create中啓用這些進程。 – FredS