我正在尝试使用
CreateFile()
访问远程系统。 NetUseAdd()
用于与远程系统建立连接,以便 CreateFile()
可以成功执行。
我在域上传递了正确的用户名和密码,但返回错误 1326(用户名或密码不正确)。
检查网络流量后,我注意到它传递了执行者的用户名,而不是远程系统的用户名(传递的用户名):
会话设置请求,NTLMSSP_AUTH,用户:.\localhost
但这是传递的参数(当然还有代码):
net::Establish(L"\\\\192.168.1.10", L"user", L"password");
bool net::Establish(const wchar_t* domain, const wchar_t* user, const wchar_t* password) {
HANDLE remotebin;
DWORD ret;
char RemoteBinPath[MAX_PATH];
// Establish the connection with the remote domain
USER_INFO_1 userinfo;
userinfo.usri1_name = (LPWSTR)user;
userinfo.usri1_password = (LPWSTR)password;
userinfo.usri1_priv = USER_PRIV_USER;
userinfo.usri1_home_dir = NULL;
userinfo.usri1_comment = NULL;
userinfo.usri1_flags = UF_SCRIPT | UF_NORMAL_ACCOUNT;
userinfo.usri1_script_path = NULL;
ret = NetUseAdd((LPTSTR)domain, 1, (LPBYTE)&userinfo, MB_OK);
if (ret != NERR_Success) {
#ifdef DEBUG
printf("Erorr: NetUseAdd: %d\n", ret);
#endif
return false;
}
NetUseAdd()
(USE)而不是NetUserAdd()
(USER)。通过将 LevelFlags
参数设置为 1
,您是在告诉 NetUseAdd()
(USE) 期望指向 USE_INFO_1
(USE) 结构的指针,但是您实际上传递的是指向USER_INFO_1
(USER) 结构代替。这两个结构非常不同。由于您没有传递正确的 USE_INFO_1
(USE) 结构,因此最终会出现 ERROR_LOGON_FAILURE
错误。
也就是说,
NetUseAdd()
(USE) 在级别 1 不接受用户名,只接受密码。要传入用户名(和域),您需要使用级别 2 (USE_INFO_2
) 代替。
旁注:
(LPTSTR)domain
类型转换值得怀疑。如果您使用 UNICODE
define 进行编译,这很好,但如果您没有使用 UNICODE
defined 进行编译,则将无法工作。由于您只处理 wchar_t
字符串,而不是 TCHAR
字符串,因此您真的应该使用 NetUseAddW()
来避免完全类型转换。
此外,当您将
const wchar_t*
指针转换为 LPWSTR
(wchar_t*
) 时,您应该使用 const_cast
而不是 C 风格的转换。
此外,在传递
reinterpret_cast
指针时,使用 USE_INFO_1
而不是 C 风格的转换。