凌云的博客

行胜于言

Service User Accounts[译]

分类:windows| 发布时间:2024-12-31 22:09:00

概述

原文:Service User Accounts

每个服务都在用户账户的安全上下文中执行。 账户的用户名和密码是在服务安装时通过 CreateService 函数指定的。 用户名和密码可以通过 ChangeServiceConfig 函数进行更改。 你可以使用 QueryServiceConfig 函数获取与服务对象关联的用户名(但不能获取密码)。 服务控制管理器(SCM)会自动加载用户配置文件。

当启动服务时,SCM 会登录到与该服务关联的账户。 如果登录成功,系统会生成一个访问令牌并将其附加到新的服务进程。 这个令牌在随后的所有与可安全操作的对象(即具有安全描述符的对象)交互中,标识服务进程。 例如,如果服务尝试打开一个管道句柄,系统会在授权访问之前,将服务的访问令牌与管道的安全描述符进行比较。

SCM 不会维护服务用户账户的密码。 如果密码过期,登录将失败,服务也无法启动。 分配账户给服务的系统管理员可以创建密码永不过期的账户。 管理员还可以通过使用服务配置程序定期更改密码来管理具有过期密码的账户。

如果一个服务需要在共享信息之前识别另一个服务,第二个服务可以使用与第一个服务相同的账户,或者它可以在一个属于第一个服务可识别的别名的账户中运行。 需要在网络上分布式运行的服务应使用域范围的账户。

你可以指定以下一种特殊账户,而不是为服务指定用户账户:

  • LocalService
  • NetworkService
  • LocalSystem

LocalService

LocalService 账户是一个预定义的本地账户,由服务控制管理器(SCM)使用。 它在本地计算机上具有最低的权限,并在网络上呈现匿名凭证。

可以在调用 CreateService 和 ChangeServiceConfig 函数时指定此账户。 请注意,该账户没有密码,因此在此调用中提供的任何密码信息将被忽略。 虽然安全子系统会本地化此账户名称,但 SCM 不支持本地化名称。 因此,您将通过 LookupAccountSid 函数获得此账户的本地化名称,但当调用 CreateService 或 ChangeServiceConfig 时,账户名称必须是 NT AUTHORITY\LocalService,无论区域设置如何,否则可能会出现意外结果。

用户 SID 是由 SECURITY_LOCAL_SERVICE_RID 值创建的。

LocalService 账户在注册表中的 HKEY_USERS 键下有自己的子键。 因此,HKEY_CURRENT_USER 注册表键与 LocalService 账户相关联。

LocalService 账户具有以下权限:

  • SE_ASSIGNPRIMARYTOKEN_NAME(已禁用)
  • SE_AUDIT_NAME(已禁用)
  • SE_CHANGE_NOTIFY_NAME(已启用)
  • SE_CREATE_GLOBAL_NAME(已启用)
  • SE_IMPERSONATE_NAME(已启用)
  • SE_INCREASE_QUOTA_NAME(已禁用)
  • SE_SHUTDOWN_NAME(已禁用)
  • SE_UNDOCK_NAME(已禁用)
  • 分配给 users 和 authenticated users 的任何权限

有关更多信息,请参见 Service Security and Access Rights

NetworkService

NetworkService 账户是一个预定义的本地账户,由服务控制管理器(SCM)使用。 此账户不被安全子系统识别,因此你无法在调用 LookupAccountName 函数时指定其名称。 它在本地计算机上具有最低的权限,并且在网络上作为计算机的身份进行操作。

可以在调用 CreateService 和 ChangeServiceConfig 函数时指定此账户。 请注意,该账户没有密码,因此在此调用中提供的任何密码信息将被忽略。 虽然安全子系统会本地化此账户名称,但 SCM 不支持本地化名称。 因此,您将通过 LookupAccountSid 函数获得此账户的本地化名称,但当调用 CreateService 或 ChangeServiceConfig 时,无论区域设置如何,账户名称必须是 NT AUTHORITY\NetworkService,否则可能会出现意外结果。

在 NetworkService 账户的上下文中运行的服务会将计算机的凭证呈现给远程服务器。 默认情况下,远程令牌包含“Everyone”和“Authenticated Users”组的 SID。 用户 SID 是由 SECURITY_NETWORK_SERVICE_RID 值创建的。

