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

    技术2026-04-10  1

    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  返回多条记录

     

    本文来自博客,转载请标明出处:http://blog.csdn.net/xjwy/archive/2009/06/11/4261347.aspx

    最新回复(0)