delphi枚举wmi

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,SiMath,SimEncrypt, StdCtrls,ActiveX,ComObj,JwaWbemCli;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo: TMemo;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure MemoKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
  private
    { Private declarations }
    procedure ShowProp(SProp: OleVariant);
  public
    { Public declarations }
  end;

const
  RPC_C_AUTHN_LEVEL_DEFAULT = 0;
  RPC_C_IMP_LEVEL_IMPERSONATE = 3;
  RPC_C_AUTHN_WINNT = 10;
  RPC_C_AUTHZ_NONE = 0;
  RPC_C_AUTHN_LEVEL_CALL = 3;
  EOAC_NONE = 0;

var
  Form1: TForm1;

implementation

function GetWMIProperty(WMIType, WMIProperty: string): string;
var
  Wmi, Objs, Obj: OleVariant;
  Enum: IEnumVariant;
  C: Cardinal;
  s:string;
begin
  Wmi:= CreateOleObject('WbemScripting.SWbemLocator');
  Objs := Wmi.ConnectServer('.','root\cimv2').ExecQuery('Select * from Win32_'+ WMIType);
  Enum:=IEnumVariant(IUnknown(Objs._NewEnum));
  Enum.Reset;
  while (Enum.Next(1,Obj,C)=s_ok) do
  begin    //需要更多的信息请使用循环
    Obj:=Obj.Properties_.Item(WMIProperty,0).Value;
    if VarIsArray(Obj) then
      s:=Obj[0]
    else
      s:=Obj;
    result:=result+','+s;
  end;
end;


