使用WNetAddConnection2或WNetAddConnection3时如何让系统保存凭证
WNetAddConnection2无法保存凭证的解决方案
以下是针对你代码中问题的修复方案:
- 修正
dwType参数取值
你当前同时设置了RESOURCETYPE_DISK和RESOURCETYPE_ANY,二者属于互斥枚举值,同时使用会导致系统无法正确识别资源类型,凭证无法和对应资源绑定。根据你的业务场景二选一即可:如果是映射网络驱动器请仅保留RESOURCETYPE_DISK,如果是仅访问通用网络资源不映射盘符请使用RESOURCETYPE_ANY。 - 删除冲突的连接参数
你自行实现了用户名密码输入窗口,不需要设置CONNECT_INTERACTIVE和CONNECT_COMMANDLINE参数:前者会触发系统自带的认证弹窗,后者是给命令行场景使用的参数,二者会干扰CONNECT_CMD_SAVECRED的凭证保存逻辑。 - 检查用户名格式
如果你访问的是域内资源,请将用户名设置为域名\用户名或者用户名@域名的格式;如果是工作组环境的共享资源,请设置为远程主机名\用户名,格式错误会导致保存的凭证无法和目标资源匹配,下次访问时无法自动读取。 - 确认程序运行上下文权限
程序运行的用户身份需要有凭据管理器写入权限,另外注意管理员身份运行的程序保存的凭证仅对管理员用户可见,普通用户运行程序时无法读取该凭证。 - 避免临时对象野指针风险
你代码中直接传递toStdWString()返回的临时对象指针,虽然同步调用场景下不会触发问题,但建议提前把用户名密码存入持久化的本地变量后再传参,避免异常场景下出现野指针。
修改后的参考代码
NETRESOURCEW net_resource {0}; // 根据实际场景选一个即可,这里以映射网络盘为例 net_resource.dwType = RESOURCETYPE_DISK; WCHAR szRemotePath[MAX_PATH] {0}; wcscpy_s(szRemotePath, MAX_PATH, remote_path.toStdWString().c_str()); net_resource.lpRemoteName = szRemotePath; // 提前持久化用户名密码 std::wstring w_user = user.toStdWString(); std::wstring w_pwd = password.toStdWString(); status_code = ::WNetAddConnection2(&net_resource, w_pwd.c_str(), w_user.c_str(), CONNECT_UPDATE_PROFILE | CONNECT_CMD_SAVECRED);
修改后如果调用返回成功,可以打开Windows凭据管理器,查看Windows凭据分类下是否出现了对应远程路径的凭证条目,确认保存是否生效。
内容的提问来源于stack exchange,提问作者0ices
相关产品推荐
相关产品推荐

