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

LsaAddAccountRights()未实际授予账户权限:示例代码运行后权限未生效

问题:运行LSA权限代码后未成功授予“作为服务登录”权限

我运行了微软Windows经典示例中的LSA权限管理代码,但目标用户仍未被授予“作为服务登录”权限。

管理员PowerShell会话截图

核心代码片段:

NTSTATUS
SetPrivilegeOnAccount(
    LSA_HANDLE PolicyHandle,    // 已打开的策略句柄
    PSID AccountSid,            // 要授予权限的用户SID
    LPWSTR PrivilegeName,       // 要授予的权限名称(Unicode)
    BOOL bEnable                // 启用或禁用权限
    )
{
    LSA_UNICODE_STRING PrivilegeString;

    // 为权限名称创建LSA_UNICODE_STRING结构
    InitLsaString(&PrivilegeString, PrivilegeName);

    // 根据bEnable参数决定授予或撤销权限
    if(bEnable) {
        return LsaAddAccountRights(
                PolicyHandle,       // 已打开的策略句柄
                AccountSid,         // 目标用户SID
                &PrivilegeString,   // 要设置的权限
                1                   // 权限数量
                );
    }
    else {
        return LsaRemoveAccountRights(
                PolicyHandle,       // 已打开的策略句柄
                AccountSid,         // 目标用户SID
                FALSE,              // 不禁用所有权限
                &PrivilegeString,   // 要撤销的权限
                1                   // 权限数量
                );
    }
}

排查方向及解决方案

  • 权限名称必须用系统常量:“作为服务登录”对应的系统内部权限名称是SeServiceLogonRight,而非界面显示的中文名称。调用SetPrivilegeOnAccount时必须传入L"SeServiceLogonRight"这个Unicode字符串,用显示名称会导致设置无效。
  • 检查策略句柄权限:调用LsaOpenPolicy打开策略时,必须请求足够的权限(比如POLICY_ALL_ACCESS或至少POLICY_SET_QUOTA),权限不足会导致LsaAddAccountRights执行失败。
  • 验证用户SID有效性:确保传入的AccountSid是目标用户的正确SID,错误的SID会让权限设置操作无意义。
  • 检查API返回值:获取LsaAddAccountRights的返回值,通过LsaNtStatusToWinError转换为Win32错误码,可精准定位失败原因(如访问被拒绝、参数无效等)。

正确调用示例:

// 授予目标用户“作为服务登录”权限
SetPrivilegeOnAccount(PolicyHandle, TargetUserSid, L"SeServiceLogonRight", TRUE);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 22:13:28