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

C++添加系统用户时出现const wchar_t无法赋值给LPWSTR编译错误

错误原因

L"xxx"格式的宽字符串字面量在C++标准中的类型是const wchar_t*,而USER_INFO_1结构体的usri1_name、usri1_password成员类型为LPWSTR(即wchar_t*,无const修饰),默认开启标准符合模式的VS2019会禁止将const指针直接赋值给非const指针,因此抛出类型不匹配错误。

解决方法

有两种常用的安全修复方案:

方案1:强制去除const属性(推荐,代码改动最小)

由于NetUserAdd API内部不会修改传入的用户名、密码字符串,因此可以安全使用const_cast去掉常量属性:

ui.usri1_name = const_cast<LPWSTR>(L"istech");
ui.usri1_password = const_cast<LPWSTR>(L"p@ssword");

方案2:将字符串存入可写数组

如果不想使用强制类型转换,可以先把字面量拷贝到可写的栈数组中再赋值:

wchar_t szUserName[] = L"istech";
wchar_t szPassword[] = L"p@ssword";
ui.usri1_name = szUserName;
ui.usri1_password = szPassword;

修正后完整代码

#ifndef UNICODE
#define UNICODE
#endif
#pragma comment(lib, "netapi32.lib")

#include <windows.h>
#include <lm.h>

int main()
{
    USER_INFO_1 ui = {0};
    DWORD dwLevel = 1;
    DWORD dwError = 0;
    NET_API_STATUS nStatus;

    // 修复const类型不匹配问题
    ui.usri1_name = const_cast<LPWSTR>(L"istech");
    ui.usri1_password = const_cast<LPWSTR>(L"p@ssword");
    ui.usri1_priv = USER_PRIV_USER;
    ui.usri1_home_dir = NULL;
    ui.usri1_comment = NULL;
    ui.usri1_flags = UF_PASSWD_CANT_CHANGE;
    ui.usri1_script_path = NULL;

    nStatus = NetUserAdd(NULL, dwLevel, (LPBYTE)&ui, &dwError);
    // 可根据nStatus判断是否创建成功,返回ERROR_SUCCESS表示创建完成
    return nStatus;
}

附加说明

  • 运行该程序需要管理员权限,否则NetUserAdd会返回权限不足错误,无法成功创建用户。
  • #pragma comment(lib, "netapi32.lib")是编译器指令,会自动链接netapi32导入库,属于隐式动态链接,无需手动配置库链接路径。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 18:09:00