作为作为服务运行的项目的一部分,该服务在登录屏幕(用于桌面控制)中生成一个进程,我们调用 OpenProcessToken(),然后将其复制并创建一个进程。这在 LocalSystem 下可以按预期成功运行,但是这在域帐户下不起作用。代码片段如下...
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;
可以在此处找到周边支持功能的完整来源。
这是它变得有点模糊的地方。我知道 OpenProcessToken() 需要特权,这最终是我收到错误的原因,但是不清楚我需要什么特权,以及如何有效地将其分配给域帐户。
这表明所需的特权是 SeTcbPrivilege(“作为操作系统的一部分”)。
我已阅读有关权限的 Microsoft 页面(无法链接,没有足够的声誉 - 抱歉),这表明可以使用本地或组安全策略将 SeTcbPrivilege 分配给域帐户。也有人建议目标进程(即 winlogon.exe)可能根本不允许LocalSystem 以外的任何东西获取其令牌。
我曾尝试使用帐户服务显式配置域帐户,但在本地安全和组策略中,已重新启动并执行gporesult
以确保策略已生效,但每次whoami /priv
返回 SeTcbPrivilege 已禁用
我的问题是这是否可能(我可以使用域帐户获取 winlogon.exe 令牌),如果可以,可以通过编程方式设置权限,还是需要通过 GPO?(如果是这样,鉴于我之前使用 GPO 的尝试没有效果,这怎么可能)