我想你肯定有服务器S上的管理员用户名和口令,这样你就可以先调用API建立一个IPC连接,然后你就能访问这台机器上的资源了。
专注于为中小企业提供网站设计、成都网站建设服务,电脑端+手机端+微信端的三站合一,更高效的管理,为中小企业深州免费做网站提供优质的服务。我们立足成都,凝聚了一批互联网行业人才,有力地推动了上1000家企业的稳健成长,帮助中小企业通过网站建设实现规模扩充和转变。
在你的工程中增加一个模块,该模块代码如下:
Option Explicit
'=====================================说明======================================
'funIpcConn(资源名,用户名,口令)建立连接
'funIpcDisConn(资源名)断开连接
'引用:操作系统自带的库文件 mpr.dll
'=============================自定义常量========================================
Private Const RESOURCETYPE_DISK = H1
Private Const RESOURCE_GLOBALNET As Long = H2
Private Const RESOURCEDISPLAYTYPE_SHARE = H3
Private Const RESOURCEUSAGE_CONNECTABLE = H1
'=============================自定义结构========================================
Private Type NETRESOURCE
dwScope As Long
dwType As Long '用于指定网络的资源类型
dwDisplayType As Long
dwUsage As Long
lpLocalName As String '指定本地设备
lpRemoteName As String '指定远程网络名
lpComment As String
lpProvider As String '指定提供网络资源的供应商
End Type
'=================================API声明=======================================
Private Declare Function WNetAddConnection2 Lib "mpr.dll" Alias "WNetAddConnection2A" ( _
lpNetResource As NETRESOURCE, _
ByVal lpPassword As String, _
ByVal lpUserName As String, _
ByVal dwFlags As Long _
) As Long
Private Declare Function WNetCancelConnection2 Lib "mpr.dll" Alias "WNetCancelConnection2A" ( _
ByVal lpName As String, _
ByVal dwFlags As Long, _
ByVal fForce As Long _
) As Long
Public Function funIpcConn(ByVal strRemoteName As String, ByVal strUserName As String, ByVal strPassword As String) As Boolean
'目的:建立网络间的联系
'返回: True ---- 成功
' False --- 失败
'注释:strRemoteName为要连接的计算机名称(如:\\HostName、\\192.168.199.144、\\HostName\Data)
' strUserName为登录的用户名,strPassword为登录的密码
Dim NetR As NETRESOURCE
NetR.dwScope = RESOURCE_GLOBALNET
NetR.dwType = RESOURCETYPE_DISK
NetR.dwDisplayType = RESOURCEDISPLAYTYPE_SHARE
NetR.dwUsage = RESOURCEUSAGE_CONNECTABLE
NetR.lpRemoteName = strRemoteName
'建立网络映射
funIpcConn = IIf(WNetAddConnection2(NetR, strPassword, strUserName, 0) = 0, True, False)
End Function
Public Function funIpcDisConn(ByVal strName As String) As Long
funIpcDisConn = WNetCancelConnection2(strName, 0, 0) '原样返回API的返回值
End Function
我不会VB,但是都是点虐 。c#的代码稍微转换一下就可以了。
C#实现访问网络共享文件夹,使用 WNetAddConnection2A 和 WNetCancelConnection2A。
在目标服务器建立共享文件夹,建立访问账号test;
public enum ERROR_ID
{
ERROR_SUCCESS = 0, // Success
ERROR_BUSY = 170,
ERROR_MORE_DATA = 234,
ERROR_NO_BROWSER_SERVERS_FOUND = 6118,
ERROR_INVALID_LEVEL = 124,
ERROR_ACCESS_DENIED = 5,
ERROR_INVALID_PASSWORD = 86,
ERROR_INVALID_PARAMETER = 87,
ERROR_BAD_DEV_TYPE = 66,
ERROR_NOT_ENOUGH_MEMORY = 8,
ERROR_NETWORK_BUSY = 54,
ERROR_BAD_NETPATH = 53,
ERROR_NO_NETWORK = 1222,
ERROR_INVALID_HANDLE_STATE = 1609,
ERROR_EXTENDED_ERROR = 1208,
ERROR_DEVICE_ALREADY_REMEMBERED = 1202,
ERROR_NO_NET_OR_BAD_PATH = 1203
}
public enum RESOURCE_SCOPE
{
RESOURCE_CONNECTED = 1,
RESOURCE_GLOBALNET = 2,
RESOURCE_REMEMBERED = 3,
RESOURCE_RECENT = 4,
RESOURCE_CONTEXT = 5
}
public enum RESOURCE_TYPE
{
RESOURCETYPE_ANY = 0,
RESOURCETYPE_DISK = 1,
RESOURCETYPE_PRINT = 2,
RESOURCETYPE_RESERVED = 8,
}
public enum RESOURCE_USAGE
{
RESOURCEUSAGE_CONNECTABLE = 1,
RESOURCEUSAGE_CONTAINER = 2,
RESOURCEUSAGE_NOLOCALDEVICE = 4,
RESOURCEUSAGE_SIBLING = 8,
RESOURCEUSAGE_ATTACHED = 16,
RESOURCEUSAGE_ALL = (RESOURCEUSAGE_CONNECTABLE | RESOURCEUSAGE_CONTAINER | RESOURCEUSAGE_ATTACHED),
}
public enum RESOURCE_DISPLAYTYPE
{
RESOURCEDISPLAYTYPE_GENERIC = 0,
RESOURCEDISPLAYTYPE_DOMAIN = 1,
RESOURCEDISPLAYTYPE_SERVER = 2,
RESOURCEDISPLAYTYPE_SHARE = 3,
RESOURCEDISPLAYTYPE_FILE = 4,
RESOURCEDISPLAYTYPE_GROUP = 5,
RESOURCEDISPLAYTYPE_NETWORK = 6,
RESOURCEDISPLAYTYPE_ROOT = 7,
RESOURCEDISPLAYTYPE_SHAREADMIN = 8,
RESOURCEDISPLAYTYPE_DIRECTORY = 9,
RESOURCEDISPLAYTYPE_TREE = 10,
RESOURCEDISPLAYTYPE_NDSCONTAINER = 11
}
[StructLayout(LayoutKind.Sequential)]
public struct NETRESOURCE
{
public RESOURCE_SCOPE dwScope;
public RESOURCE_TYPE dwType;
public RESOURCE_DISPLAYTYPE dwDisplayType;
public RESOURCE_USAGE dwUsage;
[MarshalAs(UnmanagedType.LPStr)]
public string lpLocalName;
[MarshalAs(UnmanagedType.LPStr)]
public string lpRemoteName;
[MarshalAs(UnmanagedType.LPStr)]
public string lpComment;
[MarshalAs(UnmanagedType.LPStr)]
public string lpProvider;
}
public class NetworkConnection
{
[DllImport("mpr.dll")]
public static extern int WNetAddConnection2A (NETRESOURCE[] lpNetResource, string lpPassword, string lpUserName, int dwFlags);
[DllImport("mpr.dll")]
public static extern int WNetCancelConnection2A (string sharename, int dwFlags, int fForce);
public static int Connect (string remotePath, string localPath, string username, string password)
{
NETRESOURCE[] share_driver = new NETRESOURCE[1];
share_driver[0].dwScope = RESOURCE_SCOPE.RESOURCE_GLOBALNET;
share_driver[0].dwType = RESOURCE_TYPE.RESOURCETYPE_DISK;
share_driver[0].dwDisplayType = RESOURCE_DISPLAYTYPE.RESOURCEDISPLAYTYPE_SHARE;
share_driver[0].dwUsage = RESOURCE_USAGE.RESOURCEUSAGE_CONNECTABLE;
share_driver[0].lpLocalName = localPath;
share_driver[0].lpRemoteName = remotePath;
Disconnect(localPath);
int ret = WNetAddConnection2A(share_driver, password, username, 1);
return ret;
}
public static int Disconnect (string localpath)
{
return WNetCancelConnection2A(localpath, 1, 1);
}
调用方式:
public static void TestNetWorkConnection()
{
string localpath = "X:";
//int status = NetworkConnection.Connect(@"\\192.168.0.2\test", localpath, @"test", "test");
int status = NetworkConnection.Connect("\\\\192.168.0.2\\test", localpath, @"test", "test");
if (status == (int)ERROR_ID.ERROR_SUCCESS)
{
FileStream fs = new FileStream(localpath + @"\\123.txt", FileMode.OpenOrCreate);
using (StreamWriter stream = new StreamWriter(fs))
{
stream.WriteLine("你好呀,成功了");
stream.Flush();
stream.Close();
}
fs.Close();
}
else
{
Console.WriteLine(status);
}
NetworkConnection.Disconnect(localpath);
}
WNetAddConnection 创建同一个网络资源的永久性连接
WNetAddConnection2 创建同一个网络资源的连接
WNetAddConnection3 创建同一个网络资源的连接
WNetCancelConnection 结束一个网络连接
WNetCancelConnection2 结束一个网络连接
WNetCloseEnum 结束一次枚举操作
WNetConnectionDialog 启动一个标准对话框,以便建立同网络资源的连接
WNetDisconnectDialog 启动一个标准对话框,以便断开同网络资源的连接
WNetEnumResource 枚举网络资源
WNetGetConnection 获取本地或已连接的一个资源的网络名称
WNetGetLastError 获取网络错误的扩展错误信息
WNetGetUniversalName 获取网络中一个文件的远程名称以及/或者UNC(统一命名规范)名称
WNetGetUser 获取一个网络资源用以连接的名字
WNetOpenEnum 启动对网络资源进行枚举的过程
1.WNetAddConnection
VB声明
Declare Function WNetAddConnection Lib "mpr.dll" Alias "WNetAddConnectionA" (ByVal lpszNetPath As String, ByVal lpszPassword As String, ByVal lpszLocalName As String) As Long
说明
创建同一个网络资源的永久性连接
返回值
Long,零表示成功。会设置GetLastError。如GetLastError是ERROR_EXTENDED_ERROR,则可用WNetGetLastError取得额外的错误信息
参数表
参数 类型及说明
lpszNetPath String,要连接的网络名
lpszPassword String,可选的一个密码。如为vbNullString,表示采用当前用户的默认密码。如为一个空字串,则不用任何密码
lpszLocalName String,资源的本地名称。(例如,F: 和 LPT1:)
2.WNetAddConnection2
VB声明
Declare Function WNetAddConnection2 Lib "mpr.dll" Alias "WNetAddConnection2A" (lpNetResource As NETRESOURCE, ByVal lpPassword As String, ByVal lpUserName As String, ByVal dwFlags As Long) As Long
说明
创建同一个网络资源的连接
返回值
Long,零表示成功。会设置GetLastError。如GetLastError是ERROR_EXTENDED_ERROR,则可用WNetGetLastError取得额外的错误信息
参数表
参数 类型及说明
lpNetResource NETRESOURCE,在这个结构中设置了下述字段,对要连接的网络资源进行了定义:dwType, lpLocalName (可为 vbNullString), lpRemoteName, lpProvider (设为 vbNullString 表示用默认提供者)。该结构的其他所有变量都会被忽略
lpPassword String,可选的一个密码。如为vbNullString,表示采用当前用户的默认密码。如为一个空字串,则不用任何密码
lpUserName String,用于连接的用户名。如为vbNullString,表示使用当前用户
dwFlags Long,设为零;或指定常数CONNECT_UPDATE_PROFILE,表示创建永久性连接
3.WNetAddConnection3
VB声明
Declare Function WNetAddConnection3 Lib "mpr.dll" Alias "WNetAddConnection3A" (ByVal hwnd As Long, lpNetResource As NETRESOURCE, ByVal lpPassword As String, ByVal lpUserName As String, ByVal dwFlags As Long)
说明
创建同一个网络资源的连接。这个函数与WNetAddConnection2类似,只是它允许我们为这个函数显示的对话框指定一个物主窗口
返回值
Long,
参数表
参数 类型及说明
hwnd Long,指定一个窗口句柄,用作本函数创建的对话框的父窗口
lpNetResource NETRESOURCE,在这个结构中设置了下述字段,对要连接的网络资源进行了定义:dwType, lpLocalName (可为 vbNullString), lpRemoteName, lpProvider (设为 vbNullString 表示用默认提供者)。该结构的其他所有变量都会被忽略
lpPassword String,可选的一个密码。如为vbNullString,表示采用当前用户的默认密码。如为一个空字串,则不用任何密码
lpUserName String,用于连接的用户名。如为vbNullString,表示使用当前用户
dwFlags Long,设为零;或指定常数CONNECT_UPDATE_PROFILE,表示创建永久性连接
4.WNetCancelConnection
VB声明
Declare Function WNetCancelConnection Lib "mpr.dll" Alias "WNetCancelConnectionA" (ByVal lpszName As String, ByVal bForce As Long) As Long
说明
结束一个网络连接
返回值
Long,零表示成功。会设置GetLastError。如GetLastError是ERROR_EXTENDED_ERROR,则可用WNetGetLastError取得额外的错误信息
参数表
参数 类型及说明
lpszName String,已连接资源的远程名称或本地名称
bForce Long,如为TRUE,表示断开连接(即使连接的资源上正有打开的文件或作业)
5.WNetCancelConnection2
VB声明
Declare Function WNetCancelConnection2 Lib "mpr.dll" Alias "WNetCancelConnection2A" (ByVal lpName As String, ByVal dwFlags As Long, ByVal fForce As Long) As Long
说明
结束一个网络连接
返回值
Long,零表示成功。会设置GetLastError。如GetLastError是ERROR_EXTENDED_ERROR,则可用WNetGetLastError取得额外的错误信息
参数表
参数 类型及说明
lpszName String,已连接资源的远程名称或本地名称
dwFlags Long,设为零或CONNECT_UPDATE_PROFILE。如为零,而且建立的是永久性连接,则在windows下次重新启动时仍会重新连接
fForce Long,如为TRUE,表示强制断开连接(即使连接的资源上正有打开的文件或作业)
6.WNetCloseEnum
VB声明
Declare Function WNetCloseEnum Lib "mpr.dll" Alias "WNetCloseEnum" (ByVal hEnum As Long) As Long
说明
结束一次枚举操作
返回值
Long,零表示成功。会设置GetLastError。如GetLastError是ERROR_EXTENDED_ERROR,则可用WNetGetLastError取得额外的错误信息
参数表
参数 类型及说明
hEnum Long,由 WNetOpenEnum函数返回的一个枚举句柄
7.WNetConnectionDialog
VB声明
Declare Function WNetConnectionDialog Lib "mpr.dll" Alias "WNetConnectionDialog" (ByVal hwnd As Long, ByVal dwType As Long) As Long
说明
启动一个标准对话框,以便建立同网络资源的连接
返回值
Long,零表示成功。如用户取消了操作,则返回-1。会设置GetLastError。如GetLastError是ERROR_EXTENDED_ERROR,则可用WNetGetLastError取得额外的错误信息
参数表
参数 类型及说明
hwnd Long,指定要成为对话框父窗口的一个窗口的句柄
dwType Long,设成RESOURCETYPE_DISK,浏览磁盘资源
8.WNetDisconnectDialog
VB声明
Declare Function WNetDisconnectDialog Lib "mpr.dll" Alias "WNetDisconnectDialog" (ByVal hwnd As Long, ByVal dwType As Long) As Long
说明
启动一个标准对话框,以便断开同网络资源的连接
返回值
Long,零表示成功。如用户取消了操作,则返回-1。会设置GetLastError。如GetLastError是ERROR_EXTENDED_ERROR,则可用WNetGetLastError取得额外的错误信息
参数表
参数 类型及说明
hwnd Long,指定要成为对话框父窗口的一个窗口的句柄
dwType Long,设成RESOURCETYPE_DISK 或 RESOURCETYPE_PRINT,决定要断开的是磁盘还是打印机资源
9.WNetEnumResource
VB声明
Declare Function WNetEnumResource Lib "mpr.dll" Alias "WNetEnumResourceA" (ByVal hEnum As Long, lpcCount As Long, lpBuffer As Any, lpBufferSize As Long) As Long
说明
枚举网络资源
返回值
Long,零表示成功。ERROR_NO_MORE_ITEMS表示不剩下可以枚举的条目。ERROR_MORE_DATA表示条目不能装入lpBuffer。会设置GetLastError。如GetLastError是ERROR_EXTENDED_ERROR,则可用WNetGetLastError取得额外的错误信息
参数表
参数 类型及说明
hEnum Long,从WNetOpenEnum函数返回的一个句柄
lpcCount Long,最初设为要枚举的最大资源数量;或设为-1,表示枚举尽可能多的资源。一旦返回,就会设为实际枚举的资源数量
lpBuffer Any,通常是一个字节缓冲区的首字节。该缓冲区装载了枚举信息(可按引用声明为Byte)
lpBufferSize Long,以字节为单位指定lpBuffer数组的长度。如缓冲区不够大,则设为需要的缓冲区长度
注解
枚举网络条目时,最好用vb一次枚举一个资源。尽量不要使用这个函数同时枚举许多网络资源的功能
10.WNetGetConnection
VB声明
Declare Function WNetGetConnection Lib "mpr.dll" Alias "WNetGetConnectionA" (ByVal lpszLocalName As String, ByVal lpszRemoteName As String, cbRemoteName As Long) As Long
说明
获取本地或已连接的一个资源的网络名称
返回值
Long,零表示成功。会设置GetLastError。如GetLastError是ERROR_EXTENDED_ERROR,则可用WNetGetLastError取得额外的错误信息
参数表
参数 类型及说明
lpszLocalName String,本地设备的名字
lpszRemoteName String,指定一个字串缓冲区,用于装载设备的资源名称
cbRemoteName Long,lpszRemoteName缓冲区的字符数量。如缓冲区不够大,则设为需要的缓冲区长度
11.WNetGetLastError
VB声明
Declare Function WNetGetLastError Lib "mpr.dll" Alias "WNetGetLastErrorA" (lpError As Long, ByVal lpErrorBuf As String, ByVal nErrorBufSize As Long, ByVal lpNameBuf As String, ByVal nNameBufSize As Long) As Long
说明
获取网络错误的扩展错误信息
返回值
Long,零表示成功。ERROR_INVALID_ADDRESS表示缓冲区无效
参数表
参数 类型及说明
lpError Long,指定一个变量,用于装载网络错误代码。具体的代码由网络供应商决定
lpErrorBuf String,指定一个字串缓冲区,用于装载网络错误的说明
nErrorBufSize Long,lpErrorBuf缓冲区包含的字符数量
lpNameBuf String,用于装载网络供应商名字的字串缓冲区
nNameBufSize Long,lpNameBuf缓冲区的字符数量
12.WNetGetUniversalName
VB声明
Declare Function WNetGetUniversalName Lib "mpr" Alias "WNetGetUniversalNameA" (ByVal lpLocalPath As String, ByVal dwInfoLevel As Long, lpBuffer As Any, lpBufferSize As Long) As Long
说明
获取网络中一个文件的远程名称以及/或者UNC(统一命名规范)名称。例如,假设一个已连接的远程驱动器是\\othersystem\CDrive,它对应的本地驱动器是F:,而且在它的子目录temp中包含了文件xyz.doc。那么运算结果如下:LocalPath xyz.doc 或 f:\temp\xyz.doc(或者文件的任何相对路径名)
UNC 名称: \\othersystem\CDrive\temp\xyz.doc
连接名称: \\othersystem\CDrive
剩余名称: \temp\xyz.doc
它们分别对应于由这个函数装载的REMOTE_NAME_INFO结构的字段,对该结构的定义如下:
Type REMOTE_NAME_INFO
pUniversalName As Long
pConnectionName As Long
pRemainingPath As Long
End Type
返回值
Long,零表示成功。会设置GetLastError。如GetLastError是ERROR_EXTENDED_ERROR,则可用WNetGetLastError取得额外的错误信息
参数表
参数 类型及说明
lpLocalPath String,磁盘文件的名字
dwInfoLevel Long,下述常数之一:
UNIVERSAL_NAME_INFO_LEVEL 只设置pUniversalName字段
REMOTE_NAME_INFO_LEVEL 设置REMOTE_NAME_INFO结构中的所有三个字段
lpBuffer Any,指定用于装载UNC信息的一个缓冲区。缓冲区起点与一个REMOTE_NAME_INFO结构对应
lpBufferSize Long,以字节为单位指定lpBuffer缓冲区的长度。如缓冲区不够大,则设为需要的缓冲区长度
13.WNetGetUser
VB声明
Declare Function WNetGetUser Lib "mpr.dll" Alias "WNetGetUserA" (ByVal lpName As String, ByVal lpUserName As String, lpnLength As Long) As Long
说明
获取一个网络资源用以连接的名字
返回值
Long,零表示成功。会设置GetLastError。如GetLastError是ERROR_EXTENDED_ERROR,则可用WNetGetLastError取得额外的错误信息
参数表
参数 类型及说明
lpName String,指定已连接资源的远程名称或本地名称。用vbNullString获取当前用户的名字
lpUserName String,用于装载用户名的一个字串缓冲区
lpnLength Long,lpUserName缓冲区的长度。如缓冲区不够大,则自动设为需要的缓冲区长度
14.WNetOpenEnum
VB声明
Declare Function WNetOpenEnum Lib "mpr.dll" Alias "WNetOpenEnumA" (ByVal dwScope As Long, ByVal dwType As Long, ByVal dwUsage As Long, lpNetResource As NETRESOURCE, lphEnum As Long) As Long
说明
启动对网络资源进行枚举的过程。这个函数会返回由WNetEnumResource函数用于枚举资源所用的一个句柄
返回值
Long,零表示成功。会设置GetLastError。如GetLastError是ERROR_EXTENDED_ERROR,则可用WNetGetLastError取得额外的错误信息
参数表
参数 类型及说明
dwScope Long,指定要枚举的资源范围。可设为下述常数之一:
RESOURCE_CONNECTED 枚举已连接的资源(忽略dwUsage)
RESOURCE_GLOBALNET 枚举所有资源
RESOURCE_REMEMBERED 只枚举永久性连接
dwType Long,下述常数之一
RESOURCE_ANY 枚举所有类型的网络资源
RESOURCE_DISK 枚举磁盘资源
RESOURCE_PRINT 枚举打印资源
dwUsage Long,可设为零,表示枚举所有资源;或设为下述常数的一个或两个:
RESOURCEUSAGE_CONNECTABLE 只枚举那些能够连接的资源
RESOURCEUSAGE_CONTAINER 只枚举包含了其他资源的资源
lpNetResource NETRESOURCE,这个结构指定了一个容器资源。该函数会枚举包含于这里指定的某个指定资源内的资源。如设为NULL(把声明变成ByVal As Long),那么函数会枚举顶级网络资源。倘若在dwScope参数里没有指定RESOURCE_GLOBALNET,那么必须为NULL
lphEnum Long,指定一个变量,用于装载一个枚举句柄。该句柄由WNetEnumResource函数使用。必须用WNetCloseEnum函数将其清除