转自http://blog.csdn.net/aoyo/article/details/3939651
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);
}
参考文档:
http: // support.microsoft.com/kb/173011
http: // support.microsoft.com/kb/842789
在目标服务器建立共享文件夹,建立访问账号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);
}
参考文档:
http: // support.microsoft.com/kb/173011
http: // support.microsoft.com/kb/842789