权限

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

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

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

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

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

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

系统提供一组显示名称,用于描述每个权限。 当你需要向用户显示权限说明时,这些方法非常有用。 使用 LookupPrivilegeDisplayName 函数可以检索对应于权限的字符串常量的描述字符串。 例如,在使用美国英语的系统上,"标准版 SYSTEMTIME name" 特权的 "显示名称" _ _ 是 "更改系统时间"。

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

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

授权常量

启用和禁用 c + + 权限