delphi snmp 读取系统参数、SQLSERVER参数

来源:互联网 发布:有网络主播公司吗 编辑:程序博客网 时间:2024/05/03 01:25

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