{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
const 
  strLocale = '';
  strUser = '';
  strPassword = '';
  strNetworkResource = 'root\cimv2';
  strAuthority = '';
  WQL = 'SELECT * FROM Win32_Volume'; // SELECT * FROM MSNdis_80211_ReceivedSignalStrength Where active=true
var
  FWbemLocator : IWbemLocator;
  FWbemServices : IWbemServices;
  FUnsecuredApartment : IUnsecuredApartment;
  ppEnum : IEnumWbemClassObject;
  apObjects : IWbemClassObject;
  puReturned : ULONG;
  pVal : OleVariant;
  pType : Integer;
  plFlavor : Integer;
  Succeed : HRESULT;
begin 
  // Set general COM security levels
  if Failed(CoInitializeSecurity(nil, -1, nil, nil, RPC_C_AUTHN_LEVEL_DEFAULT, RPC_C_IMP_LEVEL_IMPERSONATE, nil, EOAC_NONE, nil)) then
    Exit;
  // Obtain the initial locator to WMI
  if Succeeded(CoCreateInstance(CLSID_WbemLocator, nil, CLSCTX_INPROC_SERVER, IID_IWbemLocator, FWbemLocator)) then
  try // Connect to WMI through the IWbemLocator::ConnectServer method
    if Succeeded(FWbemLocator.ConnectServer(strNetworkResource, strUser, strPassword, strLocale, WBEM_FLAG_CONNECT_USE_MAX_WAIT, strAuthority, nil, FWbemServices)) then
    try // Set security levels on the proxy
      if Failed(CoSetProxyBlanket(FWbemServices, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, nil, RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, nil, EOAC_NONE)) then
        Exit;
      if Succeeded(CoCreateInstance(CLSID_UnsecuredApartment, nil, CLSCTX_LOCAL_SERVER, IID_IUnsecuredApartment, FUnsecuredApartment)) then
      try // Use the IWbemServices pointer to make requests of WMI
        Succeed := FWbemServices.ExecQuery('WQL', WQL, WBEM_FLAG_FORWARD_ONLY, nil, ppEnum);
        if Succeeded(Succeed) then
        begin
          memo.lines.add('Running WMI query...'); // Get the data from the query
          while (ppEnum.Next(WBEM_INFINITE, 1, apObjects, puReturned)=0) do
          begin
            apObjects.Get('Caption', 0, pVal, pType, plFlavor);
            memo.lines.add('"' + AnsiToUTF8(pVal) + '"');
            VarClear(pVal);
          end;
        end else
          memo.lines.add(Format('Error executing WQL sentence %x',[Succeed]));
      finally
        FUnsecuredApartment := nil;
      end;
    finally
      FWbemServices := nil;
    end;
  finally
    FWbemLocator := nil;
  end;

end;

procedure TForm1.Button2Click(Sender: TObject);
const 
  WbemUser ='';
  WbemPassword ='';
  WbemComputer ='localhost';
  wbemFlagForwardOnly = $00000020;
var 
  FSWbemLocator : OLEVariant;
  FWMIService : OLEVariant;
  FWbemObjectSet: OLEVariant;
  classItems : OLEVariant;
  classItem : oleVariant;
  FWbemObject : Variant;
  classEnum : IEnumvariant;
  oEnum : IEnumvariant;
  sValue : string;
  c:Cardinal;
begin; 
  FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
  FWMIService := FSWbemLocator.ConnectServer(WbemComputer, 'root\CIMV2', WbemUser, WbemPassword);
  classItems := FWMIService.SubclassesOf();
  classEnum := IUnknown(classItems._NewEnum) As IEnumvariant;
  while classEnum.Next(1, classItem, c) = 0 do
  begin
    sValue := classItem.Path_.Class;
    memo.lines.add(Format('Class: %s', [sValue]));
    classItem := Unassigned;
  end;
  {FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_MemoryDevice','WQL',wbemFlagForwardOnly);
  oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
  while oEnum.Next(1, FWbemObject, nil) = 0 do
  begin 
  sValue := FWbemObject.Properties_.Item('Caption').Value;
  memo.lines.add(Format('Caption %s', [sValue]));
  // String FWbemObject := Unassigned;
  end;}
end;

procedure TForm1.ShowProp(SProp: OleVariant);
var
  StrValue: string;
  Count: Cardinal;
begin
  StrValue := '';
  if VarIsNull(SProp.Get_Value) then
    StrValue := '<empty>'
  else
    case SProp.CIMType of
    Cim_Uint8, Cim_Sint8, Cim_Uint16, Cim_Sint16, Cim_Uint32, Cim_Sint32, Cim_Sint64:
      if VarIsArray(SProp.Get_Value) then
      begin
        if VarArrayHighBound(SProp.Get_Value, 1) > 0 then
          for Count := 1 to VarArrayHighBound(SProp.Get_Value, 1) do
            StrValue := StrValue + ' ' + IntToStr(SProp.Get_Value[Count]);
      end else
      StrValue := IntToStr(SProp.Get_Value);
      Cim_Real32, Cim_Real64: StrValue := FloatToStr(SProp.Get_Value);
      Cim_STRING: StrValue := SProp.Get_Value;
    else memo.lines.add('Unknown type');
    end;
  memo.lines.Add(StrValue);
end;

procedure TForm1.MemoKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if (Key=ord('A')) and (ssctrl in Shift) then
  begin
    memo.SelectAll;
  end;
end;

end.

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

推荐阅读

  • 远程办公经验为0,如何将日常工作平滑过度到线上?

    我是一名创业者,我的公司(深圳市友浩达科技有限公司)在2018年8月8日开始运营,现在还属于微型公司。这个春节假期,我一直十分关注疫情动向,也非常关心其对公司带来的影响。

    TVP官方团队
    TAPD 敏捷项目管理腾讯乐享企业邮箱企业编程算法
  • 数据中台,概念炒作还是另有奇效? | TVP思享

    作者简介:史凯,花名凯哥,腾讯云最具价值专家TVP,ThoughtWorks数据智能业务总经理。投身于企业数字化转型工作近20年。2000年初,在IBM 研发企业级中间件,接着加入埃森哲,为大型企业提供信息化架构规划,设计,ERP,云平台,数据仓库构建等技术咨询实施服务,随后在EMC负责企业应用转型业务,为企业提供云迁移,应用现代化服务。现在专注于企业智能化转型领域,是数据驱动的数字化转型的行业布道者,数据中台的推广者,精益数据创新体系的创始人,2019年荣获全球Data IQ 100人的数据赋能者称号,创业邦卓越生态聚合赋能官TOP 5。2019年度数字化转型专家奖。打造了行业第一个数据创新的数字化转型卡牌和工作坊。创建了精益数据创新方法论体系构建数据驱动的智能企业,并在多个企业验证成功,正在向国内外推广。

    TVP官方团队
    大数据数据分析企业
  • 扩展 Kubernetes 之 CRI

    使用 cri-containerd 的调用流程更为简洁, 省去了上面的调用流程的 1,2 两步

    王磊-AI基础
    Kubernetes
  • 扩展 Kubernetes 之 Kubectl Plugin

    kubectl 功能非常强大, 常见的命令使用方式可以参考 kubectl --help,或者这篇文章

    王磊-AI基础
    Kubernetes
  • 多种登录方式定量性能测试方案

    最近接到到一个测试任务,某服务提供了两种登录方式:1、账号密码登录;2、手机号+验证码登录。要对这两种登录按照一定的比例进行压测。

    八音弦
    测试服务 WeTest
  • 线程安全类在性能测试中应用

    首先验证接口参数签名是否正确,然后加锁去判断订单信息和状态,处理用户增添VIP时间事务,成功之后释放锁。锁是针对用户和订单的分布式锁,使用方案是用的redis。

    八音弦
    安全编程算法
  • 使用CDN(jsdelivr) 优化博客访问速度

    PS: 此篇文章适用于 使用 Github pages 或者 coding pages 的朋友,其他博客也类似.

    IFONLY@CUIT
    CDNGitGitHub开源
  • 扩展 Kubernetes 之 CNI

    Network Configuration 是 CNI 输入参数中最重要当部分, 可以存储在磁盘上

    王磊-AI基础
    Kubernetes
  • 聚焦【技术应变力】云加社区沙龙online重磅上线!

    云加社区结合特殊时期热点,挑选备受关注的音视频流量暴增、线下业务快速转线上、紧急上线防疫IoT应用等话题,邀请众多业界专家,为大家提供连续十一天的干货分享。从视野、预判、应对等多角度,帮助大家全面提升「技术应变力」!

    腾小云
  • 京东购物小程序购物车性能优化实践

    它是小程序开发工具内置的一个可视化监控工具,能够在 OS 级别上实时记录系统资源的使用情况。

    WecTeam
    渲染JavaScripthttps网络安全缓存

扫码关注云+社区

领取腾讯云代金券