Windows OpenProcess失败,返回“0”;“访问被拒绝”;

Windows OpenProcess失败,返回“0”;“访问被拒绝”;,windows,winapi,windows-services,lsa,openprocess,Windows,Winapi,Windows Services,Lsa,Openprocess,这里的问题比一个简单而有意义的标题所描述的要复杂得多 在我们的环境中,我们必须尽可能转移到集团托管服务帐户,以最大限度地降低密码暴露的风险,并最大限度地减少在这些帐户上轮换密码的操作工作量。如果没有,我们必须将无法被gMSA取代的银行账户转入保险库,这是一个巨大的痛苦 我是一个应用程序的开发人员和负责人,该应用程序使用不同广告域的多个帐户。我们有多个AD域,其中每个域都是单个域林。应用程序本身位于林A中,并在低特权帐户下运行。 当应用程序需要在林A中进行一些更改时,将使用相应的帐户表单林A。森林

这里的问题比一个简单而有意义的标题所描述的要复杂得多

在我们的环境中,我们必须尽可能转移到集团托管服务帐户,以最大限度地降低密码暴露的风险,并最大限度地减少在这些帐户上轮换密码的操作工作量。如果没有,我们必须将无法被gMSA取代的银行账户转入保险库,这是一个巨大的痛苦

我是一个应用程序的开发人员和负责人,该应用程序使用不同广告域的多个帐户。我们有多个AD域,其中每个域都是单个域林。应用程序本身位于林A中,并在低特权帐户下运行。 当应用程序需要在林A中进行一些更改时,将使用相应的帐户表单林A。森林B等也一样。这些帐户的密码存储在应用程序数据库中,并使用DPAPI加密

现在我正在考虑用GMSA替换这些帐户。为了调用LogonUser()函数来获取GMSA的令牌,调用进程必须具有SeTcbpPivilege(作为操作系统的一部分)以及本地管理组的成员。显然不是web应用程序的选项

然后我考虑在应用服务器上创建windows服务。每一项服务都以外来森林的GMSA身份运行。到目前为止,这是可行的。其思想是,应用程序获取相应windows服务进程的进程令牌,复制并模拟该令牌以接触其他域。在服务启动期间,服务会更改流程的ACL,以便每个人都能完全控制流程(用于现在和测试目的)。我认为低特权应用程序帐户可以打开进程、复制令牌等。但不幸的是,当服务进程作为windows服务运行时,OpenProcess()失败,出现错误5。当我使用RunAs.exe以非服务方式运行服务时,一切都正常。我尝试在另一个非GMSA域帐户下运行该服务,但结果相同。因此,原因不是托管帐户是GMSA

帐户类型 由启动的服务 结果 GMSA Windows服务 OpenProcess(进程查询信息)失败,错误5 用户帐户 Windows服务 OpenProcess(进程查询信息)失败,错误5 GMSA 计划任务 OpenProcess(进程查询信息)失败,错误5 用户帐户 计划任务 OpenProcess(进程查询信息)成功
关于
LogonUser
-此功能不需要SE_TCB_NAME权限,除非您登录到Passport帐户。。关于开放式服务流程-您忘记了完整性级别-服务在系统强制级别(S-1-16-16384)下运行,通常不允许写入或读取-因此具有较低强制级别的主体无法使用读/写访问权限打开您的流程。但即使可以(您可以降级进程的强制标签-用户进程必须具有模拟令牌的SeImpersonatePrivilege。但通常它没有italso OpenProcess()失败,错误5-您不需要处理open,但需要它的令牌-它们有单独的SD。当打开process时,请足够多地请求
process\u QUERY\u LIMITED\u信息
。然后您可以调用
OpenProcessToken
。但这里仍然存在系统强制级别,但没有写入。因此,您可以使用
令牌|模拟|打开它KEN_QUERY
,但如果您没有SeImpersonatePrivilege
OpenProcess(流程查询信息)
-无需-
OpenProcess(流程查询有限信息)
非常感谢@RbMm的评论。第一步是打开进程以获取进程句柄。第二步是在进程句柄上调用OpenProcessToken。但我还没到那个程度。我想我必须熟悉强制级别。再次感谢您的线程没有SeImpersonatePrivilege权限-即使您获得了令牌-这对您没有帮助。模拟级别将降级为
安全性\u标识
。另请注意-如果您只需要
OpenProcessToken