我遇到了有关 Windows SYSTEM 帐户的奇怪现象。查看以 SYSTEM 身份启动进程的三种不同方法:
- Sysinternals PSExec
- 任务计划程序
- GPO 启动脚本。
使用这些方法启动的进程导致不同的访问令牌组成员资格!
任务计划程序启动的进程在其访问令牌中拥有完整的组集。
另一方面,PSExec/启动脚本启动的进程的访问令牌中的组数大大减少——只有这四个
BUILTIN\Administrators (S-1-5-32-544)
Everyone (S-1-1-0)
NT AUTHORITY\Authenticated Users (S-1-5-11)
Mandatory Label\System Mandatory Level (S-1-16-16384)
有人知道这是为什么吗?
上下文:
在尝试将文件添加到使用启动脚本或 PSExec 启动的进程中的传输时,BITS 服务会抛出“用户尚未登录到网络”0x800704DD 错误 - 使用任务计划程序启动的进程时可以正常工作。
所有测试均在 Windows 10 1703 上进行;组成员身份取自 whoami /all 和 Sysinternals Process Explorer
答案1
这取决于服务的配置方式,更具体地说取决于服务 SID 类型。
如果服务 SID 类型为“无”,则服务只会获得一个普通的 SYSTEM 令牌,与其他系统进程(如services.exe
和winlogon.exe
等)使用的令牌相同。这是传统情况;在 Windows XP 中,所有服务都有这种令牌,除非它们被配置为以特定用户帐户运行。
如果服务 SID 类型为“受限”或“不受限制”,则会为该服务生成更具体的令牌,包括特定于该服务的特殊安全标识符,例如,NT SERVICE\Schedule
用于任务计划程序。这有助于在不同服务之间提供一定的粒度。在 Windows 7 及更高版本中,大多数内置服务都是“不受限制的”。组策略服务是一个例外;这可能是微软的疏忽。(我原本以为这是向后兼容的刻意选择,但由于 Windows 7 中它始终在共享服务进程中运行,因此这一点被削弱了。)
正如您已经观察到的那样,除了获取NT SERVICE
标识符之外,令牌还被赋予了许多其他标识符。据我所知,这没有记录在案,但也不特别令人惊讶;它使服务令牌更像交互式令牌,这很有用。(对于受限制的令牌来说,这种情况尤其重要,否则这些令牌将几乎没有访问权限。)
如自答中所述,当多个服务由单个进程共享时,进程令牌必须包含任何服务所需的每个 SID。因此,如果组策略服务(或 SID 类型为“无”的任何其他服务)与“不受限制”的服务共享进程,它将获得与自身“不受限制”时完全相同的令牌。
由于早期版本的 Windows 实际上是以“不受限制”的方式运行组策略服务的,而且即使 Windows 10 在内存非常有限的机器上也是如此,因此可能不会也重新配置组策略服务的 SID 类型很危险如果绝对有必要。除了作为一种短期解决方案之外,我不推荐这种方法,部分原因是仍然存在一些风险(特别是关于向前兼容性),但主要是因为每次升级到新版本的 Windows 10 时,该设置都可能会被恢复。
更好的解决方法是让启动脚本运行计划任务或安装并运行服务来代表启动脚本执行所需的任何工作。
答案2
我找到了问题的根源 — — 至少对于启动脚本而言。
我查看了调用堆栈,发现启动脚本是通过以下方式调用的:
svchost.exe (hosts gpsvc) > gpscript.exe > cmd.exe
所有三个进程的访问令牌中都有一组减少的组成员身份。事实证明,如果您的内存超过 3.5 GB,那么从 Windows 10 1703 开始,svchost 服务不再分组。 https://docs.microsoft.com/en-us/windows/application-management/svchost-service-refactoring
svchost 的每个服务都有自己的进程 - 在访问令牌中具有不同的组成员身份(此背景仍不清楚,非常感谢大家的参与!)。幸运的是,有一个选择退出:
解决方案:
添加注册表值
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\gpsvc\SvcHostSplitDisable=1 [DWORD]
将服务 gpsvc 保留在主 svchost 进程中,并具有完整的组成员资格 - 即使内存超过 3.5 GB。因此,gpscript.exe 和启动脚本将使用完整的成员资格集进行调用。
对我来说,为什么具有相同用户的进程可以在其访问令牌中拥有不同的组成员身份集(而实际成员身份没有改变)仍然非常不清楚。我很感激对此的任何意见。
不幸的是,经过这一切之后:BITS 服务仍然不接受文件传输,并抛出“用户尚未登录网络”0x800704DD。我为此提出了一个新问题https://stackoverflow.com/questions/51009804/how-to-start-a-bits-download-as-system-account-current-error-user-has-not-log