权限

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

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

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

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

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

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

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

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

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

授权常量

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