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
相关产品推荐
相关产品推荐

