请教c#带的接口用来获得计算机的cpu、内存、硬盘及网络等的使用情况

半路雨歌 2009-10-29 09:09:37
如题。
请教.net中获得CPU、内存、硬盘及网络的使用情况(包括CPU频率、利用率,内存的已经找到,硬盘总空间、剩余空间,网络带宽、网络利用率等基本信息)的接口及用法。

以及如何对进程进行监控 (比如数据库进程)获得它的CPU 内存使用情况。

最好有代码说明。

在MSDN中找了一个上午,都是英文看得有点头疼。没找出合适的来。

谢谢!
...全文
953 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
半路雨歌 2009-10-31
  • 打赏
  • 举报
回复
谢谢大家。都有一定的参考价值。基本实现功能了。
半路雨歌 2009-10-30
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 cstod 的回复:]
晕,有可用的属性,跟属性值为null是两码事

  foreach (ManagementObject mo in moc)
            {
                string a = mo["Speed"].ToString(); //mo["Speed"]为null了
//改成下面的形式不报异常(null当然显示会没有,但是没异常
string a=string.Concat(mo["Speed"]);
                Console.WriteLine(a.ToString()); //又在ToString,本来就是string,还To个屁啊,null异常了你才满意?
            }
[/Quote]

呵呵。为什么取不到值呢,难道WMI没实现这个?
CsToD 2009-10-30
  • 打赏
  • 举报
回复
晕,有可用的属性,跟属性值为null是两码事

foreach (ManagementObject mo in moc)
{
string a = mo["Speed"].ToString(); //mo["Speed"]为null了
//改成下面的形式不报异常(null当然显示会没有,但是没异常
string a=string.Concat(mo["Speed"]);
Console.WriteLine(a.ToString()); //又在ToString,本来就是string,还To个屁啊,null异常了你才满意?
}
半路雨歌 2009-10-30
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 cstod 的回复:]
ManagementClass mc = new ManagementClass("Win32_NetworkAdapter");
          foreach(PropertyData pd in mc.Properties)
{
Console.WriteLine(pd.Name);//这样就知道有哪些可用的属性了
}
[/Quote]
这样得到的属性里Speed,IPAdress等都是是存在的,但为什么这样取出Speed、IPAdress都会抛出空指针异常呢?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Management;
namespace WMINETTest
{
class Program
{
static void Main(string[] args)
{
getNetWorkFlow();
}

private static void getNetWorkFlow()
{

ManagementClass mc = new ManagementClass("Win32_NetworkAdapter");
//ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");

ManagementObjectCollection moc = mc.GetInstances();
//
foreach(PropertyData pd in mc.Properties)
{
Console.WriteLine(pd.Name);

}
foreach (ManagementObject mo in moc)
{
string a = mo["Speed"].ToString();
Console.WriteLine(a.ToString());
}
Console.ReadLine();
}

}

}
CsToD 2009-10-30
  • 打赏
  • 举报
回复
ManagementClass mc = new ManagementClass("Win32_NetworkAdapter");
foreach(PropertyData pd in mc.Properties)
{
Console.WriteLine(pd.Name);//这样就知道有哪些可用的属性了
}
半路雨歌 2009-10-30
  • 打赏
  • 举报
回复
谢谢大家的协助。
cpu、内存、硬盘信息都已经获取了 还有网络信息(网络流量,比如总发送,总接收,网络利用率等)
查过一些资料,通过
[DllImport("IpHlpApi.dll")]
extern static public uint GetIfTable(byte[] pIfTable, ref uint pdwSize, bool bOrder);来获取本机网络信息,只是实现比较复杂。
我想用ManagementClass来实现。

ManagementClass mc = new ManagementClass("Win32_NetworkAdapter");
ManagementObjectCollection moc = mc.GetInstances();
foreach (ManagementObject mo in moc)
{
string a = mo["Speed"].ToString();
Console.WriteLine(a.ToString());
}

