<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=81627&amp;view=findpost&amp;p=597261</guid>
        <pubDate>Tue, 01 Feb 2005 05:47:35 +0000</pubDate>
        <title>WMI - практика применения в Delphi</title>
        <link>https://forum.sources.ru/index.php?showtopic=81627&amp;view=findpost&amp;p=597261</link>
        <description><![CDATA[Song: [doHTML]&lt;FONT Class=&quot;Header&quot;&gt;WMI - практика применения в Delphi &lt;/FONT&gt;&lt;HR SIZE=&quot;1&quot;&gt;&lt;P ALIGN=&quot;right&quot;&gt;<br>
	&lt;A TITLE=&quot;Все публикации автора&quot;  HREF=&quot;http://www.delphikingdom.ru/asp/writer.asp?CatalogID=698&quot;&gt;Алексей Павлов&lt;/A&gt;&lt;BR&gt;дата публикации &lt;FONT CLASS=Brown&gt;24-10-2002&nbsp;15:11&lt;/FONT&gt;&lt;/P&gt;<br>
&lt;A NAME=&quot;top&quot;&gt;&lt;/A&gt;<br>
&lt;STRONG&gt;Содержание:&lt;/STRONG&gt;<br>
<br>
&lt;TABLE	   WIDTH=&quot;100%&quot;&gt;<br>
&lt;TR&gt;<br>
	&lt;TD&gt;&lt;OL&gt;<br>
	&lt;LI&gt;Предисловие.&lt;/LI&gt;<br>
	&lt;LI&gt;&lt;A HREF=&quot;#02&quot;&gt;Введение.&lt;/A&gt;&lt;/LI&gt;<br>
	&lt;LI&gt;&lt;A HREF=&quot;#03&quot;&gt;Теория.&lt;/A&gt;&lt;/LI&gt;<br>
	&lt;LI&gt;&lt;A HREF=&quot;#04&quot;&gt;Практика.&lt;/A&gt;&lt;/LI&gt;<br>
	&lt;OL&gt;<br>
	&lt;LI&gt;Подготовка.&lt;/LI&gt;<br>
	&lt;LI&gt;Порядок действий.&lt;/LI&gt;<br>
	&lt;/OL&gt;&lt;/OL&gt;&lt;/TD&gt;<br>
	&lt;TD&gt;&lt;OL START=&quot;5&quot;&gt;	&lt;LI&gt;Примеры.&lt;/LI&gt;<br>
	&lt;OL&gt;<br>
	&lt;LI&gt;&lt;A HREF=&quot;#051&quot;&gt;Получение данных о центральном процессоре.&lt;/A&gt;&lt;/LI&gt;<br>
	&lt;LI&gt;&lt;A HREF=&quot;#052&quot;&gt;Получение данных о запущенных процессах.&lt;/A&gt;&lt;/LI&gt;<br>
	&lt;LI&gt;&lt;A HREF=&quot;#053&quot;&gt;Запуск приложений и выключение компьютера.&lt;/A&gt;&lt;/LI&gt;<br>
	&lt;LI&gt;&lt;A HREF=&quot;#054&quot;&gt;Получения значений c температурных сенсоров и с установленных вентиляторов.&lt;/A&gt;&lt;/LI&gt;<br>
	&lt;/OL&gt;<br>
	&lt;LI&gt;&lt;A HREF=&quot;#06&quot;&gt;Послесловие.&lt;/A&gt;&lt;/LI&gt;<br>
	&lt;LI&gt;&lt;A HREF=&quot;#07&quot;&gt;Список использованной литературы.&lt;/A&gt;&lt;/LI&gt;<br>
&lt;/OL&gt;&lt;/TD&gt;<br>
&lt;/TR&gt;<br>
&lt;/TABLE&gt;<br>
<br>
<br>
<br>
&lt;H3&gt;&lt;FONT COLOR=&quot;#996600&quot;&gt;1. Предисловие.&lt;/FONT&gt;&lt;/H3&gt;<br>
Приветствую всех любителей Delphi&#33; В этой статье я хочу поведать вам об одной из замечательных, с моей точки зрения, технологии, разработанной Microsoft для облегчения нашей жизни. Теперь любой программист, используя любой современный язык программирования (не исключая и скрип языков&#33;) может с лёгкостью узнать о своём компьютере практически всё. Теперь программисты всех &quot;вероисповеданий&quot; могут определить, какое оборудование установлено на их компьютере, узнать информацию о материнской плате и процессоре, параметры БИОСа, какие процессы запущены в данный момент, какова температура процессора и скорость вращения кулера, какие настройки графической системы,  какие.… Одним словом,  все о чём вы так долго мечтали, стало доступно благодаря WMI. Звучит заманчиво, не так ли? ;)<br>
&lt;P&gt;    Естественно, что WMI - это не только набор параметров. А что это такое - читайте ниже.<br>
&lt;/P&gt;<br>
&lt;A NAME=&quot;02&quot;&gt;&lt;/A&gt;<br>
&lt;H3&gt;&lt;FONT COLOR=&quot;#996600&quot;&gt;2. Введение.&lt;/FONT&gt;&lt;/H3&gt;<br>
Для того,  чтобы не лишиться большей части потенциальных читателей на начальном этапе, скажу сразу, что применение Windows Management Instrumentation (WMI) я буду рассматривать в основном с практической точки зрения (т.е. теории в этой статье будет немного). Сразу хочу оговориться, что т.к. я собираюсь осветить вопрос практического использования технологии WMI в Delphi и намериваюсь достигнуть этой цели достаточно быстро, то я не стану разжёвывать все, с чем нам придётся сталкиваться по ходу повествования и ограничусь минимумом теории. Так что материал изначально ориентирован на тех читателей, кто уверено чувствует себя в области применения интерфейсов, технологии COM и кто умеет работать с литературой.<br>
&lt;P&gt;Так же, я не стану излагать всю теорию, непосредственно связанную с технологией WMI, т.к. во-первых, это достаточно утомительно, а во-вторых, это уже сделано в лучшем виде, и заниматься перепечатыванием не имеет смысла. Итак, дальнейшее прочтение статьи и использование прилагаемых к ней примеров возможно и без понимания самой сути WMI, но, согласитесь, смысла в этом чуть. Так что очень рекомендую прочитать следующее:&lt;/P&gt;<br>
&lt;UL&gt;<br>
	&lt;LI&gt;&lt;A HREF=&quot;http://www.citforum.ru/operating_systems/articles/wmiin.shtml&quot;&gt;&quot;Внутри Windows Management Interface&quot;&lt;/A&gt;.&lt;/LI&gt;<br>
	&lt;LI&gt;&lt;A HREF=&quot;http://www.osp.ru/win2000/2001/05/070.htm&quot;&gt;&quot;Сценарии WMI для начинающих&quot;&lt;/A&gt;&lt;/LI&gt;<br>
&lt;/UL&gt;<br>
&lt;P&gt;&lt;EM&gt;&lt;BLOCKQUOTE&gt;&lt;B&gt;Примечание:&lt;/B&gt;&lt;BR&gt;<br>
: авторы статьи &quot;Внутри Windows Management Interface&quot; интерпретируют аббревиатуру WMI как Windows Management Interface, хотя сами создатели (фирма Microsoft) придерживаются следующей трактовки: Windows Management Instrumentation, что в общем говоря правильнее. Но и интерпретация буквы &quot;I&quot;, как &quot;Interface&quot;, а  не как &quot; Instrumentation &quot; вполне понятна и простительна, т.к. многие разработчики рассматривают WMI не иначе как набор интерфейсов, позволяющих получать доступ к определённым компонентам системы. <br>
&lt;/BLOCKQUOTE&gt;&lt;/EM&gt;&lt;/P&gt;<br>
Надеюсь, что предложенные мной к прочтению статьи были прочитаны и &lt;STRONG&gt;поняты&lt;/STRONG&gt;, т.к. дальнейшие повествование подразумевает собой понимание структуры WMI и назначения всех её составляющих. Все даваемые мной ниже пояснения всего лишь дополнение к общей теории, а даваемые определения - дополнения к тем, что были даны в вышеупомянутых статьях (или же умышленно утрированные для акцентирования внимания на наиболее важных для понимания моментах). Если же вы прочли вышеперечисленные статьи и всё чётко поняли, то вас не запутают и не введут в заблуждение мои, не претендующие на непогрешимость и полноту, определения  :)<br>
&lt;BR&gt; Итак, начали.<br>
&lt;DIV ALIGN=&quot;LEFT&quot;&gt;&lt;A HREF=&quot;#top&quot;&gt;&lt;FONT SIZE=&quot;-2&quot; COLOR=&quot;#999999&quot;&gt;<br>
&#091; К содержанию &#093;&lt;/FONT&gt;&lt;/A&gt;&lt;/DIV&gt;<br>
&lt;A NAME=&quot;03&quot;&gt;&lt;/A&gt;<br>
&lt;H3&gt;&lt;FONT COLOR=&quot;#996600&quot;&gt; 3. Теория.&lt;/FONT&gt;&lt;/H3&gt;<br>
&lt;IMG SRC=&quot;http://www.delphikingdom.ru/images/wmi1.gif&quot; WIDTH=&quot;382&quot; HEIGHT=&quot;291&quot; HSPACE=&quot;10&quot; VSPACE=&quot;10&quot; BORDER=&quot;0&quot; ALIGN=&quot;RIGHT&quot; ALT=&quot;&quot;&gt;<br>
&lt;STRONG&gt;Windows Management Instrumentation (WMI)&lt;/STRONG&gt; - технология, входящая в состав ядра Windows 2000 и предоставляющая доступ с помощью интерфейсов к объектам системы. <br>
&lt;P&gt;Представлю несколько упрощённую архитектуру WMI в том виде, в котором она нас будет интересовать в нашем конкретном случае. Быстро пробежимся по всем её компонентам.                       &lt;/P&gt;<br>
&lt;DL&gt;<br>
	&lt;DT&gt;&lt;STRONG&gt;Объекты Win32&lt;/STRONG&gt;&lt;DD&gt; - с этим элементом ассоциированы компоненты Win32, к данным которых мы желаем получить доступ<br>
	&lt;DT&gt;&lt;STRONG&gt;Провайдер Win32 &lt;/STRONG&gt;&lt;DD&gt;- представители объектов Win32, т.е. провайдер осуществляет связь между &quot;внешним миром&quot; и компонентами системы. Нас провайдеры будут интересовать как COM (DCOM) серверы, которые могут быть реализованы как внутренние (в виде DLL), так и внешние (в виде самостоятельных приложений).<br>
	&lt;DT&gt;&lt;STRONG&gt;CIM Object Manager &lt;/STRONG&gt;&lt;DD&gt;- попросту говоря, это служба координации данных передаваемых в обоих направлениях (будь то запрос от управляющей программы к провайдеру или данные предоставляемые провайдером приложению).		<br>
	&lt;DT&gt;&lt;STRONG&gt;Классы CIM &lt;/STRONG&gt;&lt;DD&gt;- вернее база данных, содержащая классы, которые есть не что иное, как шаблоны управляемых элементов, т.е. каждый класс описывает какой-то элемент и содержит свойства и методы для работы с этим элементом.<br>
	&lt;DT&gt;&lt;STRONG&gt;Windows Management API &lt;/STRONG&gt;&lt;DD&gt;- интерфейс прикладного программирования, по средствам которого управляющие приложения обращаются к объектам, а провайдеры поставляют данные и определения класса.<br>
&lt;/DL&gt;<br>
Наша программа является в данном случае не чем иным как контроллером, работающим с помощью Windows Management API с провайдерами (серверами).<br>
&lt;P&gt;На этом я закончу теоретическое вступление и перейду к практической части.<br>
&lt;/P&gt;	  								 <br>
&lt;DIV ALIGN=&quot;LEFT&quot;&gt;&lt;A HREF=&quot;#top&quot;&gt;&lt;FONT SIZE=&quot;-2&quot; COLOR=&quot;#999999&quot;&gt;<br>
&#091; К содержанию &#093;&lt;/FONT&gt;&lt;/A&gt;&lt;/DIV&gt;<br>
&lt;A NAME=&quot;04&quot;&gt;&lt;/A&gt;<br>
&lt;H3&gt;&lt;FONT COLOR=&quot;#996600&quot;&gt;4. Практика.&lt;/FONT&gt;&lt;/H3&gt;												   <br>
&lt;P&gt;&lt;TABLE WIDTH=&quot;100%&quot; BGCOLOR=&quot;#FAEBD7&quot; CELLPADDING=&quot;3&quot; CELLSPACING=&quot;0&quot; BORDER=&quot;0&quot;&gt;<br>
&lt;TD ALIGN=CENTER&gt;&lt;FONT COLOR=&quot;#996600&quot;&gt;&lt;B&gt;<br>
Подготовка.&lt;/B&gt;&lt;/FONT&gt;&lt;/TD&gt;&lt;/TABLE&gt;&lt;/P&gt;										<br>
    Итак, начнём с того, что нам необходимо сделать перед тем, как непосредственно начать использовать мощь технологии WMI в своих программах:<br>
&lt;UL&gt;<br>
	&lt;LI&gt;установить систему Windows 2000 или NT 4.0 SP4 и выше;&lt;/LI&gt;<br>
	&lt;LI&gt;установить Microsoft Internet Explorer (IE) 5.0 и выше;&lt;/LI&gt;<br>
	&lt;LI&gt;установить WMI SDK;&lt;/LI&gt;<br>
&lt;/UL&gt;<br>
<br>
После того, как вы установили WMI SDK, импортируйте следующие библиотеки типов:<br>
&lt;UL&gt;<br>
	&lt;LI&gt;Active DS Type Library (Version 1.0)&lt;/LI&gt;<br>
	&lt;LI&gt;Microsoft WMI Scripting v1.1 Library (Version 1.1)&lt;/LI&gt;<br>
&lt;/UL&gt;<br>
<br>
Отлично, теперь в палитре компонентов у вас появились новые элементы, которые мы и будем в дальнейшем использовать.<br>
<br>
&lt;P&gt;&lt;TABLE WIDTH=&quot;100%&quot; BGCOLOR=&quot;#FAEBD7&quot; CELLPADDING=&quot;3&quot; CELLSPACING=&quot;0&quot; BORDER=&quot;0&quot;&gt;<br>
&lt;TD ALIGN=CENTER&gt;&lt;FONT COLOR=&quot;#996600&quot;&gt;&lt;B&gt;<br>
Порядок действий.&lt;/B&gt;&lt;/FONT&gt;&lt;/TD&gt;&lt;/TABLE&gt;&lt;/P&gt;<br>
&lt;OL&gt;<br>
	&lt;LI&gt;Первым делом нам необходимо подсоединиться к интересующему нас пространству имён. Для данной цели используется интерфейс &lt;EM&gt;IWbemLocator&lt;/EM&gt; и его единственный метод  ConnectServer, который позволит нашей программе (в данном случае наша программа является WMI клиентом) получить указатель на интерфейс IWbemServices, который связан с выбранным нами пространством имён на выбранном нами компьютере (не стоит забывать, что технология WMI основана на COM/DCOM, что позволяет использовать её удалённо). Методы объектов типа SWbemServices предназначены для произведения операций в выбранном пространстве имён.<br>
	&lt;BR&gt;Да, надеюсь, вы знаете, где можно посмотреть имя интересующего вас пространства имён и WMI класса, если нет, то перечитываем предложенные к прочтению статьи или открываем WMI SDK и просматриваем раздел Win32 Classes.<br>
	&lt;LI&gt;После того, как мы подсоединились к выбранному нами пространству имён и получили указатель на объект, связанный с данным пространством имён, нам необходимо получить описание интересующего нас класса в выбранном нами пространстве имён (возможно, звучит мудрёно, но на практике всё гораздо проще, в чём вы скоро сами убедитесь). Для этого воспользуемся методом Get объекта &lt;EM&gt;SWbemServices&lt;/EM&gt;, который вернёт описание (definition) указанного нами класса (на этом этапе вы уже можете считать имена свойств класса и названия поддерживаемых им методов, естественно, все свойства будут содержать null; так же вы можете создать свой класс на базе полученного описания и дополнить его своими свойствами и методами). Таким образом, мы получим указатель на объект типа &lt;EM&gt;SWbemObject&lt;/EM&gt;.<br>
	&lt;LI&gt;Затем нам необходимо получить непосредственно экземпляр (instance) класса, описание которого мы получили. Для этого воспользуемся методом Instances_ объекта &lt;EM&gt;SWbemObject&lt;/EM&gt;, который создаст объект, осуществляющий нумерацию всех экземпляров (instances) данного класса типа &lt;EM&gt;SWbemObjectSet&lt;/EM&gt;. Говоря по-русски, будет создана коллекция всех объектов данного класса. Полученный объект &lt;EM&gt;SWbemObjectSet&lt;/EM&gt; будет содержать объекты &lt;EM&gt;SWbemObject&lt;/EM&gt;.<br>
	&lt;LI&gt;Вот собственно и всё. Получив из объекта &lt;EM&gt;SWbemObjectSet&lt;/EM&gt; экземпляр класса, нам остаётся считать его свойства и воспользоваться его методами. <br>
&lt;/OL&gt;	  <br>
Теперь перейдём к рассмотрению самих примеров. Вашему вниманию будут предложены четыре примера, полные исходные тексты и рабочие exe-файлы которых вы найдёте в прилагаемом к статье архиве.<br>
&lt;DIV ALIGN=&quot;LEFT&quot;&gt;&lt;A HREF=&quot;#top&quot;&gt;&lt;FONT SIZE=&quot;-2&quot; COLOR=&quot;#999999&quot;&gt;<br>
&#091; К содержанию &#093;&lt;/FONT&gt;&lt;/A&gt;&lt;/DIV&gt;<br>
&lt;A NAME=&quot;051&quot;&gt;&lt;/A&gt;<br>
&lt;H3&gt;&lt;FONT COLOR=&quot;#996600&quot;&gt;5. Примеры.&lt;/FONT&gt;&lt;/H3&gt;<br>
&lt;P&gt;&lt;TABLE WIDTH=&quot;100%&quot; BGCOLOR=&quot;#FAEBD7&quot; CELLPADDING=&quot;3&quot; CELLSPACING=&quot;0&quot; BORDER=&quot;0&quot;&gt;<br>
&lt;TD ALIGN=CENTER&gt;&lt;FONT COLOR=&quot;#996600&quot;&gt;&lt;B&gt;<br>
5.1. Получение данных о центральном процессоре.&lt;/B&gt;&lt;/FONT&gt;&lt;/TD&gt;&lt;/TABLE&gt;&lt;/P&gt;<br>
Этот первый пример я старался сделать как можно нагляднее и разберу я его достаточно подробно. В остальных же 3-х примерах я не буду повторяться в комментариях, а постараюсь продемонстрировать некоторые приёмы, которые, возможно, помогут вам в дальнейшем в ваших собственных программах.<br>
&lt;P&gt;Создаём новый проект и добавляем к нему компоненту TSWbemLocator, которая должна появиться в палитре компонент после импортирования указанных выше библиотек типов. Далее я буду давать комментарии непосредственно в коде программы.&lt;/P&gt;<br>
&lt;A NAME=&quot;code1&quot;&gt;&lt;/A&gt;<br>
 &lt;P&gt;&lt;TABLE WIDTH=&quot;100%&quot; CELLPADDING=&quot;0&quot; CELLSPACING=&quot;0&quot; BORDER=&quot;0&quot; BGCOLOR=&quot;#999999&quot;&gt;<br>
&lt;TR&gt;&lt;TD&gt;&lt;TABLE WIDTH=&quot;100%&quot; CELLPADDING=&quot;3&quot; CELLSPACING=&quot;1&quot; BORDER=&quot;0&quot;&gt;<br>
&lt;TR BGCOLOR=&quot;#FFFFFF&quot;&gt;&lt;TD&gt;&lt;PRE&gt;<br>
unit Unit1;<br>
<br>
interface<br>
<br>
uses<br>
  …, WbemScripting_TLB, OleServer, ActiveX;<br>
type<br>
  TForm1 = class(TForm)<br>
    …<br>
    SWbemLocator1: TSWbemLocator;<br>
    …;<br>
  private<br>
    &lt;FONT COLOR=&quot;#0000FF&quot;&gt;{ Private declarations }&lt;/FONT&gt;<br>
    procedure ShowProp(SProp: SWBemProperty);<br>
  public<br>
    &lt;FONT COLOR=&quot;#0000FF&quot;&gt;{ Public declarations }&lt;/FONT&gt;<br>
  end;<br>
<br>
var<br>
  Form1: TForm1;<br>
<br>
implementation<br>
<br>
&lt;FONT COLOR=&quot;#0000FF&quot;&gt;{&#036;R *.dfm}&lt;/FONT&gt;<br>
<br>
procedure TForm1.Button1Click(Sender: TObject);<br>
var<br>
  Service:             ISWbemServices;<br>
  ObjectSet:         ISWbemObjectSet;<br>
  SObject:            ISWbemObject;<br>
  PropSet:            ISWbemPropertySet;<br>
  SProp:               ISWbemProperty;<br>
<br>
  PropEnum, Enum:      IEnumVariant;<br>
  TempObj:                   OleVariant;<br>
  Value:                         Cardinal;<br>
  StrValue:                    string;<br>
begin<br>
&lt;FONT COLOR=&quot;#0000FF&quot;&gt;  // &lt;A HREF=&quot;#__1&quot;&gt;см. Примечание 1&lt;/A&gt;&lt;/FONT&gt;<br>
  Service:= SWbemLocator1.ConnectServer(&lt;FONT COLOR=&quot;#996600&quot;&gt;&#39;.&#39;&lt;/FONT&gt;, &lt;FONT COLOR=&quot;#996600&quot;&gt;&#39;root&#092;CIMV2&#39;&lt;/FONT&gt;, &lt;FONT COLOR=&quot;#996600&quot;&gt;&#39;&#39;&lt;/FONT&gt;, &lt;FONT COLOR=&quot;#996600&quot;&gt;&#39;&#39;&lt;/FONT&gt;, &lt;FONT COLOR=&quot;#996600&quot;&gt;&#39;&#39;&lt;/FONT&gt;,&lt;FONT COLOR=&quot;#996600&quot;&gt; &#39;&#39;&lt;/FONT&gt;, 0, nil);<br>
&lt;FONT COLOR=&quot;#0000FF&quot;&gt;  // &lt;A HREF=&quot;#__2&quot;&gt;см. Примечание 2&lt;/A&gt;&lt;/FONT&gt;<br>
  SObject:= Service.Get(&lt;FONT COLOR=&quot;#996600&quot;&gt;&#39;Win32_Processor&#39;&lt;/FONT&gt;, wbemFlagUseAmendedQualifiers, nil);<br>
&lt;FONT COLOR=&quot;#0000FF&quot;&gt;  //&lt;A HREF=&quot;#__3&quot;&gt; см. Примечание 3&lt;/A&gt;&lt;/FONT&gt;											 <br>
  ObjectSet:= SObject.Instances_(0, nil);<br>
&lt;FONT COLOR=&quot;#0000FF&quot;&gt;  {<br>
  Далее нам нужно из коллекции ObjectSet получить экземпляр объекта, <br>
  соответствующий классу Win32_Processor. <br>
  Делается это с помощью метода Item объекта ObjectSet. <br>
  В качестве первого параметра этого метода указывается путь к объекту, <br>
  экземпляр которого вы желаете извлечь из коллекции. <br>
  Данный метод возвращает объект типа SWbemObject. Но нам не известно, как выглядит этот путь.  <br>
  Использовать дополнительный класс SwbemObjectPath тоже нет никакого желания.<br>
  Так что делаю &quot;финт ушами&quot;:<br>
  }<br>
  //  SObject:= ObjectSet.Item(&#39;???&#39;, 0); &lt;/FONT&gt;<br>
<br>
  Enum:= (ObjectSet._NewEnum) as IEnumVariant;<br>
  Enum.Next(1, TempObj, Value);<br>
  SObject:= IUnknown(TempObj) as SWBemObject;<br>
&lt;FONT COLOR=&quot;#0000FF&quot;&gt;  {<br>
  Полагаю, что данный приём понятен читателю и в комментариях не нуждается.<br>
<br>
  Вот практически и всё - осталось прочитать интересующие нас свойства.<br>
  Сколько было слов и как всё просто оказалось в действительности :)<br>
<br>
  Перебираем свойства объекта SObject:<br>
 }&lt;/FONT&gt;<br>
  while (PropEnum.Next(1, TempObj, Value) = S_OK) do<br>
  begin<br>
    SProp:= IUnknown(TempObj) as SWBemProperty;  <br>
    StrValue:= &lt;FONT COLOR=&quot;#996600&quot;&gt;&#39;&#39;&lt;/FONT&gt;;<br>
    ListBox1.AddItem(SProp.Name, nil);<br>
    ShowProp(SProp);<br>
  end;<br>
