140 lines
6.3 KiB
C#
140 lines
6.3 KiB
C#
using System;
|
||
using System.Collections.Generic;
|
||
using System.IO;
|
||
|
||
namespace WX.CRM.Common
|
||
{
|
||
/// <summary>
|
||
/// net use 建立映射的功能模块
|
||
/// </summary>
|
||
/// /*不建议指定盘符。因为IIS的网站默认是在IUser账户下运行的,而映射只针对'建立时的账户'有效。所以IUser下的映射又是无法预知的。所以应该建立连接后,仍然使用共享地址访问文件或目录。*/
|
||
public static class NetUseHelper
|
||
{
|
||
/// <summary>
|
||
/// 所有支持的驱动器号
|
||
/// </summary>
|
||
static readonly string[] driveNames = { "ZYXWVUTSRQPONMLKJIHGFEDC" };
|
||
/// <summary>
|
||
/// 建立映射
|
||
/// </summary>
|
||
/// <param name="sharename">共享路径</param>
|
||
/// <param name="user">用户名。为 null 不指定用户
|
||
/// <para>请务必使用共享服务器的IP或PC名称+用户名,例如:192.168.1.1\User。否则可能引起1312错误</para>
|
||
/// </param>
|
||
/// <param name="password">密码。为 null 不指定密码</param>
|
||
/// <param name="devicename">磁盘驱动器名称,例如(C:)。为 null 自动分配驱动器号 。为 空 不指定驱动器号</param>
|
||
/// <returns>驱动器名称</returns>
|
||
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;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 获取当前所有的驱动器
|
||
/// <para>Key:盘符</para>
|
||
/// <para>Value:盘符ProviderName(源路径信息)。如果为本地磁盘则为null</para>
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
private static Dictionary<string, string> GetAllDevic()
|
||
{
|
||
//得到当前所有的驱动器
|
||
var devicList = new Dictionary<string, string>(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;
|
||
}
|
||
}
|
||
}
|