在 Windows 操作系统中,每个服务都运行在一个用户帐户安全上下文中。其用户名和密码在服务安装时由 CreateService 函数指定,并可以通过 ChangeServiceConfig 函数进行更改,通过 QueryServiceConfig 函数查询某个服务的用户名。服务控制管理器(SCM)自动为服务加载用户配置文件。
启动服务时,SCM 会登录到该服务关联的账户之上,一旦登录成功,系统会生成一个访问令牌,并将其附加到新的服务进程上,用于在随后与安全对象(带有安全描述符的对象)的交互中标识该服务进程。例如,如果服务尝试打开某个管道的句柄,系统将在为该服务获取权限之前对比其访问令牌和管道的安全描述符。
SCM 不会保留服务所使用的用户帐户的密码。如果密码过期,登录会失败,服务启动失败。为服务指派帐户的系统管理员可以创建永不过期的密码,或者通过服务配置程序来周期性的更改过期的密码。
如果服务需要在与另一个服务共享其信息之前对其进行识别,那么第二个服务可以使用第一个服务的帐户,或者运行在另一个被第一个服务识别的帐户别名中。需要在网络环境中处理分布式事务的服务可以运行在域帐户中。
可以向服务指定下列特殊帐户,而不必指定某个用户帐户:LocalService、NetworkService、LocalSystem。
LocalService
该账户是给SCM使用的预定义本地帐户,其不会被安全子系统识别,因此无法通过调用 LookupAccountName 函数来获得其用户名。它具有本地计算机上的最小特权,在网络访问时代表匿名凭据。
该账户可以在调用 CreateService 和 ChangeServiceConfig 函数时指定。需要注意的是,该账户没有密码,因此在调用时提供的任何密码都会被忽略。如果安全子系统本地化其账户名,SCM将不支持本地化的名称。因此,可以通过 LookupAccountSid 函数来取得该账户的本地名称,但不管系统区域是什么,在调用 CreateService 或 ChangeServiceConfig 时必须使用 NT AUTHORITY\LocalService 这个名称,否则会发生不可预料的结果。
该用户的 SID 由 SECURITY_LOCAL_SERVICE_RID 值来创建。
该账户在 HKEY_USERS 注册表项下有自己的子键,因此,它有与自己关联的 HKEY_CURRENT_USER 注册表项。
该账户具有下列特权:
- 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 (已禁用)
- 用户和已鉴定用户拥有的其他特权
NetworkService
该账户在本地计算机上拥有最小特权,在网络上代表该计算机的身份。默认情况下,远程令牌包含 Everyone 和 Authenticated Users 用户组的 SID。该用户的 SID 由 SECURITY_NETWORK_SERVICE_RID 值来创建。其他属性与 LocalService 相同。
LocalSystem
它具有本地计算机上的扩展特权,在网络访问时代表该计算机的身份。其令牌包含 NT AUTHORITY\SYSTEM 和 BUILTIN\Administrators 的 SID,这些账户能够访问系统中大多数对象,其名称在所有区域均为 .\LocalSystem,使用 LocalSystem 或 ComputerName\LocalSystem 均可。
本账户中运行的服务会继承SCM的安全上下文。该用户的 SID 由 SECURITY_LOCAL_SYSTEM_RID 值来创建。本账户不与已登录的任何账户关联。此账户有以下特点:
- HKEY_CURRENT_USER 关联到默认用户,而不是当前登录的用户。要访问其它用户的配置文件,需要模仿该用户,然后访问 HKEY_CURRENT_USER。
- 使用该账户的服务可以打开 HKEY_LOCAL_MACHINE\SECURITY。
- 此服务以本计算机的身份访问远程服务器。
- 如果服务打开了命令窗口并运行批处理文件,用户可以使用 Ctrl+C 终止该批处理,以此获得使用 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 (已禁用)