end;<br>
<br>
procedure TForm1.ShowProp(SProp: SWBemProperty);<br>
begin<br>
  if (SProp.Get_Value &lt;&gt; null) then<br>
  begin<br>
    with SProp do<br>
    begin<br>
      if Name = &lt;FONT COLOR=&quot;#996600&quot;&gt;&#39;Name&#39;&lt;/FONT&gt; then<br>
        Label2.Caption:= Get_Value<br>
      else if Name = &lt;FONT COLOR=&quot;#996600&quot;&gt;&#39;Manufacturer&#39;&lt;/FONT&gt; then<br>
	….<br>
<br>
    end; &lt;FONT COLOR=&quot;#0000FF&quot;&gt;{ with }&lt;/FONT&gt;<br>
  end;&lt;FONT COLOR=&quot;#0000FF&quot;&gt; { if }&lt;/FONT&gt;<br>
end;<br>
<br>
end. <br>
&lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TABLE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TABLE&gt;&lt;/P&gt;<br>
							<br>
&lt;STRONG&gt;Пояснения к коду:&lt;/STRONG&gt;							<br>
&lt;DL&gt;					 <br>
&lt;A NAME=&quot;__1&quot;&gt;&lt;/A&gt;<br>
	&lt;DT&gt;&lt;STRONG&gt;Примечание 1&lt;/STRONG&gt;&lt;DD&gt;										  <br>
	Подсоединяемся к пространству имён &lt;FONT COLOR=&quot;#996600&quot;&gt;&#39;root&#092;CIMV2&#39;&lt;/FONT&gt; нашего компьютера.<br>
