A要开发SNMP读取参数的模块
a. 首先安装SNMP 协议。
在xp系统里, 开始-->设置-->控制面板-->添加/删除WINDOWS组件-->管理监视工具 ,把里面的
两个协议全部安装
b. 安装Sqlserver(以下内容是摘抄其他网友的帖子,实在懒得写,不好意思)
b1.安装SNMP FOR SQL SERVER
如果你安装SQL SERVER的时候,已经安装了SNMP服务,那么SQL SERVER会自动安装SNMP的代
理扩展。如果在执行安装程序时没有在计算机上安装 SNMP,则不会启用 SQL Server 对 SNMP 的
支持。
对于安装SQL SERVER时候没有安装SNMP服务的,需要手工添加扩展代理方法如下,注意区分大小
写的匹配:
b12. 添加扩展代理注册信息
找到HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/SNMP/Parameter/
ExtensionAgents新增如下字符串值:格式为:名称、类型、数值
REG_SZ : SOFTWARE/Microsoft/Microsoft SQL Server/SNMP/CurrentVersion
b2. 安装SQL Server SNMP扩展代理程序 (Sqlsnmp.dll)
转到HKEY_LOCAL_MACHINE/SOFTWARE
创建主键:Microsoft/MSSQLServer/SNMP/CurrentVersion
新增字符串值:Pathname:REG_EXPAND_SZ(注意,我第一次安装的时候就是因为没注意这
个串值类型,导致没有安装成功。这个REG_EXPAND_SZ是“可扩充字符串值”)
:D:/Program Files/Microsoft SQL Server/MSSQL/BINN/sqlsnmp.dll
c.安装成功后,就可以使用SNMP了
首先需要知道SQL SERVER的MIB,这个MIB默认放在D:/Program Files/Microsoft
SQLServer/MSSQL/Binn/Mssql.mib
我使用GETIF浏览MIB,那么就把Mssql.mib文件复制到Getif 2.3.1/Mibs/下改名字为
mssql.txt。然后打开.index文件添加MSSQLSERVER-MIB mssql.txt到末尾保存。
备注:我按照b项做没有成功,调试了很久都不行,也许是我运气差?一气之下找了台电脑,先安装SNMP协议再安装SQLSERVER,呵呵就搞定了。
B 我的代码
取数据的函数,GetSnmpInfo 取一条数据, GetSnmpList取多条数据
view plaincopy to clipboardprint?
01.function TSelfCheck.GetSnmpInfo(OID, IP :String): String;
02.begin
03. result := '';
04. try
05. IdSNMP.Query.PDUType := PDUGetRequest;
06. IdSnmp.QuickSend(OID, 'public' ,IP ,Result);
07. except
08.
09. end;
10.end;
11.
12.function TSelfCheck.GetSnmpList(OID, IP :String): TStringList;
13.var
14. i: integer;
15.begin
16. Result := TStringList.Create;
17. try
18. IdSNMP.Query.Clear;
19. IdSNMP.Query.MIBAdd(OID,'');
20. IdSNMP.Query.PDUType := PDUGetNextRequest;
21. while IdSNMP.SendQuery do
22. begin
23. if Copy(IdSNMP.Reply.MIBOID[0], 1, Length(OID)) <> OID then Break;
24. for I := 0 to IdSNMP.Reply.ValueCount - 1 do
25. Result.Add(IdSNMP.Reply.Value[I]);
26. IdSNMP.Query.Clear;
27. IdSNMP.Query.MIBAdd(IdSNMP.Reply.ValueOID[0], '');
28. IdSNMP.Query.PDUType := PDUGetNextRequest;
29. end;
30. except
31.
32. end;
33.end;
function TSelfCheck.GetSnmpInfo(OID, IP :String): String;
begin
result := '';
try
IdSNMP.Query.PDUType := PDUGetRequest;
IdSnmp.QuickSend(OID, 'public' ,IP ,Result);
except
end;
end;
function TSelfCheck.GetSnmpList(OID, IP :String): TStringList;
var
i: integer;
begin
Result := TStringList.Create;
try
IdSNMP.Query.Clear;
IdSNMP.Query.MIBAdd(OID,'');
IdSNMP.Query.PDUType := PDUGetNextRequest;
while IdSNMP.SendQuery do
begin
if Copy(IdSNMP.Reply.MIBOID[0], 1, Length(OID)) <> OID then Break;
for I := 0 to IdSNMP.Reply.ValueCount - 1 do
Result.Add(IdSNMP.Reply.Value[I]);
IdSNMP.Query.Clear;
IdSNMP.Query.MIBAdd(IdSNMP.Reply.ValueOID[0], '');
IdSNMP.Query.PDUType := PDUGetNextRequest;
end;
except
end;
end;
c.定时器
我设定,每一分钟读取信息一次,然后把这些信息写到XML结构中去。
view plaincopy to clipboardprint?
01.procedure TSelfCheck.OnTimer(Sender: TObject);
02.var
03. i: integer;
04. p: pIP;
05. RootNode, Node: IXMLNode;
06.begin
07. try
08. timer.Enabled := false;
09.
10. if ipList.Count = 0 then Exit;
11. Xml.Active := true;
12. Xml.Version := '1.0';
13. Xml.Encoding := 'GB2312';
14. RootNode := Xml.AddChild('root');
15. RootNode.ChildValues['PcCount'] := ipList.Count;
16. for i := 0 to ipList.Count - 1 do
17. begin
18. p := ipList[i];
19. Node := RootNode.AddChild('PC'+ IntToStr(i));
20. SelfCheckDataEvent(p.ip, p.pcType, Node);
21. end;
22. NotifyPresent(Xml);
23. finally
24. Xml.XML.Clear;
25. Xml.Active := false;
26. timer.Enabled := true;
27.
28. end;
29.end;
30.
31.procedure TSelfCheck.AddIPList(ip: String; pcType: byte);
32.var
33. p: pIP;
34.begin
35. try
36. new(p);
37. p.ip := ip;
38. p.pcType := pcType;
39. ipList.Add(p);
40. except
41.
42. end;
43.end;
procedure TSelfCheck.OnTimer(Sender: TObject);
var
i: integer;
p: pIP;
RootNode, Node: IXMLNode;
begin
try
timer.Enabled := false;
if ipList.Count = 0 then Exit;
Xml.Active := true;
Xml.Version := '1.0';
Xml.Encoding := 'GB2312';
RootNode := Xml.AddChild('root');
RootNode.ChildValues['PcCount'] := ipList.Count;
for i := 0 to ipList.Count - 1 do
begin
p := ipList[i];
Node := RootNode.AddChild('PC'+ IntToStr(i));
SelfCheckDataEvent(p.ip, p.pcType, Node);
end;
NotifyPresent(Xml);
finally
Xml.XML.Clear;
Xml.Active := false;
timer.Enabled := true;
end;
end;
procedure TSelfCheck.AddIPList(ip: String; pcType: byte);
var
p: pIP;
begin
try
new(p);
p.ip := ip;
p.pcType := pcType;
ipList.Add(p);
except
end;
end;
ipList是一个TList的结构队列,其中的结构是p.ip是IP地址,p.pcType表示该pc是否装数据库。
在初始化时,使用AddIPList函数,增加所有查询的PC.
d. 读取系统参数以及Sqlserver的参数
d1.代码
view plaincopy to clipboardprint?
01.const
02. //系统
03. PCNameOID = '1.3.6.1.2.1.1.5.0';
04. MemorySizeOID = '1.3.6.1.2.1.25.2.2';
05. CpuUseOID = '1.3.6.1.2.1.25.3.3.1.2.2'; //CPU利利用率
06. DiskLeablOID = '1.3.6.1.2.1.25.2.3.1.3';
07. DiskBlockSizeOID = '1.3.6.1.2.1.25.2.3.1.4'; //各个分区的簇大小
08. DiskBlockCountOID = '1.3.6.1.2.1.25.2.3.1.5'; //各个分区的簇个数
09. DiskUseBlockCountOID = '1.3.6.1.2.1.25.2.3.1.6'; //各个分区的簇的已用个数
10.
11. //SqlServer
12. SqlServerTableOID = '1.3.6.1.4.1.311.1.4.1.1.1'; //基本信息
13. SqlServerNameOID = '1.3.6.1.4.1.311.1.4.1.1.2.1.1'; //服务器名称
14. SqlServerLastStartTimeOID = '1.3.6.1.4.1.311.1.4.1.1.2.1.2'; //最后一次启动时间
15. SqlServerInfoTableOID = '1.3.6.1.4.1.311.1.4.1.1.6'; //参数信息
16. SqlServerDbNameOID = '1.3.6.1.4.1.311.1.4.1.1.5.1.2'; //数据库名称
17.
18.
19.
20.procedure TSelfCheck.SelfCheckDataEvent(IP: String; pcType: Byte; var Node: IXMLNode);
21.var
22. St,
23. _St,
24. temSt,
25. LableSt,
26. DiskBlockSizeSt,
27. DiskBlockCountSt,
28. DiskUseBlockCountSt,
29. DiskSizeSt,
30. DiskUserSizeSt: TStringList;
31. d: Double;
32. i, j, m, Count: integer;
33. sTem: String;
34. SubNode: IXMLNode;
35.begin
36. try
37. Node.ChildValues['IP'] := IP; //写ip地址到XML结构中
38. Node.ChildValues['pcType'] := pcType; //写pc类型 0:监控终端 1: sqlserver
39.
40. sTem := GetSnmpInfo(PCNameOID, IP);
41. Node.ChildValues['PcName'] := sTem; //写电脑名称到XML
42.
43. sTem := GetSnmpInfo(CpuUseOID, IP);
44. Node.ChildValues['CpuUsePer'] := sTem ; //写CPU占用率到XML
45.
46. St := GetSnmpList(MemorySizeOID, IP);
47.
48. if St.Count <> 0 then
49. begin
50. d := StrToFloatDef(St[0], 0); //写内存大小到XML
51. d := d / 1000 /1000;
52. Node.ChildValues['MemorySize'] := trim(Format('%8.1f', [d])); //?
53. end;
54. FreeAndNil(St);
55.
56. LableSt := GetSnmpList(DiskLeablOID, IP); //取得分区盘符 如“c:/系统盘”
57. for i:= 0 to LableSt.Count - 1 do //去掉盘符的Label,只取一位如“c 、d”
58. LableSt[i] := Copy(LableSt[i], 0,1);
59.
60. DiskBlockSizeSt := GetSnmpList(DiskBlockSizeOID, IP); //每个分区blocks的大小
61. DiskBlockCountSt := GetSnmpList(DiskBlockCountOID, IP); //每个分区blocks的个数
62. DiskUseBlockCountSt := GetSnmpList(DiskUseBlockCountOID, IP); //每个分区已经用了个数
63.
64. DiskSizeSt := TStringList.Create;
65. DiskUserSizeSt := TStringList.Create;
66. for i := 0 to DiskBlockSizeSt.Count - 1 do
67. begin
68. if DiskBlockSizeSt[i] = '0' then Break;
69. for j := 0 to DiskBlockCountSt.Count - 1 do
70. begin
71. if DiskBlockCountSt[j] = '0' then Continue;
72. if i <> j then Continue;
73. DiskSizeSt.Add(floattostr(StrToFloat(DiskBlockSizeSt[i]) * StrToFloat(DiskBlockCountSt[j]))) ; //盘符的总字节数
74. DiskUserSizeSt.Add(floattostr(StrToFloat(DiskBlockSizeSt[i]) * StrToFloat(DiskUseBlockCountSt[j]))) ; //盘符的总字节数
75. end;
76. end;
77. SubNode := Node.AddChild('Disk');
78. for i := 0 to DiskSizeSt.Count - 1 do
79. begin
80. d := StrToFloat(DiskSizeSt[i]);
81. d := d / 1024 / 1024 / 1024;
82. SubNode.ChildValues[LableSt[i] + 'DiskSize'] := trim(Format('%8.1f', [d]));
83. end;
84.
85. for i := 0 to DiskUserSizeSt.Count - 1 do
86. begin
87. d := StrToFloat(DiskUserSizeSt[i]);
88. d := d / 1024 / 1024 / 1024;
89. SubNode.ChildValues[LableSt[i] + 'DiskUseSize'] := trim(Format('%8.1f', [d]));
90. end;
91.
92. FreeAndNIl(LableSt);
93. FreeAndNIl(DiskBlockSizeSt);
94. FreeAndNIl(DiskBlockCountSt);
95. FreeAndNIl(DiskUseBlockCountSt);
96. FreeAndNIl(DiskSizeSt);
97. FreeAndNIl(DiskUserSizeSt);
98.
99. if pcType = 1 then //该电脑是SQLSERVER
100. begin
101. SubNode := Node.AddChild('SqlServer');
102. St := GetSnmpList(SqlServerNameOID, IP);
103. SubNode.ChildValues['ServerName'] := St[0]; //取得服务器名称
104. FreeAndNIl(St);
105.
106. St := GetSnmpList(SqlServerTableOID, IP);
107.
108. if St.Count > 0 then
109. begin
110. SubNode.ChildValues['ServerVision'] := st[2]; //取SQLSERVER版本号
111. if st[4] = '1' then
112. SubNode.ChildValues['ServerStatus'] := 'Start'; //取服务器状态
113. if st[4] = '3' then
114. SubNode.ChildValues['ServerStatus'] := 'Stop';
115. if st[4] = '2' then
116. SubNode.ChildValues['ServerStatus'] := 'Pause';
117. end;
118. FreeAndNil(St);
119.
120. St := GetSnmpList(SqlServerLastStartTimeOID, IP); //取SQLSERVER最后一次启动时间
121. SubNode.ChildValues['ServerLastStartTime'] := St[0];
122. FreeAndNIl(St);
123.
124. St := GetSnmpList(SqlServerInfoTableOID, IP); //取所有数据库的参数表
125. _St := GetSnmpList(SqlServerDbNameOID, IP); //取所有数据库名
126. temSt := TStringList.Create;
127. for i := 0 to _St.Count - 1 do
128. begin
129. if (_St[i] = 'master') or (_St[i] = 'tempdb') or (_St[i] = 'model') or
130. (_St[i] = 'msdb') or (_St[i] = 'pubs') or (_St[i] = 'Northwind') then continue;
131. temSt.Add(IntToStr(i+1));
132. end; //过滤掉系统数据库,只留下我创建的数据库编号
133. Count := _St.Count; _St.Clear; _St.Assign(temSt);
134.
135. for i := 0 to count - 1 do St.Delete(0); //第一组数据只是编号,没用处删掉
136. for j := 0 to _St.Count - 1 do
137. begin
138. for i := 0 to St.Count - 1 do
139. begin
140. if i = 0 then Continue; //把0 过滤掉否则下面的语句不正确
141. if (i + 1) mod StrToInt(_St[j]) <> 0 then Continue; // 不能能被我创建的数据库编号整除则过滤
142. m := trunc(i / count); //取m就是取那一层的数据,用GETIF取数据后就知道我的意思了
143. case m of
144. 0: SubNode.ChildValues['DBName'] := St[i];
145. 1: SubNode.ChildValues['DBCreateTime'] := St[i];
146. 2: SubNode.ChildValues['DBInfoOwner'] := St[i];
147. 3: SubNode.ChildValues['DBInfoSize'] := St[i];
148. 4: SubNode.ChildValues['DBUnAlllocatedSpace'] := St[i]; //未分配空间
149. 5: SubNode.ChildValues['DBReservedSpace'] := St[i]; //保留空间
150. 6:;//SubNode.ChildValues['DBInfoDataSpace'] := St[i]; //使用的数据空间
151. 7:;//SubNode.ChildValues['DBInfoIndexSpace'] := St[i]; //使用的索引空间
152. 8:;//SubNode.ChildValues['DBInfoUnUsedSpace'] := St[i]; //未使用空间
153. 9:;// lastTrlogDump
154. 10:;//SubNode.ChildValues['DBInfoLogSize'] := St[i]; //日志大小
155. 11:;//SubNode.ChildValues['DBInfoLogSpaceUsed'] := St[i]; //已经使用的日志空间
156. end;
157.
158. end;
159. end;
160.
161.
162. end;
163.
164. except
165.
166. end;
167.end;
const
//系统
PCNameOID = '1.3.6.1.2.1.1.5.0';
MemorySizeOID = '1.3.6.1.2.1.25.2.2';
CpuUseOID = '1.3.6.1.2.1.25.3.3.1.2.2'; //CPU利利用率
DiskLeablOID = '1.3.6.1.2.1.25.2.3.1.3';
DiskBlockSizeOID = '1.3.6.1.2.1.25.2.3.1.4'; //各个分区的簇大小
DiskBlockCountOID = '1.3.6.1.2.1.25.2.3.1.5'; //各个分区的簇个数
DiskUseBlockCountOID = '1.3.6.1.2.1.25.2.3.1.6'; //各个分区的簇的已用个数
//SqlServer
SqlServerTableOID = '1.3.6.1.4.1.311.1.4.1.1.1'; //基本信息
SqlServerNameOID = '1.3.6.1.4.1.311.1.4.1.1.2.1.1'; //服务器名称
SqlServerLastStartTimeOID = '1.3.6.1.4.1.311.1.4.1.1.2.1.2'; //最后一次启动时间
SqlServerInfoTableOID = '1.3.6.1.4.1.311.1.4.1.1.6'; //参数信息
SqlServerDbNameOID = '1.3.6.1.4.1.311.1.4.1.1.5.1.2'; //数据库名称
procedure TSelfCheck.SelfCheckDataEvent(IP: String; pcType: Byte; var Node: IXMLNode);
var
St,
_St,
temSt,
LableSt,
DiskBlockSizeSt,
DiskBlockCountSt,
DiskUseBlockCountSt,
DiskSizeSt,
DiskUserSizeSt: TStringList;
d: Double;
i, j, m, Count: integer;
sTem: String;
SubNode: IXMLNode;
begin
try
Node.ChildValues['IP'] := IP; //写ip地址到XML结构中
Node.ChildValues['pcType'] := pcType; //写pc类型 0:监控终端 1: sqlserver
sTem := GetSnmpInfo(PCNameOID, IP);
Node.ChildValues['PcName'] := sTem; //写电脑名称到XML
sTem := GetSnmpInfo(CpuUseOID, IP);
Node.ChildValues['CpuUsePer'] := sTem ; //写CPU占用率到XML
St := GetSnmpList(MemorySizeOID, IP);
if St.Count <> 0 then
begin
d := StrToFloatDef(St[0], 0); //写内存大小到XML
d := d / 1000 /1000;
Node.ChildValues['MemorySize'] := trim(Format('%8.1f', [d])); //?
end;
FreeAndNil(St);
LableSt := GetSnmpList(DiskLeablOID, IP); //取得分区盘符 如“c:/系统盘”
for i:= 0 to LableSt.Count - 1 do //去掉盘符的Label,只取一位如“c 、d”
LableSt[i] := Copy(LableSt[i], 0,1);
DiskBlockSizeSt := GetSnmpList(DiskBlockSizeOID, IP); //每个分区blocks的大小
DiskBlockCountSt := GetSnmpList(DiskBlockCountOID, IP); //每个分区blocks的个数
DiskUseBlockCountSt := GetSnmpList(DiskUseBlockCountOID, IP); //每个分区已经用了个数
DiskSizeSt := TStringList.Create;
DiskUserSizeSt := TStringList.Create;
for i := 0 to DiskBlockSizeSt.Count - 1 do
begin
if DiskBlockSizeSt[i] = '0' then Break;
for j := 0 to DiskBlockCountSt.Count - 1 do
begin
if DiskBlockCountSt[j] = '0' then Continue;
if i <> j then Continue;
DiskSizeSt.Add(floattostr(StrToFloat(DiskBlockSizeSt[i]) * StrToFloat(DiskBlockCountSt[j]))) ; //盘符的总字节数
DiskUserSizeSt.Add(floattostr(StrToFloat(DiskBlockSizeSt[i]) * StrToFloat(DiskUseBlockCountSt[j]))) ; //盘符的总字节数
end;
end;
SubNode := Node.AddChild('Disk');
for i := 0 to DiskSizeSt.Count - 1 do
begin
d := StrToFloat(DiskSizeSt[i]);
d := d / 1024 / 1024 / 1024;
SubNode.ChildValues[LableSt[i] + 'DiskSize'] := trim(Format('%8.1f', [d]));
end;
for i := 0 to DiskUserSizeSt.Count - 1 do
begin
d := StrToFloat(DiskUserSizeSt[i]);
d := d / 1024 / 1024 / 1024;
SubNode.ChildValues[LableSt[i] + 'DiskUseSize'] := trim(Format('%8.1f', [d]));
end;
FreeAndNIl(LableSt);
FreeAndNIl(DiskBlockSizeSt);
FreeAndNIl(DiskBlockCountSt);
FreeAndNIl(DiskUseBlockCountSt);
FreeAndNIl(DiskSizeSt);
FreeAndNIl(DiskUserSizeSt);
if pcType = 1 then //该电脑是SQLSERVER
begin
SubNode := Node.AddChild('SqlServer');
St := GetSnmpList(SqlServerNameOID, IP);
SubNode.ChildValues['ServerName'] := St[0]; //取得服务器名称
FreeAndNIl(St);
St := GetSnmpList(SqlServerTableOID, IP);
if St.Count > 0 then
begin
SubNode.ChildValues['ServerVision'] := st[2]; //取SQLSERVER版本号
if st[4] = '1' then
SubNode.ChildValues['ServerStatus'] := 'Start'; //取服务器状态
if st[4] = '3' then
SubNode.ChildValues['ServerStatus'] := 'Stop';
if st[4] = '2' then
SubNode.ChildValues['ServerStatus'] := 'Pause';
end;
FreeAndNil(St);
St := GetSnmpList(SqlServerLastStartTimeOID, IP); //取SQLSERVER最后一次启动时间
SubNode.ChildValues['ServerLastStartTime'] := St[0];
FreeAndNIl(St);
St := GetSnmpList(SqlServerInfoTableOID, IP); //取所有数据库的参数表
_St := GetSnmpList(SqlServerDbNameOID, IP); //取所有数据库名
temSt := TStringList.Create;
for i := 0 to _St.Count - 1 do
begin
if (_St[i] = 'master') or (_St[i] = 'tempdb') or (_St[i] = 'model') or
(_St[i] = 'msdb') or (_St[i] = 'pubs') or (_St[i] = 'Northwind') then continue;
temSt.Add(IntToStr(i+1));
end; //过滤掉系统数据库,只留下我创建的数据库编号
Count := _St.Count; _St.Clear; _St.Assign(temSt);
for i := 0 to count - 1 do St.Delete(0); //第一组数据只是编号,没用处删掉
for j := 0 to _St.Count - 1 do
begin
for i := 0 to St.Count - 1 do
begin
if i = 0 then Continue; //把0 过滤掉否则下面的语句不正确
if (i + 1) mod StrToInt(_St[j]) <> 0 then Continue; // 不能能被我创建的数据库编号整除则过滤
m := trunc(i / count); //取m就是取那一层的数据,用GETIF取数据后就知道我的意思了
case m of
0: SubNode.ChildValues['DBName'] := St[i];
1: SubNode.ChildValues['DBCreateTime'] := St[i];
2: SubNode.ChildValues['DBInfoOwner'] := St[i];
3: SubNode.ChildValues['DBInfoSize'] := St[i];
4: SubNode.ChildValues['DBUnAlllocatedSpace'] := St[i]; //未分配空间
5: SubNode.ChildValues['DBReservedSpace'] := St[i]; //保留空间
6:;//SubNode.ChildValues['DBInfoDataSpace'] := St[i]; //使用的数据空间
7:;//SubNode.ChildValues['DBInfoIndexSpace'] := St[i]; //使用的索引空间
8:;//SubNode.ChildValues['DBInfoUnUsedSpace'] := St[i]; //未使用空间
9:;// lastTrlogDump
10:;//SubNode.ChildValues['DBInfoLogSize'] := St[i]; //日志大小
11:;//SubNode.ChildValues['DBInfoLogSpaceUsed'] := St[i]; //已经使用的日志空间
end;
end;
end;
end;
except
end;
end;
以上代码稍微有点复杂但只要明白了算法就很简单了下面讲述协议,以下是存储器类型
d21 存储器类型 1.3.6.1.2.1.25.2.1
hrStorageTypes :1.3.6.1.2.1.25.2.1
hrStorageOther 1.3.6.1.2.1.25.2.1.1
hrStorageRam 1.3.6.1.2.1.25.2.1.2
hrStorageVirtualMemory 1.3.6.1.2.1.25.2.1.3
hrStorageFixedDisk 1.3.6.1.2.1.25.2.1.4
hrStorageRemovableDisk 1.3.6.1.2.1.25.2.1.5
hrStorageFloppyDisk 1.3.6.1.2.1.25.2.1.6
hrStorageCompactDisc 1.3.6.1.2.1.25.2.1.7
hrStorageRamDisk 1.3.6.1.2.1.25.2.1.8
hrStorageRam 表示内存, hrStorageFixedDisk 表示硬盘, hrStorageVirtualMemory 表示虚拟内存, hrStorageCompactDisc 表示光盘 ,用工具软件查看1.3.6.1.2.1.25.2.1 ,就会得到上面的数据。
d22 区分各个磁盘/分区的类型 1.3.6.1.2.1.25.2.3.1.2
1.3.6.1.2.1.25.2.3.1.2.1 = hrStorageFixedDisk //硬盘
1.3.6.1.2.1.25.2.3.1.2.2 = hrStorageFixedDisk //硬盘
1.3.6.1.2.1.25.2.3.1.2.3 = hrStorageFixedDisk //硬盘
1.3.6.1.2.1.25.2.3.1.2.4 = hrStorageFixedDisk //硬盘
1.3.6.1.2.1.25.2.3.1.2.5 = hrStorageCompactDisc //光盘
1.3.6.1.2.1.25.2.3.1.2.6 = hrStorageCompactDisc //光盘
1.3.6.1.2.1.25.2.3.1.2.7 = hrStorageVirtualMemory//虚拟内存
1.3.6.1.2.1.25.2.3.1.2.8 = hrStorageRam //物理内存
通过以上描述可以知道你有几个硬盘、光盘等,那个区是什么类型的存储介质
d23 分区名称 1.3.6.1.2.1.25.2.3.1.3
1.3.6.1.2.1.25.2.3.1.3.1 = "C:/ Label: Serial Number dc26ea33" [Octets]
1.3.6.1.2.1.25.2.3.1.3.2 = "D:/ Label:test Serial Number 9629f314" [Octets]
1.3.6.1.2.1.25.2.3.1.3.3 = "E:/ Label:test_backup Serial Number 94389268" [Octets]
1.3.6.1.2.1.25.2.3.1.3.4 = "F:/ Label:others Serial Number 5c4002e8" [Octets]
1.3.6.1.2.1.25.2.3.1.3.5 = "G:/" [Octets]
1.3.6.1.2.1.25.2.3.1.3.6 = "H:/ Label:Oracle10g Serial Number b1c04dbe" [Octets]
1.3.6.1.2.1.25.2.3.1.3.7 = "Virtual Memory" [Octets]
1.3.6.1.2.1.25.2.3.1.3.8 = "Physical Memory" [Octets]
通过以上描述你可以知道具体的每个分区或者光盘、软盘、内存的名称或描述
d24 每个分区块的容量 1.3.6.1.2.1.25.2.3.1.4
1.3.6.1.2.1.25.2.3.1.4.1 = 512 [Integer]
1.3.6.1.2.1.25.2.3.1.4.2 = 4096 [Integer]
1.3.6.1.2.1.25.2.3.1.4.3 = 4096 [Integer]
1.3.6.1.2.1.25.2.3.1.4.4 = 4096 [Integer]
1.3.6.1.2.1.25.2.3.1.4.5 = 0 [Integer]
1.3.6.1.2.1.25.2.3.1.4.6 = 2048 [Integer]
1.3.6.1.2.1.25.2.3.1.4.7 = 65536 [Integer]
1.3.6.1.2.1.25.2.3.1.4.8 = 65536 [Integer]
从上面可以分析出 C盘有可能是FAT格式,它的块容量只有 512,其他区是4096
d25 各个分区有多少块个数 1.3.6.1.2.1.25.2.3.1.5
1.3.6.1.2.1.25.2.3.1.5.1 = 25157789 [Integer]
1.3.6.1.2.1.25.2.3.1.5.2 = 2815383 [Integer]
1.3.6.1.2.1.25.2.3.1.5.3 = 4096567 [Integer]
1.3.6.1.2.1.25.2.3.1.5.4 = 11006525 [Integer]
1.3.6.1.2.1.25.2.3.1.5.5 = 0 [Integer]
1.3.6.1.2.1.25.2.3.1.5.6 = 317298 [Integer]
1.3.6.1.2.1.25.2.3.1.5.7 = 63101 [Integer]
1.3.6.1.2.1.25.2.3.1.5.8 = 32754 [Integer]
d26 各个分区使用了多少块 1.3.6.1.2.1.25.2.3.1.6
1.3.6.1.2.1.25.2.3.1.6.1 = 7427924 [Integer]
1.3.6.1.2.1.25.2.3.1.6.2 = 861039 [Integer]
1.3.6.1.2.1.25.2.3.1.6.3 = 16820 [Integer]
1.3.6.1.2.1.25.2.3.1.6.4 = 5788717 [Integer]
1.3.6.1.2.1.25.2.3.1.6.5 = 0 [Integer]
1.3.6.1.2.1.25.2.3.1.6.6 = 317298 [Integer]
1.3.6.1.2.1.25.2.3.1.6.7 = 12172 [Integer]
1.3.6.1.2.1.25.2.3.1.6.8 = 13270 [Integer]
d27 各个分区分配失败的块 1.3.6.1.2.1.25.2.3.1.7
1.3.6.1.2.1.25.2.3.1.7.1 = 0 [Counter32]
1.3.6.1.2.1.25.2.3.1.7.2 = 0 [Counter32]
1.3.6.1.2.1.25.2.3.1.7.3 = 0 [Counter32]
1.3.6.1.2.1.25.2.3.1.7.4 = 0 [Counter32]
1.3.6.1.2.1.25.2.3.1.7.5 = 0 [Counter32]
1.3.6.1.2.1.25.2.3.1.7.6 = 0 [Counter32]
1.3.6.1.2.1.25.2.3.1.7.7 = 0 [Counter32]
1.3.6.1.2.1.25.2.3.1.7.8 = 0 [Counter32]
在这个例子中
可以看到的盘符是C: D: E: F:; 同时可以得到虚拟内存信息,物理内存的信息
C: 盘大小为512× 25157789= 12880787968bytes or 12GB
C: 盘以用空间512×7427924= 3803097088bytes or 3.54GB
C:盘使用率为3.54/12*100% = 29.5%
C: 盘空间分配错误512×0 = 0 bytes
硬盘总的大小为512*25157789 + 4096*2815383 + 4096*4096567+ 4096*11006525 = 80G
磁盘使用大小为512*7427924 + 4096*861039 + 4096*16820 + 4096*5788717 = 29G
整个硬盘的使用率 29/80 *100% = 36.2%
物理内存
Total RAM 65536*32754 = 2096256 KB, 2047.125M about 2G 这个数字和
1.3.6.1.2.1.25.2.2.0结果差不多
Used RAM 65536*13270 = 829M
内存使用率 829/2048 * 100% = 40.4%
看了这个例子,再看我的代码,是否觉得就明白了?
下面是我的用XML导出的结果
<?xml version="1.0" encoding="GB2312" ?>
- <root>
<PcCount>1</PcCount>
- <PC0>
<IP>192.168.2.225</IP>
<pcType>1</pcType>
<PcName>ZXB</PcName>
<CpuUsePer>9</CpuUsePer>
<MemorySize>2.1</MemorySize>
- <Disk>
<CDiskSize>24.4</CDiskSize>
<DDiskSize>73.4</DDiskSize>
<EDiskSize>122.5</EDiskSize>
<FDiskSize>77.8</FDiskSize>
<CDiskUseSize>10.4</CDiskUseSize>
<DDiskUseSize>13.3</DDiskUseSize>
<EDiskUseSize>46.8</EDiskUseSize>
<FDiskUseSize>0.7</FDiskUseSize>
</Disk>
- <SqlServer>
<ServerName>ZXB</ServerName>
<ServerVision>8.00.194</ServerVision>
<ServerStatus>Start</ServerStatus>
<ServerLastStartTime>2009-06-11 10:13:23.123</ServerLastStartTime>
<DBName>sfems</DBName>
<DBCreateTime>06 3 2009</DBCreateTime>
<DBInfoOwner>ZXB/Administrator</DBInfoOwner>
<DBInfoSize>26440</DBInfoSize>
<DBUnAlllocatedSpace>0</DBUnAlllocatedSpace>
<DBReservedSpace>27928</DBReservedSpace>
</SqlServer>
</PC0>
</root>
a. GetSnmpInfo 返回一条记录
b. GetSnmpList 返回多条记录
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/xjwy/archive/2009/06/11/4261347.aspx