C++访问一个带密码的共享文件夹的方法

本文介绍了两种方法来访问共享文件夹:使用Netuse命令建立连接,或通过调用WNetAddConnection2函数实现。详细解释了参数设置与错误处理。

首先先说明,方法是根据51CTO论坛的回答得出的,具体网址是:http://bbs.51cto.com/thread-910854-1.html  标题:编写一个带密码的访问共享文件夹的小工具


1、使用 Net use 取得与服务器的连接即可

system("net use \\\\192.168.1.100\\ck\\a b /user:a"); 

接着就能访问共享文件夹了。

2、像 @紫色枫叶 那样使用 WNetAddConnection2(LPNETRESOURCE lpnetresource,LPCTSTR lpPassword,LPCTSTR lpUsername,DWORD dwFlags) 函数,其中可不用映射盘符,具体参数定义参见MSDN。
example:

#ifndef UNICODE
        #define UNICODE
#endif
#ifdef UNICODE
        #ifndef _UNICODE
                #define _UNICODE
        #endif
#endif

#include <Windows.h>
#include <tchar.h>
#include <WinNetWk.h>
#include <stdio.h>
#pragma comment(lib, "Mpr.lib")

int _tmain(int argc, TCHAR **argv)
{
        
    TCHAR szPasswd[] = TEXT("****");          //共享资源授权用户的密码
    TCHAR szUserName[] = TEXT("**");        //共享资源授权的用户

    NETRESOURCE net_Resource;
    net_Resource.dwDisplayType = RESOURCEDISPLAYTYPE_DIRECTORY;
    net_Resource.dwScope = RESOURCE_CONNECTED;
    net_Resource.dwType = RESOURCETYPE_ANY;
    net_Resource.dwUsage = 0;
    net_Resource.lpComment = TEXT("");
    net_Resource.lpLocalName = TEXT("z:");  //映射成本地驱动器z:
    net_Resource.lpProvider= NULL;
    net_Resource.lpRemoteName = TEXT("\\\\192.168.0.2\\管理部"); // \\servername\共享资源名
    DWORD dwFlags = CONNECT_UPDATE_PROFILE;
    DWORD dw = WNetAddConnection2(&net_Resource, szPasswd, szUserName, dwFlags);
    switch(dw)
    {
        case ERROR_SUCCESS:
            ShellExecute(NULL, TEXT("open"), TEXT("z:"), NULL, NULL, SW_SHOWNORMAL);
            break;
        case ERROR_ACCESS_DENIED:
            wprintf(TEXT("没有权访问!"));
                break;
        case ERROR_ALREADY_ASSIGNED:
            ShellExecute(NULL, TEXT("open"), TEXT("z:"), NULL, NULL, SW_SHOWNORMAL);
            break;
        case ERROR_INVALID_ADDRESS:
            wprintf(TEXT("IP地址无效"));
            break;
        case ERROR_NO_NETWORK:
            wprintf(TEXT("网络不可达!"));
            break;
    }
    return 0;


<think>嗯,用户现在想在命令行中使用用户名密码的方式执行共享文件中的文件。根据他之前的问题,他之前询问过如何用PsExec远程执行多条命令,现在可能是在同一环境下需要访问共享资源。我需要结合之前的回答现在提供的引用来给出解决方案。 首先,引用[2]提到在C++访问共享文件需要四个反斜杠,比如`\\\\192.168.0.145/sharedTest/123.txt`。这可能意味着在命令行中访问共享路径也需要类似的格式。不过用户现在的问题不是读写文件,而是执行共享文件中的可执行文件,比如.exe或.bat文件。 用户之前的回答中,提到了使用PsExec远程执行命令,但这里可能需要直接通过命令行运行共享中的文件,而不是远程执行。不过可能还是可以用PsExec,或者使用其他方法。 根据引用[1],用户可能需要先确保凭据正确,或者清除旧的凭据。比如,如果之前保存了错误的密码,可能导致访问失败。所以可能需要使用net use命令先建立连接,并指定用户名密码。 可能的步骤是:先用net use命令映射网络驱动器,提供用户名密码,然后执行文件。例如: net use \\IP\共享文件 密码 /user:用户名 \\IP\共享文件\文件.exe 但用户可能不想永久映射,所以可以加上/persistent:no。此外,如果已经有现有连接,可能需要先删除,避免冲突,可以使用net use /delete。 另外,用户可能希望直接在命令行中一次性执行,不需要先映射。比如使用runas命令,但runas通常用于本地账户,可能不支持网络路径。所以还是需要先建立连接。 另一种方法是使用PsExec本身,通过指定远程计算机,但用户可能想直接在本地命令行中运行共享中的文件,这时候需要认证。 此外,引用[2]中的C++代码示例显示访问共享文件需要正确的路径格式,比如四个反斜杠或者IP地址。所以在命令行中,路径应该是两个反斜杠,比如\\192.168.0.145\sharedTest\file.exe。 综合起来,解决方案应该是: 1. 使用net use命令建立到共享文件的连接,并指定用户名密码。 2. 然后直接执行共享路径中的文件。 3. 或者在执行时使用runas,但需要注意网络路径的问题。 可能还需要考虑不同Windows版本中的凭据管理,如引用[1]所述,如果之前有保存的凭据可能需要先清除,避免冲突。 另外,用户可能需要单行命令,所以可以将net use执行命令放在同一行,用&连接。例如: net use \\IP\共享文件 密码 /user:用户名 & \\IP\共享文件\文件.exe 但需要注意权限问题,可能需要以管理员身份运行命令行。 或者,使用PsExec来执行远程命令,但用户可能想直接在本地调用共享中的文件,这时候PsExec可能不是必须的。 总结可能的步骤: - 使用net use建立临时连接,指定用户名密码。 - 执行共享中的文件。 - 完成后断开连接。 同时处理可能出现的错误,比如访问被拒绝,需要检查防火墙、共享权限等。 因此,最终的解决方案应该包括net use的方法,以及可能的替代方案如使用PsExec或者直接调用,同时提醒用户注意事项如凭据管理路径格式。</think>### 通过命令行指定用户名密码执行共享文件文件的完整方案 #### 方法1:使用 `net use` 挂载共享路径(推荐) ```batch :: 挂载共享路径(临时连接) net use \\192.168.1.100\共享文件 "YourPassword" /user:YourUsername /persistent:no :: 执行共享文件中的文件 \\192.168.1.100\共享文件\program.exe :: 清理连接(可选) net use \\192.168.1.100\共享文件 /delete ``` **关键说明**: - `/persistent:no` 表示不保存凭据到系统[^1] - 路径必须使用双反斜杠:`\\IP\共享名\文件路径` - 若远程计算机未加入域,用户名格式为`计算机名\用户名` #### 方法2:单行命令直接执行 ```batch net use \\192.168.1.100\共享文件 "YourPassword" /user:YourUsername & \\192.168.1.100\共享文件\script.bat & net use /delete \\192.168.1.100\共享文件 ``` #### 方法3:通过PsExec远程执行(需工具) ```batch psexec \\目标计算机IP -u 用户名 -p 密码 -c "\\共享路径\program.exe" ``` 此方法要求目标计算机已开启445端口且网络可达[^1] #### 常见错误处理 1. **错误53(找不到网络路径)**: - 检查防火墙是否阻止445端口 - 确认目标计算机已开启文件共享 - 使用IP地址替代计算机名(DNS解析问题) 2. **错误1326(登录失败)**: ```batch :: 清除旧凭据 cmdkey /delete:目标地址 ``` 3. **路径特殊字符处理**: ```batch net use \\IP\共享文件$ "密码" /user:用户名 ``` #### 安全建议 1. 使用加密密码传递(需配合第三方工具) 2. 执行后立即清理连接记录 3. 对敏感操作建议使用`runas /netonly`组合技: ```batch runas /netonly /user:域\用户名 "cmd /c \\共享路径\program.exe" ``` --相关问题--: 1. 如何通过PowerShell脚本安全地传递共享文件凭据? 2. Windows凭据管理器如何实现自动登录共享文件? 3. 跨域环境访问共享文件需要注意哪些Kerberos配置?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值