权限

特权是帐户(如用户或组帐户)在本地计算机上执行各种系统相关操作的权限,例如关闭系统、加载设备驱动程序或更改系统时间。 特权与访问权限不同,有两种方式:

  • 权限控制对系统资源和系统相关任务的访问,而访问控制对 安全对象的访问权限。
  • 系统管理员为用户和组帐户分配特权,而系统根据对象 DACL 中 ACE 授予的访问权限授予或拒绝对安全对象的访问权限。

每个系统都有一个帐户数据库,用于存储用户和组帐户所持有的权限。 当用户登录时,系统会生成一个 访问令牌 ,其中包含用户权限的列表,包括授予用户权限的用户或用户所属的组。 请注意,特权仅适用于本地计算机;域帐户在不同计算机上可以具有不同的权限。

当用户尝试执行特权操作时,系统会检查用户的访问令牌以确定用户是否持有必要的特权,如果是,它会检查是否启用了特权。 如果用户未通过这些测试,则系统不执行该操作。

若要确定访问令牌中保留的特权,请调用 GetTokenInformation 函数,该函数还指示启用了哪些特权。 默认情况下禁用大多数特权。

Windows API 定义一组字符串常量,例如SE_ASSIGNPRIMARYTOKEN_NAME,用于标识各种特权。 这些常量在所有系统上都是相同的,在 Winnt.h 中定义。 有关Windows定义的特权表,请参阅 Privilege Constants。 但是,获取和调整访问令牌中特权的函数使用 LUID 类型来标识特权。 特权 的 LUID 值可能不同于一台计算机到另一台计算机,从一台启动到另一台启动在同一台计算机上。 若要获取与其中一个字符串常量相对应的当前 LUID ,请使用 LookupPrivilegeValue 函数。 使用 LookupPrivilegeName 函数将 LUID 转换为其相应的字符串常量。

系统提供一组描述每个特权的显示名称。 当你需要向用户显示特权说明时,这些内容非常有用。 使用 LookupPrivilegeDisplayName 函数检索与特权字符串常量对应的说明字符串。 例如,在使用美国英语的系统上,SE_SYSTEMTIME_NAME权限的显示名称为“更改系统时间”。

可以使用 PrivilegeCheck 函数来确定访问令牌是否保留一组指定的特权。 这主要用于模拟客户端的服务器应用程序。

系统管理员可以使用管理工具(如 User Manager)添加或删除用户和组帐户的权限。 管理员可以以编程方式使用 本地安全机构 (LSA) 函数来处理特权。 LsaAddAccountRightsLsaRemoveAccountRights 函数添加或删除帐户中的特权。 LsaEnumerateAccountRights 函数枚举指定帐户持有的权限。 LsaEnumerateAccountsWithUserRight 函数枚举具有指定特权的帐户。

授权常量

在 C++ 中启用和禁用特权