1

作为作为服务运行的项目的一部分,该服务在登录屏幕(用于桌面控制)中生成一个进程,我们调用 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 的尝试没有效果,这怎么可能)

4

2 回答 2

1
  1. 您可以使用 LsaAddAccountRights 激活权限,您仍然需要至少注销/重新启动。
  2. 然后,您需要在代码中启用这些权限的权限。对于本地系统,很多事情会自动发生,而不会发生在用户身上。
  3. 为了快速测试,我激活并启用了 SE_TCB_NAME、SE_ASSIGNPRIMARYTOKEN_NAME 和 SE_INCREASE_QUOTA_NAME
  4. 然后我能够成功调用 OpenProcessToken 只使用 TOKEN_DUPLICATE
  5. 激活这些权限后,我会在注销/登录后获得一个新的 SessionID。SessionID 为 2,因此您对 WTSGetActiveConsoleSessionId 的调用将错误地返回 1

所有这些都是作为提升的管理员完成的

于 2016-10-03T16:55:46.450 回答
0

当您以管理员权限运行应用程序时,您的应用程序是否成功运行?如果是这样,请转到您的项目选项,选择应用程序并选中清单文件下的“启用管理员权限”。

于 2016-10-03T08:42:34.780 回答