特权
特权 是帐户(例如用户或组帐户)在本地计算机上执行各种与系统相关的作的权限,例如关闭系统、加载设备驱动程序或更改系统时间。 特权在两种方式中不同于访问权限:
- 特权控制对系统资源和系统相关任务的访问,而对 安全对象的访问权限。
- 系统管理员为用户和组帐户分配特权,而系统根据对象 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)函数来处理特权。 LsaAddAccountRights 和 LsaRemoveAccountRights 函数添加或删除帐户中的特权。 LsaEnumerateAccountRights 函数枚举指定帐户所持有的权限。 LsaEnumerateAccountsWithUserRight 函数枚举持有指定权限的帐户。
相关主题