You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows权限管理技术咨询:默认启用权限、添加权限及跨语言差异

权限管理程序开发问题排查

背景

开发权限管理程序时,尝试通过微软官方代码设置权限Attributes为SE_PRIVILEGE_ENABLED_BY_DEFAULT(0x00000001L)或SE_PRIVILEGE_ENABLED_BY_DEFAULT | SE_PRIVILEGE_ENABLED(0x00000003L),目的是让权限默认启用。权限属性可选值如下:

SE_PRIVILEGE_ENABLED_BY_DEFAULT (0x00000001L)
SE_PRIVILEGE_ENABLED            (0x00000002L)
SE_PRIVILEGE_REMOVED            (0X00000004L)
SE_PRIVILEGE_USED_FOR_ACCESS    (0x80000000L)

通过whoami /priv命令及GetTokenInformation函数查询,已启用权限的Attributes值为3(即上述两个值的组合),但手动设置Attributes为3后,再次查询变为2;设置为1时则变为0。

问题列表

  • 为何设置3会变为2、设置1会变为0?能否将权限Attribute设为3或1,使whoami /priv显示新增的已启用权限?
  • 能否为账户添加更多权限?尝试使用secpol.msc及LsaAddAccountRights函数,但权限数量未变化。
  • 找到一篇通过PowerShell脚本启用权限的文章,为何相同逻辑的C#代码无效,而PowerShell脚本却能生效?

解决方向

问题1解答

  • SE_PRIVILEGE_ENABLED_BY_DEFAULT是账户权限的默认状态标记,由本地安全策略(secpol.msc)配置,无法通过直接修改进程令牌设置。进程令牌中的该属性是从账户默认权限继承而来的,手动修改会被系统忽略,因此设置1会被重置为0,设置3时仅保留SE_PRIVILEGE_ENABLED(值为2)。
  • 若要让权限默认启用,需通过LsaAddAccountRights将权限添加到账户的默认权限列表中,而非直接修改进程令牌Attributes。修改后重启用户会话,whoami /priv会显示该权限的Attributes为3。

问题2解答

  • 使用LsaAddAccountRights时,必须传入正确的权限常量名称(例如SeSecurityPrivilege,而非显示名“管理审核和安全日志”),且调用进程需拥有SeSecurityPrivilege权限并提前启用。
  • secpol.msc的修改需重启用户会话才会生效,未重启时当前令牌不会加载新权限。另外,部分高权限受系统限制,无法添加到普通用户账户。

问题3解答

  • PowerShell脚本通常会自动处理完整的权限操作流程:先获取进程令牌、启用自身所需权限,再执行修改;而C#代码可能遗漏了启用进程自身权限的步骤——比如调用AdjustTokenPrivileges启用SeSecurityPrivilege后,再调用LsaAddAccountRights。
  • 检查C#代码是否正确处理LSA函数的返回值,是否将权限名称转换为LSA要求的Unicode字符串,以及是否以管理员身份运行程序(权限修改需要管理员权限)。

内容的提问来源于stack exchange,提问作者Garven

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 18:38:11