NetUseAdd 返回 1326 试图与远程域建立连接

问题描述 投票:0回答:1

我正在尝试使用

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;
    }
c windows winapi network-programming smb
1个回答
0
投票

注意你打电话给

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 风格的转换。

© www.soinside.com 2019 - 2024. All rights reserved.