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; } } }