Метод &lt;STRONG&gt;ConnectServer&lt;/STRONG&gt; принимает следующие параметры:<br>
<br>
&lt;PRE&gt;objwbemServices = ConnectServer(<br>
  &#091; strServer = &quot;&quot; &#093;,<br>
  &#091; strNameSpace = &quot;&quot; &#093;,<br>
  &#091; strUser = &quot;&quot; &#093;,<br>
  &#091; strPassword = &quot;&quot; &#093;,<br>
  &#091; strLocale = &quot;&quot; &#093;,<br>
  &#091; strAuthority = &quot;&quot; &#093;,<br>
  &#091; iSecurityFlags = 0 &#093;,<br>
  &#091; objwbemNamedValueSet = null &#093;<br>
)&lt;/PRE&gt;<br>
<br>
&lt;UL&gt;<br>
	&lt;LI&gt;&lt;STRONG&gt;strServer&lt;/STRONG&gt; - необязательный к указанию параметр, содержащий имя компьютера к пространству имён которого вы желаете подключиться. Если не указан, имеется в виду данный компьютер;&lt;/LI&gt;<br>
	&lt;LI&gt;&lt;STRONG&gt;strNameSpace&lt;/STRONG&gt; - необязательный к указанию параметр, содержащий строку, указывающую к какому пространству имён вы собираетесь подключиться. Если не указан, то устанавливается в значение по умолчанию.&lt;/LI&gt;<br>
	&lt;LI&gt;&lt;STRONG&gt;StrUser&lt;/STRONG&gt; - необязательный к указанию параметр, содержащий строку с именем пользователя, которое будет использовано при подключении. При применении на локальной машине должна содержать нулевую строку. Применяется только при подключении к удалённой машине.&lt;/LI&gt;<br>
	&lt;LI&gt;&lt;STRONG&gt;StrPassword&lt;/STRONG&gt; - см. StrUser.&lt;/LI&gt;<br>
	&lt;LI&gt;&lt;STRONG&gt;StrLocale&lt;/STRONG&gt; - необязательный к указанию параметр, содержащий код местности (localization code). Должен содержать нулевую строку для применения действующего кода местности.&lt;/LI&gt;<br>
	&lt;LI&gt;&lt;STRONG&gt;StrAuthority&lt;/STRONG&gt; - необязательный к указанию параметр, предназначенный для работы в сетях с системой Kerberos.&lt;/LI&gt;<br>
	&lt;LI&gt;&lt;STRONG&gt;ISecurityFlags&lt;/STRONG&gt; - необязательный к указанию параметр. Если содержит 0, то метод ConnectServer вернёт результат только после того, как соединение с сервером будет установлено, т.е. если соединение установить не удалось - ваша программа повиснет. Если содержит значение wbemConnectFlagUseMaxWait, то приложение ждёт две минуты после чего возвращает код ошибки.&lt;/LI&gt;<br>
	&lt;LI&gt;&lt;STRONG&gt;ObjwbemNamedValueSet&lt;/STRONG&gt; - необязательный к указанию параметр. Обычно его не определяют (nil). Вообще говоря, можно указать объект типа SWbemNamedValueSet, который будет содержать информацию, которая может быть использована провайдером, обслуживающим данный запрос.&lt;/LI&gt;<br>