提示mo["Speed"]空指针异常,是不是speed索引名称错了。
获取上述网络信息的索引名称都是哪些?
请大家指点下,谢谢。
半路雨歌 2009-10-29
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 findcaiyzh 的回复:]
CPU使用率,包括指定进程和整个系统。
有例子代码
Determine CPU usage of current process (C++ and C#)
http://www.philosophicalgeek.com/2009/01/03/determine-cpu-usage-of-current-process-c-and-c/
[/Quote]
谢谢findcaiyzh的回答。有一定的参考价值。硬盘的也基本解决了。内存与网络使用情况呢?有什么办法吗 ?
yuanhuiqiao 2009-10-29
  • 打赏
  • 举报
回复
WMI可以获取远程机器的硬件和软件信息,本机也可以。
LutzMark 2009-10-29
  • 打赏
  • 举报
回复
.net里有个wmi可以用来获取硬件信息
CsToD 2009-10-29
  • 打赏
  • 举报
回复
CPU使用率好像在PowerShell里有现成的
宝_爸 2009-10-29
  • 打赏
  • 举报
回复
看起来你应该使用PerformanceCounter
下面是一个例子,如何使用PerformanceCounter。
可以下载vs2005的源代码

http://www.geekpedia.com/tutorial211_Using-Performance-Counters-in-Csharp.html
宝_爸 2009-10-29
  • 打赏
  • 举报
回复
另外一种方法是使用PerformanceCounter 可以得到CPU和内存的使用情况

PerformanceCounter cpuCounter;
PerformanceCounter ramCounter;
cpuCounter = new PerformanceCounter();
cpuCounter.CategoryName = "Processor";
cpuCounter.CounterName = "% Processor Time";
cpuCounter.InstanceName = "_Total";
ramCounter = new PerformanceCounter("Memory", "Available MBytes");
public string getCurrentCpuUsage(){
cpuCounter.NextValue()+"%";
}

public string getAvailableRAM(){
ramCounter.NextValue()+"MB";
}
宝_爸 2009-10-29
  • 打赏
  • 举报
回复
CPU使用率,包括指定进程和整个系统。
有例子代码
Determine CPU usage of current process (C++ and C#)
http://www.philosophicalgeek.com/2009/01/03/determine-cpu-usage-of-current-process-c-and-c/
lerit 2009-10-29
  • 打赏
  • 举报
回复
你这问题也太多了吧,一个个问比较好
wuyq11 2009-10-29
  • 打赏
  • 举报
回复
ManagementObjectSearcher searcher=new ManagementObjectSearcher("select * from Win32_PerfFormattedData_PerfOS_Processor");
foreach (ManagementObject mo in searcher.Get())
{
Response.Write(mo.GetText(TextFormat.Mof));//显示内存情况
}
TimeSpan objTimeSpan = DateTime.Now - currentProcess.StartTime;
double cpuUseRatio = ((currentProcess.TotalProcessorTime.TotalSeconds / objTimeSpan.TotalSeconds) * 100.0) / double.Parse(Environment.GetEnvironmentVariable("NUMBER_OF_PROCESSORS"));
string s=cpuUseRatio.ToString("N2") + "%";
http://www.codeproject.com/KB/system/processescpuusage.aspx
bjtiantian 2009-10-29
  • 打赏
  • 举报
回复
网上找的,看看有用没
以下的代码的原作是opensource的一个叫sniffer.net的,用vb.net写的,这里只是简单的用c#翻译了一下,暂时还只能监控所有数据包,不能监控某一个进程的数据包,代码如下:
using System;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Runtime.InteropServices;

namespace UpdateTester
{
/**//// <summary>
/// Monitor 的摘要说明。
/// </summary>
public class Monitor
{
public delegate void NewPacketEventHandler(Monitor m, Packet p);
public event NewPacketEventHandler NewPacket;
private Socket m_Monitor;
private IPAddress m_Ip;
private byte[] m_Buffer = new byte[65535];
private const System.Int32 IOC_VENDOR = 0x18000000;
private const int IOC_IN = -2147483648;
private const int SIO_RCVALL = IOC_IN ^ IOC_VENDOR ^ 1;
private const int SECURITY_BUILTIN_DOMAIN_RID = 0x20;
private const int DOMAIN_ALIAS_RID_ADMINS = 0x220;

public System.Net.IPAddress IP
{
get { return m_Ip; }
}

public byte[] Buffer
{
get { return m_Buffer; }
}

public Monitor()
{
//
// TODO: 在此处添加构造函数逻辑
//
}

public Monitor(IPAddress IpAddress)
{
if (!(Environment.OSVersion.Platform == PlatformID.Win32NT) && Environment.OSVersion.Version.Major<5)
{
throw new NotSupportedException("This program requires Windows 2000, Windows XP or Windows .NET Server!");
}
m_Ip = IpAddress;
}

public void Start()
{
if (m_Monitor==null)
{
try
{
m_Monitor = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP);
m_Monitor.Bind(new IPEndPoint(IP, 0));
m_Monitor.IOControl(SIO_RCVALL, BitConverter.GetBytes(1), null);
m_Monitor.BeginReceive(m_Buffer, 0, m_Buffer.Length, SocketFlags.None, new AsyncCallback(OnReceive), null);
}
catch (Exception e)
{
m_Monitor = null;
throw new SocketException();
}
}
}

public void Stop()
{
if (m_Monitor!=null)
{
m_Monitor.Close();
}
m_Monitor = null;
}

public void OnReceive(System.IAsyncResult ar)
{
try
{
int received = m_Monitor.EndReceive(ar);

try
{
if (m_Monitor!=null)
{
byte[] pkt = new byte[received];
Array.Copy(Buffer, 0, pkt, 0, received);
OnNewPacket(new Packet(pkt, DateTime.Now));
}
}
catch(Exception e)
{
throw;
}

m_Monitor.BeginReceive(Buffer, 0, Buffer.Length, SocketFlags.None, new AsyncCallback(OnReceive), null);
}
catch (Exception e)
{

}
}

protected void OnNewPacket(Packet p)
{
NewPacket(this, p);
}
}
}


using System;
using System.Text;
using System.Net;
using System.Net.Sockets;

namespace UpdateTester
{

public enum Precedence
{
Routine = 0,
Priority = 1,
Immediate = 2,
Flash = 3,
FlashOverride = 4,
CRITICECP = 5,
InternetworkControl = 6,
NetworkControl = 7
}

public enum Delay
{
NormalDelay = 0,
LowDelay = 1
}

public enum Throughput
{
NormalThroughput = 0,
HighThroughput = 1
}

public enum Reliability
{
NormalReliability = 0,
HighReliability = 1
}

public enum Protocol
{
Ggp = 3,
Icmp = 1,
Idp = 22,
Igmp = 2,
IP = 4,
ND = 77,
Pup = 12,
Tcp = 6,
Udp = 17,
Other = -1
}
/**//// <summary>
/// Packet 的摘要说明。
/// </summary>
public class Packet
{

private byte[] m_Raw;
private DateTime m_Time;
private int m_Version;
private int m_HeaderLength;
private Precedence m_Precedence;
private Delay m_Delay;
private Throughput m_Throughput;
private Reliability m_Reliability;
private int m_TotalLength;
private int m_Identification;
private int m_TimeToLive;
private Protocol m_Protocol;
private byte[] m_Checksum;
private string m_SourceAddress;
private string m_DestinationAddress;
private int m_SourcePort;
private int m_DestinationPort;

public Packet()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
//
// public Packet(byte[] raw):(byte[] raw, DateTime time)
// {
// Packet(raw, DateTime.Now);
// }

public Packet(byte[] raw, DateTime time)
{
if (raw==null)
{
throw new ArgumentNullException();
}
if (raw.Length<20)
{
throw new ArgumentException();
}

this.m_Raw = raw;
this.m_Time = time;
this.m_HeaderLength = (raw[0] & 0xF) * 4;
if ((raw[0] & 0xF) < 5) {throw new ArgumentException();}
this.m_Precedence = (Precedence)((raw[1] & 0xE0) >> 5);
this.m_Delay = (Delay)((raw[1] & 0x10) >> 4);
this.m_Throughput = (Throughput)((raw[1] & 0x8) >> 3);
this.m_Reliability = (Reliability)((raw[1] & 0x4) >> 2);
this.m_TotalLength = raw[2] * 256 + raw[3];
if ( ! (this.m_TotalLength == raw.Length)) { throw new ArgumentException();} // invalid size of packet;
this.m_Identification = raw[4] * 256 + raw[5];
this.m_TimeToLive = raw[8];

m_Protocol = (Protocol)raw[9];

m_Checksum = new byte[2];
m_Checksum[0] = raw[11];
m_Checksum[1] = raw[10];

try
{
m_SourceAddress = GetIPAddress(raw, 12);
m_DestinationAddress = GetIPAddress(raw, 16);
}
catch (Exception e)
{
throw;
}

if (m_Protocol == Protocol.Tcp || m_Protocol == Protocol.Udp)
{
m_SourcePort = raw[m_HeaderLength] * 256 + raw[m_HeaderLength + 1];
m_DestinationPort = raw[m_HeaderLength + 2] * 256 + raw[m_HeaderLength + 3];
}
else
{

m_SourcePort = -1;
m_DestinationPort = -1;
}
}

public string GetIPAddress(byte[] bArray, int nStart)
{
byte[] tmp = new byte[4];

if (bArray.Length > nStart + 2)
{
tmp[0] = bArray[nStart];
tmp[1] = bArray[nStart + 1];
tmp[2] = bArray[nStart + 2];
tmp[3] = bArray[nStart + 3];
}

return tmp[0] + "." + tmp[1] + "." + tmp[2] + "." + tmp[3];
}

public int TotalLength
{
get { return m_TotalLength; }
}

public DateTime Time
{
get { return this.m_Time; }
}

public Protocol Protocol
{
get { return this.m_Protocol; }
}

public string SourceAddress
{
get { return this.m_SourceAddress; }
}

public string Source
{
get
{
if ( m_SourcePort != -1 )
{
return SourceAddress.ToString() + ":" + m_SourcePort.ToString();
}
else
{
return SourceAddress.ToString();
}
}
}

public string Destination
{
get
{
if (this.m_DestinationPort != -1)
{
return DestinationAddress.ToString() + ":" + m_DestinationPort.ToString();
}
else
{
return DestinationAddress.ToString();
}
}
}

public string DestinationAddress
{

get
{
return m_DestinationAddress;
}
}
}
}



在主程序里
private Monitor[] m_PacketMonitors;
private ArrayList m_Packets;
private System.Windows.Forms.StatusBar statusBar1;
private int m_PacketsSize;

执行方法中
private void StartMonitor()
{
IPAddress[] hosts = Dns.Resolve(Dns.GetHostName()).AddressList;

if (hosts.Length == 0) { throw new NotSupportedException("This computer does not have non-loopback interfaces installed!");}
for (int i=0; i<hosts.Length; i++)
{
}

m_PacketMonitors = new Monitor[1];
m_Packets = new ArrayList();
m_PacketMonitors[0] = new Monitor(hosts[0]);

// 添加代理,每次有新的packet到时都出发下面哪个动作
m_PacketMonitors[0].NewPacket+=new Monitor.NewPacketEventHandler(this.OnNewPacket);
m_PacketMonitors[0].Start();
}

// 这个方法用于把packet显示到一个地方

private void OnNewPacket(Monitor m, Packet p)
{
m_Packets.Add(p);
m_PacketsSize += p.TotalLength;
try
{
txtLog.Text += p.Time.ToString()+p.Protocol.ToString()+p.Source.ToString()+p.Destination.ToString()+p.TotalLength.ToString();

}
catch (Exception e)
{
MessageBox.Show(e.Message);
}

statusBar1.Text = String.Format("Intercepted {0} packet(s) [{1} bytes]", m_Packets.Count, m_PacketsSize);
}
半路雨歌 2009-10-29
  • 打赏
  • 举报
回复
CPU、内存、硬盘的基本都解决了,就差网络利用率不知道怎么得到。继续等待+期待!
heartbeast 2009-10-29
  • 打赏
  • 举报
回复
同问。
如果想知道当前整个的CPU使用情况,又该如何?
ruanwei1987 2009-10-29
  • 打赏
  • 举报
回复
deying ding
Java_And_NET 2009-10-29
  • 打赏
  • 举报
回复
ding
加载更多回复(1)

110,545

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