前一段时间负责做一家医院的病案管理系统,其中有一项需求是,把纸质档案拍照传到指定的ftp主机上,很简单的一个需求,基本不需要做服务端程序,直接在服务器主机上搭建ftp即可,然后就可以在医院的局域网内,通过提供的ftp账号密码存取文件。

一切貌似都很完美,直到客户提了个不过分的需求,要求利用病案管理系统往ftp主机上上传电子档案的同时,能够实时看到当前ftp主机存储所在磁盘的使用情况,空间不足时能够及时提醒更换磁盘(空间消耗挺快的,一天要上传后很多份电子病案)。

这个貌似很简单的需求,但我去实现的时候却头大了,因为C#中负责主要的ftp交互的,是微软提供的ftp关键类FtpWebRequest,但是实际上它是没办法获取被搭建ftp的磁盘的存储信息的,莫非为了这个小需求还要写个服务端程序?我有点不甘心,就在网上找相关的方式,最后发现一个脱离ftp获取远程主机信息的方式,核心就是微软提供的WMI技术,全称(Windows Management Instrumentation)即Windows管理工具。它是Windows操作系统中管理数据和操作的基础模块。我们可以通过WMI脚本或者应用程序去管理本地或者远程计算机上的资源。可以获取相关的硬件信息比如CPU序列号和硬盘序列号等,关于WMI的相关技术我只是蜻蜓点水般运用一点,没有大量研究,有兴趣的同学可以去深入了解一下,大牛们见笑了。好了,下面我们步入正题,如何利用WMI获取远程主机的磁盘信息:

//创建WMI连接对象,注意引用System.Management命名空间,需要先在项目引用中添加,然后代码中using

ConnectionOptions conn = new ConnectionOptions();
conn.Username = user; //远程主机用户名,注意,必需是管理员权限
conn.Password = pwd; //密码
conn.Authority = "ntlmdomain:DOMAIN";      // 这句很重要
conn.Timeout = new TimeSpan(1, 1, 1, 1);//连接时间


//ManagementScope 的服务器和命名空间。  
string path = string.Format(@"\\{0}\root\cimv2", address);
//表示管理操作的范围(命名空间),使用指定选项初始化ManagementScope 类的、表示指定范围路径的新实例。 
ManagementScope scope = new ManagementScope(path, conn);
scope.Connect(); //打开连接方法,如果执行到这里报出拒绝访问的错误,请检查目标账号是否为目标主机管理员账号,或者目标主机WMI服务是否开启
//查询
string strQuery = "select * from Win32_LogicalDisk where Name = 'D:'";//查询语句,这里是查询D盘存储信息
ObjectQuery query = new ObjectQuery(strQuery);
//查询ManagementObjectCollection返回结果集  
ManagementObjectSearcher wmifind = new ManagementObjectSearcher(scope, query);
long gb = 1024 * 1024 * 1024;
string type = "";
foreach (var mobj in wmifind.Get()) //循环结果集
{
type = mobj["Description"].ToString();
//判断是否是本机固盘
if (type == "Local Fixed Disk")
{
int free = (int)Math.Round(Convert.ToDouble(mobj["FreeSpace"]) / gb, 0);//获取到可用空间
int size = (int)Math.Round(Convert.ToDouble(mobj["Size"].ToString()) / gb, 0);//获取到总空间
int use = size - free;//已用空间
}
}

以上,就是可以在无服务端程序的情况下,获取目标主机磁盘使用情况的代码,当然为了安全考虑,请务必做好账号和密码的加密工作,如有不妥之处,请各位一定指正,共同学习,共同进步。

Logo

快速构建 Web 应用程序

更多推荐