&lt;/UL&gt;<br>
<br>
Подробнее обо всех свойствах см. Platform SDK.<br>
	 &lt;BR&gt;&lt;DIV ALIGN=&quot;LEFT&quot;&gt;&lt;A HREF=&quot;#code1&quot;&gt;&lt;FONT SIZE=&quot;-2&quot; COLOR=&quot;#999999&quot;&gt;<br>
&#091; К коду &#093;&lt;/FONT&gt;&lt;/A&gt;&lt;/DIV&gt;&lt;BR&gt;<br>
	 &lt;A NAME=&quot;__2&quot;&gt;&lt;/A&gt;<br>
	&lt;DT&gt;&lt;STRONG&gt;Примечание 2&lt;/STRONG&gt;&lt;DD&gt;<br>
Теперь получим описание интересующего нас класса, т.е. Win32_Processor.<br>
&lt;BR&gt;Делается это с помощью метода Get полученного нами объекта Service.<br>
&lt;BR&gt;Метод Get принимает следующие параметры:<br>
<br>
&lt;PRE&gt;objWbemObject = Get(<br>
  &#091; strObjectPath = &quot;&quot; &#093;,<br>
  &#091; iFlags = 0 &#093;,<br>
  &#091; objWbemNamedValueSet = null &#093;<br>
)&lt;/PRE&gt;<br>
<br>
&lt;UL&gt;<br>
	&lt;LI&gt;&lt;STRONG&gt;strObjectPath&lt;/STRONG&gt; - необязательный к указанию параметр, содержащий название класса, описание которого мы желаем получить. Если данный параметр будет содержать нулевую строку, то будет создан новый класс.&lt;/LI&gt;<br>
	&lt;LI&gt;&lt;STRONG&gt;IFlags&lt;/STRONG&gt; - необязательный к указанию параметр. Принимает только одно значение: wbemFlagUseAmendedQualifiers.&lt;/LI&gt;<br>
	&lt;LI&gt;&lt;STRONG&gt;ObjWbemNamedValueSet&lt;/STRONG&gt; - см. выше.&lt;/LI&gt;<br>
&lt;/UL&gt;<br>
<br>
Подробнее обо всех свойствах см. Platform SDK.<br>
	<br>
	 &lt;BR&gt;&lt;DIV ALIGN=&quot;LEFT&quot;&gt;&lt;A HREF=&quot;#code1&quot;&gt;&lt;FONT SIZE=&quot;-2&quot; COLOR=&quot;#999999&quot;&gt;<br>
&#091; К коду &#093;&lt;/FONT&gt;&lt;/A&gt;&lt;/DIV&gt;&lt;BR&gt;<br>
<br>
		 &lt;A NAME=&quot;__3&quot;&gt;&lt;/A&gt;<br>
	&lt;DT&gt;&lt;STRONG&gt;Примечание 3&lt;/STRONG&gt;&lt;DD&gt;<br>
	Теперь надо получить коллекцию экземпляров класса Win32_Processor.<br>
&lt;BR&gt;Делается это с помощью метода Instances_ объекта SObject.<br>
&lt;BR&gt;Метод Instances_ принимает следующие параметры:<br>
<br>
&lt;PRE&gt;objWbemObjectSet = Instances_(<br>
  &#091; iFlags = wbemFlagReturnImmediately &#093;,<br>
  &#091; objwbemNamedValueSet = null &#093;<br>
)&lt;/PRE&gt;<br>
<br>
&lt;UL&gt;<br>
	&lt;LI&gt;&lt;STRONG&gt;iFlags&lt;/STRONG&gt; - необязательный к указанию параметр, содержащий числовое значение типа Integer, определяющее поведение данного запроса. &lt;/LI&gt;<br>
	&lt;LI&gt;&lt;STRONG&gt;ObjwbemNamedValueSet&lt;/STRONG&gt; - см. выше.&lt;/LI&gt;<br>
&lt;/UL&gt;<br>
<br>
Подробнее обо всех свойствах см. Platform SDK.<br>
	 &lt;BR&gt;&lt;DIV ALIGN=&quot;LEFT&quot;&gt;&lt;A HREF=&quot;#code1&quot;&gt;&lt;FONT SIZE=&quot;-2&quot; COLOR=&quot;#999999&quot;&gt;<br>
&#091; К коду &#093;&lt;/FONT&gt;&lt;/A&gt;&lt;/DIV&gt;&lt;BR&gt;<br>
<br>
&lt;/DL&gt;<br>
Исходный код и exe-файл данного примера вы сможете найти в прилагаемом к статье архиве в каталогах &#092;source&#092;GetProcessorData и &#092;Exe-files соответственно.<br>
<br>
&lt;P&gt;Вот что у меня получилось:&lt;/P&gt;		<br>
&lt;DIV ALIGN=&quot;center&quot;&gt;<br>
	&lt;IMG SRC=&quot;http://www.delphikingdom.ru/images/wmi2.gif&quot; WIDTH=&quot;633&quot; HEIGHT=&quot;304&quot; BORDER=&quot;0&quot; ALT=&quot;&quot;&gt;&lt;/DIV&gt;<br>
<br>
&lt;DIV ALIGN=&quot;LEFT&quot;&gt;&lt;A HREF=&quot;#top&quot;&gt;&lt;FONT SIZE=&quot;-2&quot; COLOR=&quot;#999999&quot;&gt;&#091; К содержанию &#093;&lt;/FONT&gt;&lt;/A&gt;&lt;/DIV&gt;<br>
<br>
&lt;A NAME=&quot;052&quot;&gt;&lt;/A&gt;<br>
&lt;P&gt;&lt;TABLE WIDTH=&quot;100%&quot; BGCOLOR=&quot;#FAEBD7&quot; CELLPADDING=&quot;3&quot; CELLSPACING=&quot;0&quot; BORDER=&quot;0&quot;&gt;<br>
&lt;TD ALIGN=CENTER&gt;&lt;FONT COLOR=&quot;#996600&quot;&gt;&lt;B&gt;<br>
5.2. Получение данных о запущенных процессах.&lt;/B&gt;&lt;/FONT&gt;&lt;/TD&gt;&lt;/TABLE&gt;&lt;/P&gt;<br>
Данный пример будет отличаться от предыдущего только тем, что я использую нехитрый приём и покажу, как вывести все свойства объекта некого класса, не зная самих имён этих свойств. Действуем так же, как и в первом примере:																			<br>
&lt;A NAME=&quot;code2&quot;&gt;&lt;/A&gt;<br>
&lt;P&gt;&lt;TABLE WIDTH=&quot;100%&quot; CELLPADDING=&quot;0&quot; CELLSPACING=&quot;0&quot; BORDER=&quot;0&quot; BGCOLOR=&quot;#999999&quot;&gt;<br>
&lt;TR&gt;&lt;TD&gt;&lt;TABLE WIDTH=&quot;100%&quot; CELLPADDING=&quot;3&quot; CELLSPACING=&quot;1&quot; BORDER=&quot;0&quot;&gt;<br>
&lt;TR BGCOLOR=&quot;#FFFFFF&quot;&gt;&lt;TD&gt;&lt;PRE&gt;<br>
…<br>
var<br>
  Form1: TForm1;<br>
  ListItem:   TListItem;<br>
