今天看到项目中使用了下面的方式挂载本地磁盘驱动,映射网络共享目录:
[DllImport("mpr.dll", EntryPoint = "WNetAddConnection2")]
private static extern uint WNetAddConnection2(NetResource lpNetResource, string lpPassword, string lpUsername, uint dwFlags);
于是,上网查询相关接口,参数等调用情况,发现网上很多都是自己总结,总感觉都不够全面,还是看官方说明文档吧!
https://docs.microsoft.com/zh-cn/windows/win32/api/winnetwk/
===========================================================================
从网上找来一个,对方法进行了部分修改,参考使用
public class WNetHelper
{
[DllImport("mpr.dll", EntryPoint = "WNetAddConnection2")]
private static extern uint WNetAddConnection2(NetResource lpNetResource, string lpPassword, string lpUsername, uint dwFlags);
[DllImport("Mpr.dll", EntryPoint = "WNetCancelConnection2")]
private static extern uint WNetCancelConnection2(string lpName, uint dwFlags, bool fForce);
public enum ScopeType
{
ResourceConnected = 1,
ResourceGlobalnet = 2,
ResourceRemembered = 3,
ResourceRecent = 4,
ResourceContext = 5
}
[StructLayout(LayoutKind.Sequential)]
public class NetResource
{
public ScopeType dwScope;
public int dwType;
public int dwDisplayType;
public int 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;
}
/// <summary>
/// 为网络共享做本地映射
/// </summary>
/// <param name="username">访问用户名(windows系统需要加计算机名,如:comp-1\user-1)</param>
/// <param name="password">访问用户密码</param>
/// <param name="remoteName">网络共享路径(如:\\192.168.0.9\share)</param>
/// <param name="localName">本地映射盘符</param>
/// <returns></returns>
[Obsolete]
private static uint WNetAddConnection(string username, string password, string remoteName, string localName)
{
NetResource netResource = new NetResource();
netResource.dwScope = ScopeType.ResourceGlobalnet;
netResource.dwType = 1;
netResource.dwDisplayType = 3;
netResource.dwUsage = 1;
netResource.lpLocalName = localName;
netResource.lpRemoteName = remoteName.TrimEnd('\\');
uint result = WNetAddConnection2(netResource, password, username, 0);
return result;
}
/// <summary>
/// 映射网络共享做为本地资源
/// </summary>
/// <param name="remoteName">网络共享路径(如:\\192.168.0.9\share)</param>
/// <param name="userInfo">访问网络资源的域名、用户名、密码等</param>
/// <param name="localName">本地映射盘符。(如:z:)</param>
/// <returns></returns>
public static uint WNetAddConnection(string remoteName, System.Net.NetworkCredential userInfo = null, string localName = null)
{
NetResource netResource = new NetResource();
string username = "guest";
string password = "";
if (userInfo != null && !string.IsNullOrEmpty(userInfo.UserName))
{
username = (string.IsNullOrEmpty(userInfo.Domain) ? "" : userInfo.Domain + "\\") + userInfo.UserName;
password = userInfo.Password;
}
netResource.dwScope = ScopeType.ResourceGlobalnet;
netResource.dwType = 1;
netResource.dwDisplayType = 3;
netResource.dwUsage = 1;
netResource.lpLocalName = localName;
netResource.lpRemoteName = remoteName.TrimEnd('\\');
uint result = WNetAddConnection2(netResource, password, username, 0);
return result;
}
public static uint WNetCancelConnection(string name, uint flags, bool force)
{
uint nret = WNetCancelConnection2(name, flags, force);
return nret;
}
// SW_HIDE 0 //隐藏窗口,活动状态给令一个窗口
// SW_SHOWNORMAL 1 //用原来的大小和位置显示一个窗口,同时令其进入活动状态
// SW_NORMAL 1
// SW_SHOWMINIMIZED 2
// SW_SHOWMAXIMIZED 3
// SW_MAXIMIZE 3
// SW_SHOWNOACTIVATE 4 //用最近的大小和位置显示一个窗口,同时不改变活动窗口
// SW_SHOW 5 //用当前的大小和位置显示一个窗口,同时令其进入活动状态
// SW_MINIMIZE 6 //最小化窗口,活动状态给令一个窗口
// SW_SHOWMINNOACTIVE 7 //最小化一个窗口,同时不改变活动窗口
// SW_SHOWNA 8 //用当前的大小和位置显示一个窗口,不改变活动窗口
// SW_RESTORE 9 //与 SW_SHOWNORMAL 1 相同
// SW_SHOWDEFAULT 10
// SW_FORCEMINIMIZE 11
// SW_MAX 11
[DllImport("kernel32.dll")]
private static extern int WinExec(string exeName, int operType);
/// <summary>
/// 执行命令行代码的操作选项
/// </summary>
public enum ExecType
{
/// <summary>
/// 隐藏窗口,活动状态给令一个窗口
/// </summary>
sw_hide = 0,
/// <summary>
/// 用原来的大小和位置显示一个窗口,同时令其进入活动状态
/// </summary>
sw_shownormal = 1,
sw_normal = 1,
sw_showminimized = 2,
sw_showmaximized = 3,
sw_maximize = 3,
/// <summary>
/// 用最近的大小和位置显示一个窗口,同时不改变活动窗口
/// </summary>
sw_shownoactivate = 4,
/// <summary>
/// 用当前的大小和位置显示一个窗口,同时令其进入活动状态
/// </summary>
sw_show = 5,
/// <summary>
/// 最小化窗口,活动状态给令一个窗口
/// </summary>
sw_minimize = 6,
/// <summary>
/// 最小化一个窗口,同时不改变活动窗口
/// </summary>
sw_showminnoactive = 7,
/// <summary>
/// 用当前的大小和位置显示一个窗口,不改变活动窗口
/// </summary>
sw_showna = 8,
/// <summary>
/// 与 sw_shownormal 1 相同
/// </summary>
sw_restore = 9,
sw_showdefault = 10,
sw_forceminimize = 11,
sw_max = 11,
}
/// <summary>
/// 执行命令行代码的
/// </summary>
/// <param name="commandCode">命令行字符串</param>
/// <param name="operType">操作选项</param>
/// <returns></returns>
public static int ExecCommand(string commandCode, ExecType operType)
{
return WinExec(commandCode, (int)operType);
}
}
映射Z盘的调用格式:
const string netWorkPath = @"\\192.168.1.120\共享";
const string netWorkUser = "Administrator";
const string netWorkPwd = "admin123";
state = WNetHelper.WNetAddConnection(netWorkPath, new NetworkCredential(netWorkUser, netWorkPwd), "Z:");
命令行代码调用方式: