ComplianceServer/oldcode/Common/NetUseHelper.cs

140 lines
6.3 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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