NetworkService 账户在注册表中的 HKEY_USERS 键下有自己的子键。 因此,HKEY_CURRENT_USER 注册表键与 NetworkService 账户相关联。

NetworkService 账户具有以下权限:

  • SE_ASSIGNPRIMARYTOKEN_NAME(已禁用)
  • SE_AUDIT_NAME(已禁用)
  • SE_CHANGE_NOTIFY_NAME(已启用)
  • SE_CREATE_GLOBAL_NAME(已启用)
  • SE_IMPERSONATE_NAME(已启用)
  • SE_INCREASE_QUOTA_NAME(已禁用)
  • SE_SHUTDOWN_NAME(已禁用)
  • SE_UNDOCK_NAME(已禁用)
  • 分配给 users 和 authenticated users 的任何权限

有关更多信息,请参见 Service Security and Access Rights

LocalSystem

LocalSystem 账户是一个预定义的本地账户,由服务控制管理器(SCM)使用。 此账户不被安全子系统识别,因此你无法在调用 LookupAccountName 函数时指定其名称。 它在本地计算机上具有广泛的权限,并且在网络上作为计算机身份进行操作。 它的令牌包括 NT AUTHORITY\SYSTEM 和 BUILTIN\Administrators SIDs,这些账户可以访问大多数系统对象。 该账户的名称在所有语言环境中都是 .\LocalSystem。 还可以使用名称 LocalSystem 或 ComputerName\LocalSystem。 此账户没有密码。如果在调用 CreateService 或 ChangeServiceConfig 函数时指定了 LocalSystem 账户,则提供的任何密码信息将被忽略。

在 LocalSystem 账户的上下文中运行的服务继承了服务控制管理器(SCM)的安全上下文。 用户 SID 是由 SECURITY_LOCAL_SYSTEM_RID 值创建的。 该账户与任何登录的用户账户无关,这有几个含义:

  • 注册表键 HKEY_CURRENT_USER 关联的是默认用户,而不是当前用户。 要访问另一个用户的配置文件,必须模拟该用户,然后访问 HKEY_CURRENT_USER。
  • 服务可以打开注册表键 HKEY_LOCAL_MACHINE\SECURITY。
  • 服务会将计算机的凭证呈现给远程服务器。
  • 如果服务打开一个命令窗口并运行批处理文件,用户可以按 CTRL+C 终止批处理文件并获得一个具有 LocalSystem 权限的命令窗口。

LocalSystem 账户具有以下权限:

  • SE_ASSIGNPRIMARYTOKEN_NAME(已禁用)
  • SE_AUDIT_NAME(已启用)
  • SE_BACKUP_NAME(已禁用)
  • SE_CHANGE_NOTIFY_NAME(已启用)
  • SE_CREATE_GLOBAL_NAME(已启用)
  • SE_CREATE_PAGEFILE_NAME(已启用)
  • SE_CREATE_PERMANENT_NAME(已启用)
  • SE_CREATE_TOKEN_NAME(已禁用)
  • SE_DEBUG_NAME(已启用)
  • SE_IMPERSONATE_NAME(已启用)
  • SE_INC_BASE_PRIORITY_NAME(已启用)
  • SE_INCREASE_QUOTA_NAME(已禁用)
  • SE_LOAD_DRIVER_NAME(已禁用)
  • SE_LOCK_MEMORY_NAME(已启用)
  • SE_MANAGE_VOLUME_NAME(已禁用)
  • SE_PROF_SINGLE_PROCESS_NAME(已启用)
  • SE_RESTORE_NAME(已禁用)
  • SE_SECURITY_NAME(已禁用)
  • SE_SHUTDOWN_NAME(已禁用)
  • SE_SYSTEM_ENVIRONMENT_NAME(已禁用)
  • SE_SYSTEMTIME_NAME(已禁用)
  • SE_TAKE_OWNERSHIP_NAME(已禁用)
  • SE_TCB_NAME(已启用)
  • SE_UNDOCK_NAME(已禁用)

大多数服务不需要如此高的权限级别。

如果你的服务不需要这些权限,并且它不是交互式服务,考虑使用 LocalService 账户或 NetworkService 账户。 有关更多信息,请参见 Service Security and Access Rights