<br>
implementation<br>
<br>
{&#036;R *.dfm}<br>
<br>
procedure TForm1.Button1Click(Sender: TObject);<br>
var<br>
  Service:             ISWbemServices;<br>
  ObjectSet:         ISWbemObjectSet;<br>
  SObject:            ISWbemObject;<br>
  PropSet:            ISWbemPropertySet;<br>
  SProp:               ISWbemProperty;<br>
<br>
  PropEnum, Enum:    IEnumVariant;<br>
  TempObj:                 OleVariant;<br>
  Value:                       Cardinal;<br>
  Column:                   TListColumn;<br>
begin<br>
  ListView1.Items.BeginUpdate;<br>
  ListView1.Items.Clear;<br>
<br>
  Service:= SWbemLocator1.ConnectServer(&lt;FONT COLOR=&quot;#996600&quot;&gt;&#39;.&#39;&lt;/FONT&gt;, &lt;FONT COLOR=&quot;#996600&quot;&gt;&#39;root&#092;CIMV2&#39;&lt;/FONT&gt;, &lt;FONT COLOR=&quot;#996600&quot;&gt;&#39;&#39;&lt;/FONT&gt;, &lt;FONT COLOR=&quot;#996600&quot;&gt;&#39;&#39;&lt;/FONT&gt;, &lt;FONT COLOR=&quot;#996600&quot;&gt;&#39;&#39;&lt;/FONT&gt;, &lt;FONT COLOR=&quot;#996600&quot;&gt;&#39;&#39;&lt;/FONT&gt;, 0, nil);<br>
  SObject:= Service.Get(&lt;FONT COLOR=&quot;#996600&quot;&gt;&#39;Win32_Process&#39;&lt;/FONT&gt;, wbemFlagUseAmendedQualifiers, nil);<br>
  ObjectSet:= SObject.Instances_(0, nil);<br>
  Enum:= (ObjectSet._NewEnum) as IEnumVariant;<br>
&lt;FONT COLOR=&quot;#0000FF&quot;&gt;<br>
  {<br>
  На данном этапе начинаются некоторые незначительные отличия от первого примера. <br>
  В предыдущем примере, мы знали, что у нас был единственный экземпляр класса <br>
  Win32_Processor, характеризующий центральный процессор. <br>
  В данном примере мы имеем столько экземпляров, сколько запущенных процессов, <br>
  поэтому их все необходимо перебрать и получить их свойства:<br>
  }<br>
&lt;/FONT&gt;<br>
&lt;FONT COLOR=&quot;#0000FF&quot;&gt;// в этом цикле перебираю все имеющиеся экземпляры&lt;/FONT&gt; <br>
  while (Enum.Next(1, TempObj, Value) = S_OK) do<br>
  begin<br>
    SObject:= IUnknown(TempObj) as SWBemObject;<br>
    PropSet:= SObject.Properties_;<br>
    PropEnum:= (PropSet._NewEnum) as IEnumVariant;<br>
    ListItem:= ListView1.Items.Add;<br>
<br>
&lt;FONT COLOR=&quot;#0000FF&quot;&gt;  // перебираю свойства&lt;/FONT&gt;<br>
    while (PropEnum.Next(1, TempObj, Value) = S_OK) do<br>
    begin<br>
      SProp:= IUnknown(TempObj) as SWBemProperty;<br>
      if ListView1.Items.Count = 1 then<br>
      begin<br>
        Column := ListView1.Columns.Add;<br>
        Column.Width := 100;<br>
        Column.Caption := SProp.Name;<br>
      end;<br>
      ShowProp(SProp);<br>
    end;<br>
  end; &lt;FONT COLOR=&quot;#0000FF&quot;&gt;{ while }&lt;/FONT&gt;<br>
  ListView1.Items.EndUpdate;<br>
end;	  <br>
&lt;FONT COLOR=&quot;#0000FF&quot;&gt;// В процедуре ShowProp происходит определение типа свойства <br>
// и соответствующие приведение типа.&lt;/FONT&gt;<br>
procedure TForm1.ShowProp(SProp: ISWbemProperty);<br>
var<br>
  StrValue: string;<br>
  Count: Cardinal;<br>
begin<br>
  StrValue:= &lt;FONT COLOR=&quot;#996600&quot;&gt;&#39;&#39;&lt;/FONT&gt;;<br>
  if VarIsNull(SProp.Get_Value) then<br>
    StrValue:= &lt;FONT COLOR=&quot;#996600&quot;&gt;&#39;&lt;empty&gt;&#39;&lt;/FONT&gt;<br>
  else<br>
    case SProp.CIMType of<br>
&lt;FONT COLOR=&quot;#0000FF&quot;&gt;//******************************************************************//&lt;/FONT&gt;<br>
      wbemCimtypeUint8, wbemCimtypeSint8, wbemCimtypeUint16, wbemCimtypeSint16,<br>
      wbemCimtypeUint32, wbemCimtypeSint32, wbemCimtypeSint64:<br>
      if VarIsArray(SProp.Get_Value) then<br>
      begin<br>
        if VarArrayHighBound(SProp.Get_Value, 1) &gt; 0 then<br>
          for Count:= 1 to VarArrayHighBound(SProp.Get_Value, 1) do<br>
            StrValue:= StrValue + &lt;FONT COLOR=&quot;#996600&quot;&gt;&#39; &#39;&lt;/FONT&gt; + IntToStr(SProp.Get_Value&#091;Count&#093;);<br>
      end<br>
      else<br>
        StrValue:= IntToStr(SProp.Get_Value);<br>
&lt;FONT COLOR=&quot;#0000FF&quot;&gt;//******************************************************************//&lt;/FONT&gt;<br>
      wbemCimtypeReal32, wbemCimtypeReal64:<br>
        StrValue:= FloatToStr(SProp.Get_Value);<br>
&lt;FONT COLOR=&quot;#0000FF&quot;&gt;//******************************************************************//<br>
<br>
      …<br>
<br>
//******************************************************************//<br>
&lt;/FONT&gt;      else<br>
        MessageBox(0, PChar(&lt;FONT COLOR=&quot;#996600&quot;&gt;&#39;Unknown type&#39;&lt;/FONT&gt;), PChar(Form1.Caption), MB_OK);<br>
    end; {case}<br>
    if ListItem.Caption = &lt;FONT COLOR=&quot;#996600&quot;&gt;&#39;&#39;&lt;/FONT&gt; then<br>
      ListItem.Caption := StrValue<br>
    else<br>
      ListItem.SubItems.Add(StrValue);<br>
end;<br>
<br>
end.											 <br>
&lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TABLE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TABLE&gt;&lt;/P&gt;				 <br>
Исходный код и exe-файл данного примера вы сможете найти в прилагаемом к статье архиве в каталогах &#092;source&#092; GetProcessData и &#092;Exe-files соответственно.<br>
&lt;BR&gt;&lt;BR&gt;<br>
А выглядит это так:<br>
&lt;DIV ALIGN=&quot;center&quot;&gt;<br>
	&lt;IMG SRC=&quot;http://www.delphikingdom.ru/images/wmi3.gif&quot; WIDTH=&quot;431&quot; HEIGHT=&quot;260&quot; BORDER=&quot;0&quot; ALT=&quot;&quot;&gt;&lt;/DIV&gt;<br>
&lt;DIV ALIGN=&quot;LEFT&quot;&gt;&lt;A HREF=&quot;#top&quot;&gt;&lt;FONT SIZE=&quot;-2&quot; COLOR=&quot;#999999&quot;&gt;&#091; К содержанию &#093;&lt;/FONT&gt;&lt;/A&gt;&lt;/DIV&gt;<br>
<br>
&lt;A NAME=&quot;053&quot;&gt;&lt;/A&gt;<br>
&lt;P&gt;&lt;TABLE WIDTH=&quot;100%&quot; BGCOLOR=&quot;#FAEBD7&quot; CELLPADDING=&quot;3&quot; CELLSPACING=&quot;0&quot; BORDER=&quot;0&quot;&gt;<br>
&lt;TD ALIGN=CENTER&gt;&lt;FONT COLOR=&quot;#996600&quot;&gt;&lt;B&gt;<br>
5.3. Запуск приложений и выключение компьютера.&lt;/B&gt;&lt;/FONT&gt;&lt;/TD&gt;&lt;/TABLE&gt;&lt;/P&gt;<br>
В данном примере я продемонстрирую, как использовать &lt;STRONG&gt;методы&lt;/STRONG&gt;, предоставляемые провайдерами. <br>
&lt;P&gt;&lt;TABLE WIDTH=&quot;100%&quot; CELLPADDING=&quot;0&quot; CELLSPACING=&quot;0&quot; BORDER=&quot;0&quot; BGCOLOR=&quot;#999999&quot;&gt;<br>
&lt;TR&gt;&lt;TD&gt;&lt;TABLE WIDTH=&quot;100%&quot; CELLPADDING=&quot;3&quot; CELLSPACING=&quot;1&quot; BORDER=&quot;0&quot;&gt;<br>
&lt;TR BGCOLOR=&quot;#FFFFFF&quot;&gt;&lt;TD&gt;&lt;PRE&gt;<br>
…<br>
<br>
var<br>
  Form1: TForm1;<br>
  Service: ISWbemServices;<br>
  InParam, OutParam, SObject, Process:    ISWbemObject;<br>
  Method:   ISWbemMethod;<br>
  SProp1, SProp2, MyProperty: ISWbemProperty;<br>
<br>
implementation<br>
<br>
{&#036;R *.dfm}<br>
<br>
procedure TForm1.Button1Click(Sender: TObject);<br>
var<br>
  PropValue: OleVariant;<br>
begin<br>
  Service:= SWbemLocator1.ConnectServer(&lt;FONT COLOR=&quot;#996600&quot;&gt;&#39;.&#39;&lt;/FONT&gt;, &lt;FONT COLOR=&quot;#996600&quot;&gt;&#39;root&#092;cimv2&#39;&lt;/FONT&gt;, &lt;FONT COLOR=&quot;#996600&quot;&gt;&#39;&#39;&lt;/FONT&gt;, &lt;FONT COLOR=&quot;#996600&quot;&gt;&#39;&#39;&lt;/FONT&gt;,&lt;FONT COLOR=&quot;#996600&quot;&gt; &#39;&#39;&lt;/FONT&gt;,   &lt;FONT COLOR=&quot;#996600&quot;&gt;&#39;&#39;&lt;/FONT&gt;, 0, nil);<br>
&lt;FONT COLOR=&quot;#0000FF&quot;&gt;  // &lt;A HREF=&quot;#c__1&quot;&gt;см. Примечание 1&lt;/A&gt;&lt;/FONT&gt;<br>
  Service.Security_.Set_ImpersonationLevel(wbemImpersonationLevelImpersonate);<br>
  Process:= Service.Get(&lt;FONT COLOR=&quot;#996600&quot;&gt;&#39;Win32_Process&#39;&lt;/FONT&gt;, 0, nil);<br>
&lt;FONT COLOR=&quot;#0000FF&quot;&gt;  // &lt;A HREF=&quot;#c__2&quot;&gt;см. Примечание 2&lt;/A&gt;&lt;/FONT&gt;  <br>
  Method:= Process.Methods_.Item(&lt;FONT COLOR=&quot;#996600&quot;&gt;&#39;Create&#39;&lt;/FONT&gt;, 0);<br>
&lt;FONT COLOR=&quot;#0000FF&quot;&gt;  // &lt;A HREF=&quot;#c__3&quot;&gt;см. Примечание 3&lt;/A&gt;&lt;/FONT&gt;    <br>
  InParam:= Method.InParameters.SpawnInstance_(0);<br>
&lt;FONT COLOR=&quot;#0000FF&quot;&gt;  // &lt;A HREF=&quot;#c__4&quot;&gt;см. Примечание 4&lt;/A&gt;&lt;/FONT&gt;      <br>
  MyProperty:= InParam.Properties_.Add(&lt;FONT COLOR=&quot;#996600&quot;&gt;&#39;CommandLine&#39;&lt;/FONT&gt;, wbemCimtypeString, False, 0);  <br>
&lt;FONT COLOR=&quot;#0000FF&quot;&gt;{<br>
  С помощью метода Set_Value объекта ISWbemProperty присваеваем свойству CommandLine<br>
  значение Notepad.exe<br>
}&lt;/FONT&gt;<br>
  PropValue:= &#39;Notepad.exe&#39;;<br>
  MyProperty.Set_Value(PropValue);<br>
<br>
&lt;FONT COLOR=&quot;#0000FF&quot;&gt;  // После того, как все входные свойства определены, запускаем приложение.<br>
  // OutParam - объект, возвращаемый методом ExecMethod_&lt;/FONT&gt;<br>
<br>
  OutParam:= Process.ExecMethod_(&lt;FONT COLOR=&quot;#996600&quot;&gt;&#39;Create&#39;&lt;/FONT&gt;, InParam, 0, nil);<br>
<br>
&lt;FONT COLOR=&quot;#0000FF&quot;&gt;  //  Получения выходных параметров из возвращённого объекта OutParam типа SWbemObject&lt;/FONT&gt;<br>
<br>
  SProp1:= outParam.Properties_.Item(&lt;FONT COLOR=&quot;#996600&quot;&gt;&#39;ReturnValue&#39;&lt;/FONT&gt;, 0);<br>
  <br>
&lt;FONT COLOR=&quot;#0000FF&quot;&gt;  // Проверяю, удалось ли запустить приложение. Если свойство ReturnValue не равно 0,<br>
  // то произошла ошибка.&lt;/FONT&gt;<br>
  if SProp1.Get_Value = 0 then<br>
  begin<br>
    SProp2:= outParam.Properties_.Item(&lt;FONT COLOR=&quot;#996600&quot;&gt;&#39;ProcessID&#39;&lt;/FONT&gt;, 0);<br>
    Button2.Enabled:= True;<br>
    Button1.Enabled:= False;<br>
    sleep(300);<br>
    SetForegroundWindow(Form1.Handle);<br>
  end<br>
  else<br>
    MessageBox(0, PChar(&lt;FONT COLOR=&quot;#996600&quot;&gt;&#39;Не удалось запустить приложение.&#39;&lt;/FONT&gt;), PChar(Form1.Caption), MB_OK);<br>
<br>
end;<br>
<br>
procedure TForm1.Button2Click(Sender: TObject);<br>
var<br>
  PropValue: OleVariant;<br>
begin<br>
    SObject:= Service.Get(&lt;FONT COLOR=&quot;#996600&quot;&gt;&#39;Win32_Process.Handle=&quot;&#39;&lt;/FONT&gt; +  WideString(SProp2.Get_Value) + &lt;FONT COLOR=&quot;#996600&quot;&gt;&#39;&quot;&#39;&lt;/FONT&gt;, 0, nil);<br>
    Method:= SOBject.Methods_.Item(&lt;FONT COLOR=&quot;#996600&quot;&gt;&#39;Terminate&#39;&lt;/FONT&gt;, 0);<br>
    InParam:= Method.InParameters.SpawnInstance_(0);<br>
    MyProperty:= InParam.Properties_.Add(&lt;FONT COLOR=&quot;#996600&quot;&gt;&#39;Reason&#39;&lt;/FONT&gt;, wbemCimtypeUint32, False, 0);<br>
    PropValue:= 0;<br>
    MyProperty.Set_Value(PropValue);<br>
    OutParam:= SObject.ExecMethod_(&lt;FONT COLOR=&quot;#996600&quot;&gt;&#39;Terminate&#39;&lt;/FONT&gt;, InParam, 0, nil);<br>
    SProp1:= outParam.Properties_.Item(&lt;FONT COLOR=&quot;#996600&quot;&gt;&#39;ReturnValue&#39;&lt;/FONT&gt;, 0);<br>
    if SProp1.Get_Value = 0 then<br>
    begin<br>
      Button1.Enabled:= True;<br>
      Button2.Enabled:= False;<br>
    end<br>
    else<br>
      MessageBox(0, PChar(&lt;FONT COLOR=&quot;#996600&quot;&gt;&#39;Не удалось закрыть приложение.&#39;&lt;/FONT&gt;), PChar(Form1.Caption), MB_OK);<br>
end;<br>
procedure TForm1.Button3Click(Sender: TObject);<br>
var<br>
  ObjectSet: ISWbemObjectSet;<br>
  Enum:      IEnumVariant;<br>
  TempObj:   OleVariant;<br>
  Value:     Cardinal;<br>
begin<br>
&lt;FONT COLOR=&quot;#0000FF&quot;&gt;// Выключение компьютера - использование Shutdown без свойств.&lt;/FONT&gt;<br>
  if MessageBox(0, PChar(&lt;FONT COLOR=&quot;#996600&quot;&gt;&#39;Если вы выберете &#39;&#39;Да&#39;&#39;, ваш компьютер выключится&#33;&#39;&lt;/FONT&gt;),<br>
    PChar(Form1.Caption), MB_YESNO or MB_ICONEXCLAMATION or MB_DEFBUTTON2) = mrYes then<br>
  begin<br>
    Service:= SWbemLocator1.ConnectServer(&lt;FONT COLOR=&quot;#996600&quot;&gt;&#39;.&#39;&lt;/FONT&gt;, &lt;FONT COLOR=&quot;#996600&quot;&gt;&#39;root&#092;cimv2&#39;&lt;/FONT&gt;, &lt;FONT COLOR=&quot;#996600&quot;&gt;&#39;&#39;&lt;/FONT&gt;, &lt;FONT COLOR=&quot;#996600&quot;&gt;&#39;&#39;&lt;/FONT&gt;, &lt;FONT COLOR=&quot;#996600&quot;&gt;&#39;&#39;&lt;/FONT&gt;,<br>
      &lt;FONT COLOR=&quot;#996600&quot;&gt;&#39;&#39;&lt;/FONT&gt;, 0, nil);<br>
    Service.Security_.Privileges.Add(wbemPrivilegeShutdown, True);<br>
&lt;FONT COLOR=&quot;#0000FF&quot;&gt;  // &lt;A HREF=&quot;#c__5&quot;&gt;см. Примечание 5&lt;/A&gt;&lt;/FONT&gt;    <br>
&lt;FONT COLOR=&quot;#0000FF&quot;&gt;//  SObject:= Service.Get(&#39;Win32_OperatingSystem&#39;, wbemFlagUseAmendedQualifiers, nil);<br>
//  ObjectSet:= SObject.Instances_(0, nil);&lt;/FONT&gt;<br>
<br>
    ObjectSet:= Service.ExecQuery(&lt;FONT COLOR=&quot;#996600&quot;&gt;&#39;SELECT * FROM Win32_OperatingSystem WHERE Primary=True&#39;&lt;/FONT&gt;,<br>
      &lt;FONT COLOR=&quot;#996600&quot;&gt;&#39;WQL&#39;&lt;/FONT&gt;, wbemFlagReturnImmediately, nil);<br>
<br>
    Enum:= (ObjectSet._NewEnum) as IEnumVariant;<br>
    while (Enum.Next(1, TempObj, Value) = S_OK) do<br>
    begin<br>
      SObject:= IUnknown(tempObj) as SWBemObject;<br>
      SObject.ExecMethod_(&lt;FONT COLOR=&quot;#996600&quot;&gt;&#39;Shutdown&#39;&lt;/FONT&gt;, nil, 0, nil);<br>
    end;<br>
  end; &lt;FONT COLOR=&quot;#0000FF&quot;&gt;{ if MessageBox }&lt;/FONT&gt;<br>
end;<br>
<br>
end.<br>
&lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TABLE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TABLE&gt;&lt;/P&gt;<br>
&lt;STRONG&gt;Пояснения к коду:&lt;/STRONG&gt;		<br>
&lt;DL&gt;					   <br>
	&lt;A NAME=&quot;c__1&quot;&gt;&lt;/A&gt;<br>
	&lt;DT&gt;&lt;STRONG&gt;Примечание 1&lt;/STRONG&gt;&lt;DD&gt;<br>
&lt;STRONG&gt;Security_&lt;/STRONG&gt; - данное свойство используется в том случае, когда вы собираетесь<br>
  считать или установить настройки безопасности для объекта SWbemServices.<br>
  Объект SWbemSecurity имеет следующие свойства: AuthenticationLevel, ImpersonationLevel,<br>
  Privileges. Нас в данном случае будет интересовать только второе свойство.<br>
  ImpersonationLevel - Числовое значение. Данное свойство определяет, может ли процесс,<br>
  владельцем которого является WMI, пользоваться правами вашей учётной записи,<br>
  что может быть необходимо при обращении к другим процессам. Я буду пользоваться<br>
  значением &#39;3&#39; (wbemImpersonationLevelImpersonate), что означает, что я наделяю<br>
  данный объект правами того, кто его вызвал. Об остальных уровнях наследования<br>
  прав читайте в SDK.<br>
	<br>
	&lt;BR&gt;&lt;BR&gt;<br>
	&lt;DIV ALIGN=&quot;LEFT&quot;&gt;&lt;A HREF=&quot;#code2&quot;&gt;&lt;FONT SIZE=&quot;-2&quot; COLOR=&quot;#999999&quot;&gt;&#091; К коду &#093;&lt;/FONT&gt;&lt;/A&gt;&lt;/DIV&gt;<br>
	&lt;A NAME=&quot;c__2&quot;&gt;&lt;/A&gt;<br>
	&lt;DT&gt;&lt;STRONG&gt;Примечание 2&lt;/STRONG&gt;&lt;DD&gt;<br>
Свойство Methods_ объекта SWbemObject представляет собой объект типа SWbemMethodSet,<br>
 который является не чем иным, как коллекцией методов данного класса (или экземпляра класса).&lt;BR&gt;<br>
 Данное свойство предназначено только для чтения (read-only).&lt;BR&gt;<br>
&lt;BR&gt; Единственный метод Item объекта SWbemMethodSet возвращает объект типа SWbemMethod.<br>
&lt;BR&gt; Метод Item принимает следующие параметры:<br>
<br>
&lt;PRE&gt; objMethod = Item(<br>
  strName,<br>
  &#091; iFlags = 0 &#093;<br>
  )&lt;/PRE&gt;<br>
<br>
  &lt;STRONG&gt;strName&lt;/STRONG&gt; - необходимый параметр. Имя метода, указатель на который должен быть возвращён<br>
  данным методом.<br>
	<br>
	&lt;BR&gt;&lt;BR&gt;	<br>
	&lt;DIV ALIGN=&quot;LEFT&quot;&gt;&lt;A HREF=&quot;#code2&quot;&gt;&lt;FONT SIZE=&quot;-2&quot; COLOR=&quot;#999999&quot;&gt;&#091; К коду &#093;&lt;/FONT&gt;&lt;/A&gt;&lt;/DIV&gt;<br>
	&lt;A NAME=&quot;c__3&quot;&gt;&lt;/A&gt;	<br>
	&lt;DT&gt;&lt;STRONG&gt;Примечание 3&lt;/STRONG&gt;&lt;DD&gt;<br>
  Свойство InParameters объекта SWbemMethod определяет входные параметры для данного метода.<br>
  Метод SpawnInstance_ объекта SWbemObject создаёт новый экземпляр класса.&lt;BR&gt;<br>
  Данный метод имеет следующие входные параметры:<br>
<br>
&lt;PRE&gt;  objNewInstance = SpawnInstance_(<br>
  &#091; iFlags = 0 &#093;<br>
  )&lt;/PRE&gt;<br>
<br>
  Единственный параметр &lt;STRONG&gt;iFlags&lt;/STRONG&gt; зарезервирован и не обязателен к указанию.&lt;BR&gt;<br>
  Если указывается, то должен быть равен 0.<br>
	<br>
	&lt;BR&gt;&lt;BR&gt;	<br>
	&lt;DIV ALIGN=&quot;LEFT&quot;&gt;&lt;A HREF=&quot;#code2&quot;&gt;&lt;FONT SIZE=&quot;-2&quot; COLOR=&quot;#999999&quot;&gt;&#091; К коду &#093;&lt;/FONT&gt;&lt;/A&gt;&lt;/DIV&gt;<br>
	&lt;A NAME=&quot;c__4&quot;&gt;&lt;/A&gt;	<br>
	&lt;DT&gt;&lt;STRONG&gt;Примечание 4&lt;/STRONG&gt;&lt;DD&gt;<br>
Свойство Properties_ объекта SWbemObject представляет собой объект типа SWbemPropertySet,<br>
  который является коллекцией свойств для данного класса или экземпляра.&lt;BR&gt;<br>
  Метод Add объекта SWbemPrivilegeSet добавляет объект типа SWbemProperty к объекту<br>
  SWbemPrivilegeSet.<br>
&lt;BR&gt;  Данный метод имеет следующие входные параметры:<br>
<br>
  &lt;PRE&gt;objProperty = Add(<br>
  strName,<br>
  iCIMType,<br>
  &#091; bIsArray = FALSE &#093;,<br>
  &#091; iFlags = 0 &#093;<br>
                   )&lt;/PRE&gt;<br>
&lt;UL&gt;<br>
	&lt;LI&gt;  &lt;STRONG&gt;strName&lt;/STRONG&gt; - обязательный к указанию параметр. Имя нового свойства.&lt;/LI&gt;<br>
	&lt;LI&gt;  &lt;STRONG&gt;iCIMType&lt;/STRONG&gt; - обязательный к указанию параметр. Определяет тип (CIMType) свойства.&lt;/LI&gt;<br>
	&lt;LI&gt;  &lt;STRONG&gt;bIsArray&lt;/STRONG&gt; - необязательный к указанию параметр. Определяющий является ли данное            свойство массивом. По умолчанию False.&lt;/LI&gt;<br>
	&lt;LI&gt;  &lt;STRONG&gt;iFlags&lt;/STRONG&gt; -  необязательный к указанию параметр. Зарезервирован.            Если указывается, то должен быть равен 0.&lt;/LI&gt;<br>
&lt;/UL&gt;<br>
	<br>
	&lt;BR&gt;&lt;BR&gt;	<br>
	&lt;DIV ALIGN=&quot;LEFT&quot;&gt;&lt;A HREF=&quot;#code2&quot;&gt;&lt;FONT SIZE=&quot;-2&quot; COLOR=&quot;#999999&quot;&gt;&#091; К коду &#093;&lt;/FONT&gt;&lt;/A&gt;&lt;/DIV&gt;<br>
	&lt;A NAME=&quot;c__5&quot;&gt;&lt;/A&gt;	<br>
	&lt;DT&gt;&lt;STRONG&gt;Примечание 5&lt;/STRONG&gt;&lt;DD&gt;				<br>
  Для получения коллекции экземпляров Win32_OperatingSystem я намеренно воспользовался<br>
  методом ExecQuery объекта ISWbemServices, что бы продемонстрировать работу данной ф-ии.<br>
 &lt;BR&gt; Использование данного метода равносильно используемой мною ранее конструкции.<br>
  &lt;BR&gt;&lt;BR&gt;<br>
  Кстати, синтаксис WQL вам ничего не напоминает? ;) Правильно - WQL прямой потомок ANSI SQL,<br>
  и соответствует синтаксису SQL. В WQL введены незначительные семантические<br>
  изменения необходимые для работы с WMI. Так что вам даже не придётся учить новый<br>
  язык запросов, для того что бы использовать WMI - Microsoft оказалась гуманной и мудрой в<br>
  этом отношении и в очередной раз не усложнила нашу жизнь :)<br>
  &lt;BR&gt;Для интересующихся правилами составления запросов: откруваем SDK, раздел &quot;Querying with WQL&quot;, всё понятно и доступно.<br>
  &lt;BR&gt;&lt;DIV ALIGN=&quot;LEFT&quot;&gt;&lt;A HREF=&quot;#code2&quot;&gt;&lt;FONT SIZE=&quot;-2&quot; COLOR=&quot;#999999&quot;&gt;&#091; К коду &#093;&lt;/FONT&gt;&lt;/A&gt;&lt;/DIV&gt;	<br>
&lt;/DL&gt;<br>
Исходный код и exe-файл данного примера вы сможете найти в прилагаемом к статье архиве в каталогах &#092;source&#092; UseMethods и &#092;Exe-files соответственно. 	  <br>
&lt;DIV ALIGN=&quot;LEFT&quot;&gt;&lt;A HREF=&quot;#top&quot;&gt;&lt;FONT SIZE=&quot;-2&quot; COLOR=&quot;#999999&quot;&gt;&#091; К содержанию &#093;&lt;/FONT&gt;&lt;/A&gt;&lt;/DIV&gt;<br>
<br>
&lt;A NAME=&quot;054&quot;&gt;&lt;/A&gt;<br>
&lt;P&gt;&lt;TABLE WIDTH=&quot;100%&quot; BGCOLOR=&quot;#FAEBD7&quot; CELLPADDING=&quot;3&quot; CELLSPACING=&quot;0&quot; BORDER=&quot;0&quot;&gt;<br>
&lt;TD ALIGN=CENTER&gt;&lt;FONT COLOR=&quot;#996600&quot;&gt;&lt;B&gt;<br>
5.4. Получения значений c температурных сенсоров и с установленных вентиляторов.&lt;/B&gt;&lt;/FONT&gt;&lt;/TD&gt;&lt;/TABLE&gt;&lt;/P&gt;<br>
Данный пример не содержит каких-либо новых решений или приёмов, кроме проверки на существование провайдера (вернее возможности работать с ним), осуществляющего связь между требуемым компонентом системы и программой. У меня (Chaintech 7VJL (Apogee) VIA KT333 / Athlon XP 1600+ / Windows 2000 Professional SP3) не удаётся получить свойства некоторых классов, например, Win32_Fan и Win32_TemperatureProbe. Выражается это в том, что не удаётся получить экземпляр ни одного из этих классов. Дело в том, что WMI не может получить доступ к WMI провайдеру. Но, т.к. данные классы имеются в хранилище CIM классов, то получить описание данных классов удаётся:<br>
&lt;PRE&gt;  <br>
  Service:= SWbemLocator1.ConnectServer(&lt;FONT COLOR=&quot;#996600&quot;&gt;&#39;.&#39;&lt;/FONT&gt;, &lt;FONT COLOR=&quot;#996600&quot;&gt;&#39;root&#092;CIMV2&#39;&lt;/FONT&gt;, &lt;FONT COLOR=&quot;#996600&quot;&gt;&#39;&#39;&lt;/FONT&gt;, &lt;FONT COLOR=&quot;#996600&quot;&gt;&#39;&#39;&lt;/FONT&gt;,&lt;FONT COLOR=&quot;#996600&quot;&gt; &#39;&#39;&lt;/FONT&gt;, &lt;FONT COLOR=&quot;#996600&quot;&gt;&#39;&#39;&lt;/FONT&gt;, 0, nil);<br>
  SObject:= Service.Get(&lt;FONT COLOR=&quot;#996600&quot;&gt;&#39;Win32_Fan&#39;&lt;/FONT&gt;, wbemFlagUseAmendedQualifiers, nil);<br>
&lt;/PRE&gt;	   <br>
Но при выполнении:<br>
  &lt;PRE&gt;ObjectSet:= SObject.Instances_(0, nil);&lt;/PRE&gt;<br>
Метод Instances_ не возвращает требуемой коллекции экземпляров и функция Enum.Next(1, TempObj, Value) вернёт значение S_FALSE, а при попытке выполнить  PropSet := SObject.Properties_; как я сделал в первом примере, вы получите отказ в доступе (Access Violation), причина понятна….  <br>
&lt;P&gt;Я проверял работу данного примера и на материнской плате Gigabyte VIA KT266 с аналогичным процессором и операционной системой - результат тот же.<br>
&lt;/P&gt;Думаю, не нужно говорить о том, что обе материнских платы имеют соответствующие сенсоры для диагностики температурного режима и контроля вращения вентиляторов. <br>
&lt;P&gt;Между тем, имеется информация о том, что данные параметры удаётся без проблем получить на материнских платах с чипсетами (chipset) фирмы Intel. Ничего по этому поводу сказать не могу - у меня в момент написания данной статьи не было возможности протестировать данный пример на компьютерах на базе чипсетов от Intel.<br>
&lt;/P&gt;<br>
Исходный код и exe-файл данного примера вы сможете найти в прилагаемом к статье архиве в каталогах &#092;source&#092; FanAndTemperature и &#092;Exe-files соответственно.<br>
&lt;DIV ALIGN=&quot;LEFT&quot;&gt;&lt;A HREF=&quot;#top&quot;&gt;&lt;FONT SIZE=&quot;-2&quot; COLOR=&quot;#999999&quot;&gt;&#091; К содержанию &#093;&lt;/FONT&gt;&lt;/A&gt;&lt;/DIV&gt;<br>
&lt;A NAME=&quot;06&quot;&gt;&lt;/A&gt;<br>
&lt;H3&gt;&lt;FONT COLOR=&quot;#996600&quot;&gt;6. Послесловие.&lt;/FONT&gt;&lt;/H3&gt;<br>
На этом я закончу рассказ о применении технологии WMI. Надеюсь, что теперь вы прониклись мыслью о том, что WMI крайне удобная и относительно несложная в реализации технология, которая поможет решить массу ваших проблем :) Microsoft продолжает активно развивать WMI, и в скором времени мы получим мощнейший инструмент, области применения которого очень и очень обширны. Нам, людям занимающимся программированием, как никому другому приходится год от года, месяц от месяца пополнять свой &quot;боевой&quot; арсенал всё новыми и новыми знаниями, приёмами, инструментами и методологиями. На мой взгляд, технология WMI может занять достойное место в вашем личном арсенале знаний.<br>
&lt;BR&gt;&lt;BR&gt;		 <br>
&lt;STRONG&gt;P.S.&lt;/STRONG&gt; &lt;BR&gt;<br>
Если вам что-то не понятно в примерах или самой теории, то прежде чем отягощать кого-либо своими расспросами, откройте Platform SDK Documentation, затратьте немного своего драгоценного времени и поищите самостоятельно ответы на свои вопросы. Как показывает практика многих поколений - решение, найденное самостоятельно, стоит нескольких, полученных от кого-то. Но если всё же у вас ничего не выйдет - пишите мне, будем разбираться вместе :) <br>
&lt;A NAME=&quot;07&quot;&gt;&lt;/A&gt;<br>
&lt;H3&gt;&lt;FONT COLOR=&quot;#996600&quot;&gt;7. Список использованной литературы.&lt;/FONT&gt;&lt;/H3&gt;<br>
&lt;OL&gt;<br>
	&lt;LI&gt;Platform SDK Release: August 2002.&lt;/LI&gt;<br>
&lt;/OL&gt;<br>
&lt;P ALIGN=&quot;right&quot;&gt;<br>
&lt;STRONG&gt;Алексей Павлов &lt;/STRONG&gt;&lt;BR&gt;<br>
Специально для &lt;A HREF=&quot;http://www.delphikingdom.com&quot;&gt;&lt;B&gt;Королевства Delphi&lt;/B&gt;&lt;/A&gt;&lt;BR&gt;&lt;BR&gt;<br>
Moscow Power Engineering Institute (Technical University)&lt;BR&gt;<br>
Faculty of Nuclear Power Plants&lt;BR&gt;<br>
21.10.02 <br>
&lt;/P&gt;<br>
&lt;DIV ALIGN=&quot;LEFT&quot;&gt;&lt;A HREF=&quot;#top&quot;&gt;&lt;FONT SIZE=&quot;-2&quot; COLOR=&quot;#999999&quot;&gt;&#091; К содержанию &#093;&lt;/FONT&gt;&lt;/A&gt;&lt;/DIV&gt;<br>
&lt;BR&gt;<br>
Скачать &lt;STRONG&gt;&lt;A HREF=&quot;http://delphi.mtu-net.ru/zip/wmi.zip&quot;&gt;WMI.zip&lt;/A&gt;&lt;/STRONG&gt; (886 K)[/doHTML]]]></description>
        <author>Song</author>
        <category>ActiveX, COM, DCOM, CORBA, MIDAS, интерфейсы, OLE, DDE</category>
      </item>
	
      </channel>
      </rss>
	