c# 服务器性能监控,C#服务器性能监控之WMI的代码示例详解
1.WMI简介
WMI是英文Windows Management Instrumentation的简写,通过使用WMI,我们可以获取本地或远程服务器的性能参数和进程运行情况,以及大部分硬件信息,但前提是运行的用户要有足够的权限,如administrator组用户等。这也是做负载均衡所需要且比较方便快捷的途径。
2.使用时首先添加System.Management.dll,然后引用using System.Management;
3.定义远程访问public
class
ManagementConnectPool
...
{
private
static
System.Management.ConnectionOptions Conn =
new
ConnectionOptions() ;
private
static
ManagementObjectSearcher mos =
new
ManagementObjectSearcher();
private
string
username = "";
private
string
pwd = "";
private
string
space="";
private
string
server = "";
public
ManagementConnectPool(
string
mpusername,
string
mppwd ,
string
mpspace ,
string
mpserver)
...
{
this
.username = mpusername;
this
.pwd = mppwd;
this
.space = mpspace;
this
.server = mpserver;
Conn.Username = mpusername;
Conn.Password = mppwd;
string
scopestring ="//" + mpserver + mpspace;
System.Management.ManagementScope Ms =
new
ManagementScope(scopestring);
Ms.Connect();
mos.Scope = Ms;
}
public
ManagementObjectCollection getQueryResult(
string
queryString)
...
{
ObjectQuery oq =
new
ObjectQuery();
oq.QueryString = queryString;
mos.Query = oq;
ManagementObjectCollection moc =mos.Get();
return
moc;
}
}
4.获取CPU,内存,网络流量等信息public
class
Monitor
...
{
private
string
username = "";
private
string
pwd ="";
private
string
ip = "";
ManagementConnectPool mcp;
WMSServerClass server;
public
Monitor(
string
username,
string
pwd,
string
ip)
...
{
this
.username = username;
this
.pwd = pwd ;
this
.ip = ip;
mcp =
new
ManagementConnectPool(username,pwd,"/root/cimv2",ip);
server =
new
WMSServerClass();
}
WMI方式获取网卡流量
#region
WMI方式获取网卡流量
private
void
getNetWorkFlow()
...
{
ManagementObjectCollection moc = mcp.getQueryResult(@"select * from Win32_NetworkAdapter where macaddress<>null and manufacturer<>'Microsoft'");
string
[] list =
new
string
[moc.Count] ;
foreach
(System.Management.ManagementObject mymac
in
moc)
...
{
string
a = mymac["Speed"].ToString();
//
null WMI未实现该属性
Console.WriteLine(a.ToString());
}
}
#endregion
WMI方式获取CPU信息
#region
WMI方式获取CPU信息
private
void
getCpuInfo()
...
{
ManagementObjectCollection moc = mcp.getQueryResult("select * from Win32_Processor");
string
[] list =
new
string
[moc.Count];
int
i = 0;
foreach
(ManagementObject mo
in
moc)
...
{
string
total = mo.GetPropertyValue("LoadPercentage").ToString();
list[i]=total;
i++;
}
}
#endregion
WMI方式获取内存使用率
#region
WMI方式获取内存使用率
public
string
getMemoryUsage()
...
{
ManagementObjectCollection moc = mcp.getQueryResult("select * from Win32_LogicalMemoryConfiguration");
int
totalm = 1;
int
avilablem = 1;
foreach
(ManagementObject mo
in
moc)
...
{
string
total = mo.GetPropertyValue("TotalPhysicalMemory").ToString();
totalm =
int
.Parse(total);
}
moc = mcp.getQueryResult("select * from Win32_PerfRawData_PerfOS_Memory");
foreach
(ManagementObject mo
in
moc)
...
{
string
avilable = mo.GetPropertyValue("AvailableKBytes").ToString();
avilablem =
int
.Parse(avilable);
}
int
usedm = totalm - avilablem;
double
memoryusage = (
double
)usedm * (
double
)100 / (
double
)totalm ;
return
memoryusage.ToString();
}
#endregion
}
5.获取本地机器信息(WEB)1.如何用WMI获得指定磁盘的容量
#region
1.如何用WMI获得指定磁盘的容量
private
string
DriveType(
string
type)
...
{
string
rtntype="";
switch
(type)
...
{
case
"1":
rtntype="Not Type";
break
;
case
"2":
rtntype="Floppy disk";
break
;
case
"3":
rtntype="Hard disk";
break
;
case
"4":
rtntype="Removable drive or network drive";
break
;
case
"5":
rtntype="CD-ROM";
break
;
case
"6":
rtntype="RAM disk";
break
;
default
:
break
;
}
return
rtntype;
}
private
void
Button1_Click(
object
sender, System.EventArgs e)
...
{
SelectQuery query=
new
SelectQuery("Select * From Win32_LogicalDisk");
ManagementObjectSearcher searcher=
new
ManagementObjectSearcher(query);
foreach
(ManagementBaseObject disk
in
searcher.Get())
...
{
Response.Write(disk["Name"] +" "+DriveType(disk["DriveType"].ToString()) + " " + disk["VolumeName"]+"
");
}
}
#endregion
2.如何用WMI获得指定磁盘的容量
#region
2.如何用WMI获得指定磁盘的容量
private
void
Button2_Click(
object
sender, System.EventArgs e)
...
{
ManagementObject disk =
new
ManagementObject("win32_logicaldisk.deviceid="c:"");
disk.Get();
Response.Write("Logical Disk Size = " + disk["Size"] + " bytes");
}
#endregion
3.如何列出机器中所有的共享资源
#region
3.如何列出机器中所有的共享资源
private
void
Button3_Click(
object
sender, System.EventArgs e)
...
{
ManagementObjectSearcher searcher =
new
ManagementObjectSearcher("SELECT * FROM Win32_share");
foreach
(ManagementObject share
in
searcher.Get())
...
{
Response.Write(share.GetText(TextFormat.Mof));
}
}
#endregion
4.怎样写程控制让系统中的某个文件夹共享或取消共享
#region
4.怎样写程控制让系统中的某个文件夹共享或取消共享
private
void
Button4_Click(
object
sender, System.EventArgs e)
...
{
/**/
/*
首先,这需要以有相应权限的用户登录系统才行
将
object[] obj = {"C:/Temp","我的共享",0,10,"Dot Net 实现的共享",""};
改为
object[] obj = {"C:/Temp","我的共享",0,null,"Dot Net 实现的共享",""};
就可以实现授权给最多用户了。
*/
ManagementClass _class =
new
ManagementClass(
new
ManagementPath("Win32_Share"));
object
[] obj =
...
{"C:/Temp","我的共享",0,10,"Dot Net 实现的共享",""}
;
_class.InvokeMethod("create",obj);
}
#endregion
5.如何获得系统服务的运行状态
#region
5.如何获得系统服务的运行状态
private
void
Button5_Click(
object
sender, System.EventArgs e)
...
{
string
[] lvData =
new
string
[4];
ManagementObjectSearcher searcher =
new
ManagementObjectSearcher("SELECT * FROM Win32_Service");
foreach
(ManagementObject mo
in
searcher.Get())
...
{
lvData[0] = mo["Name"].ToString();
lvData[1] = mo["StartMode"].ToString();
if
(mo["Started"].Equals(
true
))
lvData[2] = "Started";
else
lvData[2] = "Stop";
lvData[3] = mo["StartName"].ToString();
Response.Write(lvData[0]+lvData[1]+lvData[2]+lvData[3]);
}
}
#endregion
6.通过WMI修改IP,而实现不用重新启动
#region
6.通过WMI修改IP,而实现不用重新启动
private
void
Button6_Click(
object
sender, System.EventArgs e)
...
{
ReportIP();
//
SwitchToDHCP();
SwitchToprivate();
Thread.Sleep( 5000 );
ReportIP();
Response.Write( "end." );
}
private
void
SwitchToDHCP()
...
{
ManagementBaseObject inPar =
null
;
ManagementBaseObject outPar =
null
;
ManagementClass mc =
new
ManagementClass("Win32_NetworkAdapterConfiguration");
ManagementObjectCollection moc = mc.GetInstances();
foreach
( ManagementObject mo
in
moc )
...
{
if
( ! (
bool
) mo["IPEnabled"] )
continue
;
inPar = mo.GetMethodParameters("EnableDHCP");
outPar = mo.InvokeMethod( "EnableDHCP", inPar,
null
);
break
;
}
}
private
void
SwitchToprivate()
...
{
ManagementBaseObject inPar =
null
;
ManagementBaseObject outPar =
null
;
ManagementClass mc =
new
ManagementClass("Win32_NetworkAdapterConfiguration");
ManagementObjectCollection moc = mc.GetInstances();
foreach
( ManagementObject mo
in
moc )
...
{
if
( ! (
bool
) mo[ "IPEnabled" ] )
continue
;
inPar = mo.GetMethodParameters( "Enableprivate" );
inPar["IPAddress"] =
new
string
[]
...
{ "192.168.1.1" }
;
inPar["SubnetMask"] =
new
string
[]
...
{ "255.255.255.0" }
;
outPar = mo.InvokeMethod( "Enableprivate", inPar,
null
);
break
;
}
}
private
void
ReportIP()
...
{
Response.Write( "****** Current IP addresses:" );
ManagementClass mc =
new
ManagementClass("Win32_NetworkAdapterConfiguration");
ManagementObjectCollection moc = mc.GetInstances();
foreach
( ManagementObject mo
in
moc )
...
{
if
( ! (
bool
) mo[ "IPEnabled" ] )
continue
;
string
str="{0} SVC: '{1}' MAC: [{2}]";
str=
string
.Format(mo["Caption"].ToString(), mo["ServiceName"].ToString(),mo["MACAddress"].ToString());
Response.Write(str);
string
[] addresses = (
string
[]) mo[ "IPAddress" ];
string
[] subnets = (
string
[]) mo[ "IPSubnet" ];
Response.Write( " Addresses :" );
foreach
(
string
sad
in
addresses)
Response.Write(sad+"
");
Response.Write( " Subnets :" );
foreach
(
string
sub
in
subnets )
Response.Write(sub+"
");
}
}
#endregion
7.如何利用WMI远程重启远程计算机
#region
7.如何利用WMI远程重启远程计算机
private
void
Button7_Click(
object
sender, System.EventArgs e)
...
{
Response.Write("Computer details retrieved using Windows Management Instrumentation (WMI)");
Response.Write("mailto:singlepine@hotmail.com");
Response.Write("=========================================================================");
//
连接远程计算机
ConnectionOptions co =
new
ConnectionOptions();
co.Username = "john";
co.Password = "john";
System.Management.ManagementScope ms =
new
System.Management.ManagementScope("//192.168.1.2/root/cimv2", co);
//
查询远程计算机
System.Management.ObjectQuery oq =
new
System.Management.ObjectQuery("SELECT * FROM Win32_OperatingSystem");
ManagementObjectSearcher query1 =
new
ManagementObjectSearcher(ms,oq);
ManagementObjectCollection queryCollection1 = query1.Get();
foreach
( ManagementObject mo
in
queryCollection1 )
...
{
string
[] ss=
...
{""}
;
mo.InvokeMethod("Reboot",ss);
Response.Write(mo.ToString());
}
}
#endregion
8.利用WMI创建一个新的进程
#region
8.利用WMI创建一个新的进程
private
void
Button8_Click(
object
sender, System.EventArgs e)
...
{
//
Get the object on which the method will be invoked
ManagementClass processClass =
new
ManagementClass("Win32_Process");
//
Get an input parameters object for this method
ManagementBaseObject inParams = processClass.GetMethodParameters("Create");
//
Fill in input parameter values
inParams["CommandLine"] = "calc.exe";
//
Execute the method
ManagementBaseObject outParams = processClass.InvokeMethod ("Create", inParams,
null
);
//
Display results
//
Note: The return code of the method is provided in the "returnvalue" property of the outParams object
Response.Write("Creation of calculator process returned: " + outParams["returnvalue"]);
Response.Write("Process ID: " + outParams["processId"]);
}
#endregion
9.如何通过WMI终止一个进程
#region
9.如何通过WMI终止一个进程
private
void
Button9_Click(
object
sender, System.EventArgs e)
...
{
ManagementObject service =
new
ManagementObject("win32_service="winmgmt"");
InvokeMethodOptions options =
new
InvokeMethodOptions();
options.Timeout =
new
TimeSpan(0,0,0,5);
ManagementBaseObject outParams = service.InvokeMethod("StopService",
null
, options);
Response.Write("Return Status = " + outParams["Returnvalue"]);
}
#endregion
10.如何用WMI 来获取远程机器的目录以及文件
#region
10.如何用WMI 来获取远程机器的目录以及文件
private
void
Button10_Click(
object
sender, System.EventArgs e)
...
{
ManagementObject disk =
new
ManagementObject(
"win32_logicaldisk.deviceid="c:"");
disk.Get();
Response.Write("Logical Disk Size = " + disk["Size"] + " bytes");
}
#endregion
11.网卡的MAC地址
#region
11.网卡的MAC地址
private
void
Button11_Click(
object
sender, System.EventArgs e)
...
{
ManagementClass mc =
new
ManagementClass("Win32_NetworkAdapterConfiguration");
ManagementObjectCollection moc = mc.GetInstances();
foreach
(ManagementObject mo
in
moc)
...
{
if
((
bool
)mo["IPEnabled"] ==
true
)
Response.Write("MAC address"+mo["MacAddress"].ToString()+"
");
mo.Dispose();
}
}
#endregion
12.CPU的系列号
#region
12.CPU的系列号
private
void
Button12_Click(
object
sender, System.EventArgs e)
...
{
string
cpuInfo = "";
//
cpu序列号
ManagementClass cimobject =
new
ManagementClass("Win32_Processor");
ManagementObjectCollection moc = cimobject.GetInstances();
foreach
(ManagementObject mo
in
moc)
...
{
cpuInfo = mo.Properties["ProcessorId"].Value.ToString();
Response.Write(cpuInfo);
}
}
#endregion
13.主板的系列号
#region
13.主板的系列号
private
void
Button13_Click(
object
sender, System.EventArgs e)
...
{
ManagementObjectSearcher searcher=
new
ManagementObjectSearcher("SELECT * FROM Win32_BaseBoard");
foreach
(ManagementObject share
in
searcher.Get())
...
{
Response.Write("主板制造商:" + share["Manufacturer"].ToString()) ;
Response.Write("型号:" +share["Product"].ToString()) ;
Response.Write("序列号:"+share["SerialNumber"].ToString()) ;
}
}
#endregion
14.获取硬盘ID
#region
14.获取硬盘ID
private
void
Button14_Click(
object
sender, System.EventArgs e)
...
{
String HDid;
ManagementClass cimobject =
new
ManagementClass("Win32_DiskDrive");
ManagementObjectCollection moc = cimobject.GetInstances();
foreach
(ManagementObject mo
in
moc)
...
{
HDid = (
string
)mo.Properties["Model"].Value;
Response.Write(HDid);
}
}
#endregion
15.获取本机的用户列表
#region
15.获取本机的用户列表
private
void
Button15_Click(
object
sender, System.EventArgs e)
...
{
SelectQuery query =
new
SelectQuery("SELECT * FROM Win32_UserAccount");
ManagementObjectSearcher searcher =
new
ManagementObjectSearcher(query);
foreach
(ManagementObject os
in
searcher.Get())
...
{
Response.Write(os["Name"]);
}
}
#endregion
}
通过上面介绍的方法,可以很轻松的获取远程或本地机器的性能,进程和硬件信息等。另外:WMI也可以通过使用Vbscript等脚本调用。
说明:其中部分资源来自网友小山的blog。但不够详细说明WMI在服务器性能方面的能力!
c# 服务器性能监控,C#服务器性能监控之WMI的代码示例详解相关推荐
- 视频监控系统网络时间同步(NTP网络授时)问题详解
视频监控系统网络时间同步(NTP网络授时)问题详解 视频监控系统网络时间同步(NTP网络授时)问题详解 本文由安徽京准公司提供,转载需授权@@ 视频监控系统是指综合应用视音频监控.通信.计算机网络等技 ...
- STM32 MQTT协议 连接中国移动OneNet服务器 上传接收数据(二)MQTT协议常用报文详解
STM32 MQTT协议 连接中国移动OneNet服务器 上传接收数据(二)MQTT协议常用报文详解 上一次我们讲了OneNet平台的注册,这次我们来讲一下MQTT的常用报文用法 上一篇地址https ...
- 性能百万/s:腾讯轻量级全局流控方案详解
作者:莫家文,腾讯事务型开发工程师 商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处. 原文链接:http://wetest.qq.com/lab/view/320.html WeTest ...
- 性能百万/s:腾讯轻量级全局流控方案详解【转自Wetest】
阿里用的方案是在nginx中配置限流(限流功能模块是自己开发的),流量统计线上是有监控打通的,具体的限流值是通过线上流量表现+线下性能测试(模拟线上场景)测试得出的. 全新的全局流控实现方案,既解决了 ...
- php 监控nginx日志,nginx启用status监控服务器状态的方法详解
nginx和php-fpm一样内建了一个状态页,对于想了解nginx的状态以及监控nginx非常有帮助. 在Nginx中的stub_status模块主要用于查看Nginx的一些状态信息.本模块默认是不 ...
- 服务器BIOS、BMC、IPMI、EFI、UEFI等知识详解
详解连接:服务器BIOS和BMC等知识详解_开源Linux-CSDN博客https://blog.csdn.net/weixin_38889300/article/details/106913495 ...
- 腾讯云GPU服务器NVIDIA P40 GPU、P4、T4和GPU自由卡详解
腾讯云GPU云服务器,GPU云服务器实例可选GN8机型.GN6S机型.GN7机型等规格,搭载 NVIDIA P40 GPU,最长可3年,云服务器吧来详细说下腾讯云GPU云服务器: 目录 腾讯云GPU云 ...
- 服务器文件共享不同用户互访设置,samba配置_samba文件共享服务配置详解
摘要 腾兴网为您分享:samba文件共享服务配置详解,之了课堂,央视影音,人人理财,平安证券等软件知识,以及游戏通用窗口化工具,福建省校讯通,净天之命1.71,teamviewer安卓,宝贝听听,手机 ...
- 暗黑3服务器维护能登录,暗黑3登陆错误原因及解决办法详解
暗黑3登陆错误原因及解决办法详解 2012-10-15 09:06:03来源:游戏下载编辑:评论(0) 暗黑3报错ERROR解决方法,全部暗黑3报错汇总,全部报错汇总解答.小编将玩家遇到的各种暗黑3安 ...
最新文章
- 技术总监需要会些什么?
- 机器学习笔记:线性规划,梯度下降
- python终端中退格键,方向键不能使用
- python实现冒泡排序算法的非递归版本_python排序算法速度比较:快速排序,归并排序,冒泡排序...
- 函数调用,统计数中'2’的个数
- EF 如何更新多对多关系的实体
- javascript 内存回收机制
- Java 串口 mysql_java串口通讯
- 浅析数字签名的工作原理 【小白级别的原创文章 仅供扫盲】
- iOS开发经验总结(一)
- ce标志cad_CAD自定义快捷键+常用符号
- Unity 获取GPS经纬度
- JMeter接口测试工具基础 — Badboy工具
- Linux学习基础一 【安装 目录 系统命令 常用vim操作】
- R语言使用mean函数计算dataframe指定数据列的均值
- Nebula 分布式图数据库介绍
- windows配置指定网段流量走虚拟专用网络
- 网吧游戏更新与保护解决方案
- 今日分享:自用的2款markdown在线编辑器推荐给你,快码住
- windows快速生成ssh key
热门文章
- jQuery load()方法特殊用法!
- 服务器开机提示修复,电脑开机提示自动修复怎么办?win10电脑开机提示自动修复教程...
- oracle+ddl+执行很慢,Oracle的DDL语句不能回滚(直接提交)
- mysql怎么查找列命令_MySQL查询命令-DQL
- java.lang.ClassNotFoundException: Cannot find class: com.mysql.jdbc.Driver解决办法
- python linux编程与window编程_Python3如何在Windows和Linux上打包
- 新疆计算机一级考试试题手机软件,新疆维吾尔自治区计算机一级考试理论题库(最新最完整)...
- hive简介以及安装配置
- [开源]基于姿态估计的运动计数APP开发(三)
- 如何在64位的Win10系统下安装.NET Framework 3.0