2016-10-02 225 views
1

作爲在登錄屏幕(用於桌面控制)中產生進程的服務運行的項目的一部分,我們調用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沒有效果,它怎麼可能)

回答

0

當您以管理員權限運行它時,您的應用程序是否成功運行?如果是這樣,請轉到您的項目選項,選擇應用程序並在清單文件下選中「啓用管理員權限」。

0
  1. 您可以使用LsaAddAccountRights激活權限,您仍然需要至少註銷/可能重新啓動。
  2. 然後您需要在代碼中爲這些權限啓用權限。許多事情自動發生在本地系統上,而不是用戶。
  3. 對於一個快速測試我激活和啓用SE_TCB_NAME,SE_ASSIGNPRIMARYTOKEN_NAME和SE_INCREASE_QUOTA_NAME
  4. 當時我能夠成功調用OpenProcessToken只有TOKEN_DUPLICATE
  5. 激活這些權給了我一個新的SessionID註銷/後。 2的SessionID所以你要WTSGetActiveConsoleSessionId調用將有虛假返回1

所有這一切都做的升高管理員

+0

謝謝弗雷德,我給一個去今晚稍後,我只是想確認的那種我需要驅動權限激活的來源,是否像[this](https://www.nexusdb.com/support/index.php?q=node/26886)? –

+0

對不起,這絕對是我不熟悉的一個領域。從你所說的我知道有兩個動作在這裏 - **激活**這是爲用戶分配權限的過程(大概是持久的),然後**啓用**這大概發生在調用OpenProcessToken之前()?你不僅幫助我解決了這個問題,還幫助了​​我解決了另一個問題,我真的很感激它,它有點尷尬,因爲你的答案應該足以讓我繼續下去,但是如果你有任何指針,API函數,這將幫助我一起真的很感激。 –

+0

@Ross,添加或激活可以使用GPO或LSA完成,您仍然需要使用原始文章中使用的AdjustTokenPrivileges來啓用它,所以人們會認爲您知道該做什麼。是的,您必須先啓用它呼叫是需要它的。我在form.create中啓用這些進程。 – FredS