C# 带用户密码访问网络共享
调用WNetUseConnection API
函数详细参数参考:https://msdn.microsoft.com/en-us/library/windows/desktop/aa385482(v=vs.85).aspx
C# 调用WNetUseConnection连接共享类的代码:
NetworkShareConnect.cs
//引入命名空间
//using System.Runtime.InteropServices; public class NetworkShareConnect
{
#region WNetUseConnection枚举参数
//dwScope
const int RESOURCE_CONNECTED = 0x00000001;
const int RESOURCE_GLOBALNET = 0x00000002;
const int RESOURCE_REMEMBERED = 0x00000003; //dwType
const int RESOURCETYPE_ANY = 0x00000000;
const int RESOURCETYPE_DISK = 0x00000001;
const int RESOURCETYPE_PRINT = 0x00000002; //dwDisplayType
const int RESOURCEDISPLAYTYPE_GENERIC = 0x00000000;
const int RESOURCEDISPLAYTYPE_DOMAIN = 0x00000001;
const int RESOURCEDISPLAYTYPE_SERVER = 0x00000002;
const int RESOURCEDISPLAYTYPE_SHARE = 0x00000003;
const int RESOURCEDISPLAYTYPE_FILE = 0x00000004;
const int RESOURCEDISPLAYTYPE_GROUP = 0x00000005; //dwUsage
const int RESOURCEUSAGE_CONNECTABLE = 0x00000001;
const int RESOURCEUSAGE_CONTAINER = 0x00000002; //dwFlags
const int CONNECT_INTERACTIVE = 0x00000008;
const int CONNECT_PROMPT = 0x00000010;
const int CONNECT_REDIRECT = 0x00000080;
const int CONNECT_UPDATE_PROFILE = 0x00000001;
const int CONNECT_COMMANDLINE = 0x00000800;
const int CONNECT_CMD_SAVECRED = 0x00001000; const int CONNECT_LOCALDRIVE = 0x00000100;
#endregion #region Errors参数
const int NO_ERROR = ; const int ERROR_ACCESS_DENIED = ;
const int ERROR_ALREADY_ASSIGNED = ;
const int ERROR_BAD_DEVICE = ;
const int ERROR_BAD_NET_NAME = ;
const int ERROR_BAD_PROVIDER = ;
const int ERROR_CANCELLED = ;
const int ERROR_EXTENDED_ERROR = ;
const int ERROR_INVALID_ADDRESS = ;
const int ERROR_INVALID_PARAMETER = ;
const int ERROR_INVALID_PASSWORD = ;
const int ERROR_MORE_DATA = ;
const int ERROR_NO_MORE_ITEMS = ;
const int ERROR_NO_NET_OR_BAD_PATH = ;
const int ERROR_NO_NETWORK = ; const int ERROR_BAD_PROFILE = ;
const int ERROR_CANNOT_OPEN_PROFILE = ;
const int ERROR_DEVICE_IN_USE = ;
const int ERROR_NOT_CONNECTED = ;
const int ERROR_OPEN_FILES = ; private struct ErrorClass
{
//定义错误类结构体
public int num;
public string message;
public ErrorClass(int num, string message)
{
this.num = num;
this.message = message;
}
} //连接失败信息汇总
private static ErrorClass[] ERROR_LIST = new ErrorClass[] {
new ErrorClass(ERROR_ACCESS_DENIED, "Error: Access Denied"),
new ErrorClass(ERROR_ALREADY_ASSIGNED, "Error: Already Assigned"),
new ErrorClass(ERROR_BAD_DEVICE, "Error: Bad Device"),
new ErrorClass(ERROR_BAD_NET_NAME, "Error: Bad Net Name"),
new ErrorClass(ERROR_BAD_PROVIDER, "Error: Bad Provider"),
new ErrorClass(ERROR_CANCELLED, "Error: Cancelled"),
new ErrorClass(ERROR_EXTENDED_ERROR, "Error: Extended Error"),
new ErrorClass(ERROR_INVALID_ADDRESS, "Error: Invalid Address"),
new ErrorClass(ERROR_INVALID_PARAMETER, "Error: Invalid Parameter"),
new ErrorClass(ERROR_INVALID_PASSWORD, "Error: Invalid Password"),
new ErrorClass(ERROR_MORE_DATA, "Error: More Data"),
new ErrorClass(ERROR_NO_MORE_ITEMS, "Error: No More Items"),
new ErrorClass(ERROR_NO_NET_OR_BAD_PATH, "Error: No Net Or Bad Path"),
new ErrorClass(ERROR_NO_NETWORK, "Error: No Network"),
new ErrorClass(ERROR_BAD_PROFILE, "Error: Bad Profile"),
new ErrorClass(ERROR_CANNOT_OPEN_PROFILE, "Error: Cannot Open Profile"),
new ErrorClass(ERROR_DEVICE_IN_USE, "Error: Device In Use"),
new ErrorClass(ERROR_EXTENDED_ERROR, "Error: Extended Error"),
new ErrorClass(ERROR_NOT_CONNECTED, "Error: Not Connected"),
new ErrorClass(ERROR_OPEN_FILES, "Error: Open Files"),
}; private static string getErrorForNumber(int errNum)
{
//遍历获得错误代码
foreach (ErrorClass er in ERROR_LIST)
{
if (er.num == errNum) return er.message;
}
return "Error: Unknown, " + errNum;
}
#endregion //调用系统函数WNetUseConnection
//用于连接共享
[DllImport("Mpr.dll")]
private static extern int WNetUseConnection(
IntPtr hwndOwner,
NETRESOURCE lpNetResource,
string lpPassword,
string lpUserID,
int dwFlags,
string lpAccessName,
string lpBufferSize,
string lpResult
);
//用于删除连接
[DllImport("Mpr.dll")]
private static extern int WNetCancelConnection2(
string lpName,
int dwFlags,
bool fForce
); [StructLayout(LayoutKind.Sequential)]
private class NETRESOURCE
{
public int dwScope = ;
public int dwType = ;
public int dwDisplayType = ;
public int dwUsage = ;
public string lpLocalName = "";//映射到本地的盘符,如"Z:"。不做驱动器映射,可为空
public string lpRemoteName = "";//共享的网络路径
public string lpComment = "";
public string lpProvider = "";
} /// <summary>
/// 连接共享
/// </summary>
/// <param name="remoteUNC">共享网络路径</param>
/// <param name="username">登录用户名</param>
/// <param name="password">密码</param>
/// <returns></returns>
public static string connectToShare(string remoteUNC, string username, string password)
{
return connectToRemote(remoteUNC, username, password, false);
} /// <summary>
/// 没用户密码连接
/// </summary>
/// <param name="remoteUNC">共享网络路径</param>
/// <returns></returns>
public static string connectToShare(string remoteUNC)
{
return connectToRemote(remoteUNC, "", "", true);
} private static string connectToRemote(string remoteUNC, string username, string password, bool promptUser)
{
NETRESOURCE nr = new NETRESOURCE
{
dwType = RESOURCETYPE_DISK,
lpRemoteName = remoteUNC
}; int ret;
if (promptUser)
ret = WNetUseConnection(IntPtr.Zero, nr, "", "", CONNECT_INTERACTIVE | CONNECT_PROMPT, null, null, null);
else
ret = WNetUseConnection(IntPtr.Zero, nr, password, username, , null, null, null); if (ret == NO_ERROR) return null;
return getErrorForNumber(ret);
} public static string disconnectRemote(string remoteUNC)
{
int ret = WNetCancelConnection2(remoteUNC, CONNECT_UPDATE_PROFILE, false);
if (ret == NO_ERROR) return null;
return getErrorForNumber(ret);
}
}
测试:

