通过WMI获取远程机器磁盘信息的实现方法
通过WMI获取远程机器磁盘信息的实现方法
-远程连接WMI windows10专业版配置
今天尝试要获取远程机器的磁盘信息,查找了一下,根据 信息实现了监控磁盘的余量的监控功能。现介绍如下:
- win+r 输入 regedit 打开注册表编辑器
确认该路径HKEY_LOCAL_MACHINE→SOFTWARE→Microsoft→Ole→EnableDCOM的值是否为Y
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System看这个路径下是否有 32位类型为DWORD字段名为LocalAccountTokenFilterPolicy值为十六进制的1 没有则创建(需要手动创建,初始化的系统没有该值) - 检查远程连接所用的用户是否具有权限
win + r 输入 dcomcnfg 打开 组件服务
在组件服务->计算机->我的电脑 右键属性 COM安全 栏 启动和激活权限 编辑默认值 添加用户并勾选所有权限
点击默认属性,勾选"在此计算机上启用分布式COM" ,默认身份验证级别为连接,默认模拟级别是模拟或标识。(window初始化后,默认属性配置是正确的不需要修改) - 防火墙设置
直接关闭防火墙
端口135,139,或者445是否正常 - 测试配置是否成功
可以在另一台window win+r 输入wbemtest.exe打开Windows Management Instrumentation测试器
点击连接 在命名空间输入\192.169.204.132\root\cimv2,凭据下的用户名和密码输入被连接电脑的用户名和密码
点击连接,如果没有报错的话则配置成功 - 没有连接成功之后的检查项
Win+r 输入wmimgmt.msc 打开Windows管理体系结构控制台
右键点击WMI控制,选择属性 -> 安全 -> 安全设置。
添加用户 并勾选全部权限(该操作需要管理员权限)
按照4 步骤检查是否配置成功。
不成功则win+r输入services.msc 检查Remote Procedure Call (RPC),RemoteRegistry,Windows Management Instrumentation是否正在运行,没有运行的启动运行。(碰到被禁用的双击设置为手动在启动运行)
远程获取磁盘余量信息代码
public long GetRemoteDriverInfo(string sIP,string Username, string Password, string sDriverName)
{
try
{
#region 远程
ConnectionOptions connectionOptions = new ConnectionOptions();
connectionOptions.Username = Username;
connectionOptions.Password = Password;
connectionOptions.Timeout = new TimeSpan(1, 1, 1, 1);//连接时间
//ManagementScope 的服务器和命名空间。
string path = string.Format("\\\\{0}\\root\\cimv2", sIP);
ManagementScope scope = new ManagementScope(path, connectionOptions);
scope.Connect();
//查询字符串,某磁盘上信息
string strQuery = string.Format("select * from Win32_LogicalDisk");
ObjectQuery query = new ObjectQuery(strQuery);
//查询ManagementObjectCollection返回结果集
ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);
foreach (ManagementObject m in searcher.Get())
{
if (m["Name"].ToString().Contains(sDriverName) && m["DriveType"].ToString() == "3")//3:DriveType.Fixed
{
freesize = Convert.ToInt64(m["FreeSpace"]) / gb;
获得硬盘的可用空间
//free = Convert.ToInt64(Return["FreeSpace"]) / mb;
获得硬盘的已用空间
//use = (Convert.ToInt64(Return["Size"]) - Convert.ToInt64(Return["FreeSpace"])) / mb;