using System;
using System.Collections.Generic;
using System.IO;
namespace WX.CRM.Common
{
///
/// net use 建立映射的功能模块
///
/// /*不建议指定盘符。因为IIS的网站默认是在IUser账户下运行的,而映射只针对'建立时的账户'有效。所以IUser下的映射又是无法预知的。所以应该建立连接后,仍然使用共享地址访问文件或目录。*/
public static class NetUseHelper
{
///
/// 所有支持的驱动器号
///
static readonly string[] driveNames = { "ZYXWVUTSRQPONMLKJIHGFEDC" };
///
/// 建立映射
///
/// 共享路径
/// 用户名。为 null 不指定用户
/// 请务必使用共享服务器的IP或PC名称+用户名,例如:192.168.1.1\User。否则可能引起1312错误
///
/// 密码。为 null 不指定密码
/// 磁盘驱动器名称,例如(C:)。为 null 自动分配驱动器号 。为 空 不指定驱动器号
/// 驱动器名称
public static string Build(string sharename, string user = null, string password = null, string devicename = null)
{
if (devicename != string.Empty)//为空时在已有的列表中得不到信息,所以不用判断了
{
//得到当前所有的映射驱动器及地址
var netUseList = GetAllDevic();
//标准格式
sharename = @"\\" + sharename.Trim('\\');
if (devicename == null)//自动分配驱动器号
{
for (int i = 0; i < driveNames.Length; i++)
{
string name = driveNames[i];
if (netUseList.ContainsKey(name)) continue;//已存在
devicename = name;
break;
}
if (devicename == null)
throw new ArgumentException("当前没有可用的驱动器号.");
}
else
{
//标准格式
devicename = devicename.Trim('\\', ':');
//判断是否已存在相同的共享
foreach (var kv in netUseList)
{
if (kv.Value == null) continue;
//驱动器号和共享路径一致
if (string.Equals(kv.Key, devicename, StringComparison.CurrentCultureIgnoreCase)
&& string.Equals(kv.Value, sharename, StringComparison.CurrentCultureIgnoreCase))
return devicename;//已存在,返回
}
//共享没在用,但其他占用驱动器号
if (netUseList.ContainsKey(devicename))
throw new ArgumentException("驱动器号" + devicename + "正在使用.");
}
}
if (!Directory.Exists(sharename))
{
//LogHelper.Info("sharename:" + sharename);
using (System.Diagnostics.Process myProcess = new System.Diagnostics.Process())
{
string command = string.Format(@"use ");
if (devicename != string.Empty)
{
command += devicename.Trim('\\', ':') + ": ";
}
command += string.Format("\"{0}\" ", sharename);
if (user != null)
{
command += string.Format(@"""{0}"" /user:""{1}"" ", password, user);
}
//System.IO.File.AppendAllText(@"D:\web\WXCRM.WxService.Test\log.txt", command);
//通过net use的命令 创建共享。
System.Diagnostics.ProcessStartInfo info = new System.Diagnostics.ProcessStartInfo("net ", command);
info.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
info.CreateNoWindow = true;
info.UseShellExecute = false;
info.RedirectStandardError = true;
myProcess.StartInfo = info;
myProcess.Start();
myProcess.WaitForExit(6000);
string errormsg = myProcess.StandardError.ReadToEnd();
myProcess.Close();
if (!string.IsNullOrEmpty(errormsg))
throw new InvalidOperationException(errormsg);
}
}
return devicename;
}
///
/// 获取当前所有的驱动器
/// Key:盘符
/// Value:盘符ProviderName(源路径信息)。如果为本地磁盘则为null
///
///
private static Dictionary GetAllDevic()
{
//得到当前所有的驱动器
var devicList = new Dictionary(StringComparer.CurrentCultureIgnoreCase);
var selectQuery = new System.Management.SelectQuery("select * from win32_logicaldisk");
var searcher = new System.Management.ManagementObjectSearcher(selectQuery);
foreach (System.Management.ManagementObject disk in searcher.Get())
{
var devName = disk["DeviceID"];
if (devName == null)
devName = disk["Name"];
var diskName = devName.ToString().Trim('\\', ':');
devicList.Add(diskName, null);
var access = disk["Access"];
if (access == null || access.ToString() != "0") continue;//不可访问
var drivetype = disk["DriveType"];
if (drivetype == null || drivetype.ToString() != "4") continue;//不是网络驱动器
var providername = disk["ProviderName"];
if (providername == null) continue;//没有映射源
devicList[diskName] = providername.ToString();
}
return devicList;
}
}
}