注意:断开共享后,系统缓存还在,没能即时失去连接,在1-3分钟内仍然可以访问共享。
有时候要注销才能失去连接,原因未明 %>_<%
C# 带用户密码访问网络共享的更多相关文章
- win7自带wifi win7无线网络共享设置图文方法
win7自带wifi win7无线网络共享设置图文方法 点评:开启windows 7的隐藏功能:虚拟WiFi和SoftAP(即虚拟无线AP),就可以让电脑变成无线路由器,实现共享上网,节省网费和路由器 ...
- win7不需要密码访问网络共享文件(转载)
大家是不是觉得,共享一个文件夹后,每次输入密码都很麻烦呢?有没有不需要输入密码就可以访问共享文件的方法呢? 答案是肯定的,当然有,下面介绍下win7不需要密码访问网络共享文件 工具/原料 两台电脑在局 ...
- wifidog 用户第一次访问网络流程图
通过wifidog实现用户上网强制认证后,用户第一次访问网络的流程大致如下: 1.用户通过浏览器访问某一网页. 2.wifidog重定向用户请求到认证服务器. 3.认证服务器返回登录认证页面给用户. ...
- Samba服务器搭建,匿名访问,用户密码访问
环境 #服务端:centos7 客户端:centos7,windows10 配置yum源,使用光盘镜像安装Samba服务 #挂载光盘:mount /dev/sr0 /mnt/cdrom #安装sa ...
- 关于windows service不能访问网络共享盘(NetWork Drive)的解决方案
我映射一个网络驱动器到本机的时候,发现本机的程序直接能访问读取网络驱动器,但是把本机的程序作为本机的windows服务运行的时候就不能访问了. Qt中的QDir::exist(folder)访问失败. ...
- Windows 10 访问网络共享 总是提示用户名或密码不正确的解决方法
今天同事在Windows10上共享了一些文件,其他使用Windows 7的同事都可以正常使用,唯独我是使用Windows 10操作系统的,和别人输入一样的用户名和密码,却总是告诉我:用户名或密码不正确 ...
- 邮Z速递物流,让用户密码在网络中遨游
" 最近分析快递行业的APP上瘾了,求解救." 邮政作为快递行业一个傻大黑的存在,一直很奇怪,我一直在纳闷,邮政和EMS到底是不是一家,在很多网点,它们是一体的存在,但很多东西,又 ...
- c# 用户名 密码 访问 局域网共享
#region Ping 返回true则代表可以连接成功 public bool Ping(string remoteHost) { bool Flag = false; Process proc = ...
- iis访问网络路径映射问题(UNC share)
最近在做一个功能,涉及到nas网络磁盘文件的保存和访问,在服务器上将对应的路径映射为Z盘,结果在iis上部署网站直接访问该路径,报无法找到该路径的错误. 用的是.net core开发,在vs直接启动程 ...
随机推荐
- BootstrapQ 包Bootstrap tree,dialog等待
官方网站:http://uikoo9.com/bootstrapQ why 事实上bootstrap已经非常好了,唯一的软肋就是js方面有些薄弱,对照easyui就知道了. 能够非常明显的知道boot ...
- VS2012 添加服务引用常见错误
问题:用vs2012 添加wcf引用时在对象查看器中找不到 服务引用的类 例如默认高级配置: 解决办法:在服务的高级配置中,将重新使用引用的程序集中的类型 选项勾去掉 点击确定 即可
- 皮尔逊相似度计算的例子(R语言)
编译最近的协同过滤算法皮尔逊相似度计算.下顺便研究R简单使用的语言.概率统计知识. 一.概率论和统计学概念复习 1)期望值(Expected Value) 由于这里每一个数都是等概率的.所以就当做是数 ...
- Cocos2d-x 如何输出 Android用电话 腰带Tag的Log刊物
于Cocos2d-x根据代码 #if(CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) #define LOGAnroid( ...) #else if (CC_TAR ...
- proxool数据库连接池配置
proxool.xml构造 <?xml version="1.0" encoding="UTF-8"?> <something-else-en ...
- AspUpload组件的安装及使用方法介绍
http://soft.huweishen.com/soft/47.html AspUpload对ASP编程人员来说要实现ASP网站文件上传功能它是首选.本文就为大家介绍一下AspUpload组件的安 ...
- Snail—ORACLE基础之事务学习(五)
---------------事务---当运行到commit时 事务才算是完毕,不然 会运行rollback操作. declare v_money acount.money%type:=1223; e ...
- aauto攫http数据
说明:灵巧使用上述数据的抓取网页简单的例子. 样例:想把某站点的数据抓回来.然后保存在数据库里边. 步骤:1.打开sql.new一个数据库Test.新建一个表test. 2.打开快手.准备抓数据,以这 ...
- 上传文件块client实现
首先由内容阻止所有文件(块大小的约束),然后对于每一个chunk构造单独的一个UDP 数据报进行传输,在应用层的開始是自己定义的包头,有块号,块长度,块指纹等元数据信息,这些信息便于接收端可以按序正确 ...
- Arduino 数码管LED驱动器 阵列方法
样品谈到最后一个驱动程序LED数码管,采用了最简单的解决方案之一,对于每一个LED高低电平控制,这样的好处是每个LED控制可检.避免短路造成的错觉,因为,但是对于数字的变化是,它是多余的写,因此,这种 ...