Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.01.07;
Скачать: CL | DM;

Вниз

Несколько вопросов по WMI.   Найти похожие ветки 

 
Riply ©   (2006-12-17 02:47) [0]

Здравствуйте !
В свете последней моды и утверждений "некоторые вещи досупны только через WMI",
решила познакомиться и узнать с чем это едят... :)
Подсматривая в примеры других, написала простенькую процедуру для перечисления
"всех доступных пространств имён".

procedure WMI_EnumNameSpaces(WbemLocator: TSWbemLocator; const aMachine, aUser, aPass, aObjPath: string; List: TStrings);
var
i: integer;
cbFetched: DWord;
Srv:       ISWBEMServices;
ObjSet:    ISWBEMobjectSet;
SObject:   ISWbemObject;
TempObj:   OleVariant;
PropEnum, Enum:  IEnumVariant;
PathDlm, aValue: string;
TmpList: TStringList;
begin
if aObjPath = "" then PathDlm:= "" else PathDlm:= PathDelim;
Srv:= WbemLocator.ConnectServer(aMachine, WMI_ROOT + PathDlm + aObjPath, aUser, aPass, "", "", 0, nil);
SObject:= Srv.Get(WMI_NAMESPACE, wbemFlagUseAmendedQualifiers, nil);
ObjSet:= SObject.Instances_(0, nil);
if ObjSet <> nil then
 begin
  Enum:= IEnumVariant(ObjSet._NewEnum);
  Enum.Reset;

  cbFetched:= 0;
  TmpList:= TStringList.Create;
  try
   while (Enum.Next(1, TempObj, cbFetched) = S_OK) do
    begin
     // .......
     PropEnum.Reset;
     while (PropEnum.Next(1, TempObj, cbFetched) = S_OK) do
      begin
       // .........
       List.Add(aValue);
       TmpList.Add(aValue);
      end;
    end;
   for i:= 0 to TmpList.Count - 1 do WMI_EnumNameSpaces(WbemLocator, aMachine, aUser, aPass, TmpList[i], List);
  finally
   TmpList.Free;
  end;
 end;
end;


В результате этого возникло несколько вопросов, на которые, я не смогла найти ответ:
Так ли необходимо при изменении aObjPath снова коннектиться через WbemLocator.ConnectServer, или
можно один раз подсоединиться SWbemLocator.ConnectServer("", "Root", "", "", "", "", 0, nil),
а потом каким-то образом "переадресоваться" ?
Нужно ли перед новым вызовом SWbemLocator.ConnectServer, вызывать SWbemLocator.Disconnect ?
Почему в примерах( которыя я видела), переменные, инициализированные через SWbemLocator.ConnectServer,
SWBEMServices.Get и SWbemObject.Instances_ в конце работы не освобождаються ?
И (надеюсь) последнее:
При попытке подсоединиться к удаленной машине
SWbemLocator.ConnectServer("CompName", "root\CIMV2", "UserName", "Password", "", "", 0, nil),
получаю ошибку: "raised exception class EOleException with message "The RPC server is unavailable"."
Как это можно исправить ?


 
Eraser ©   (2006-12-17 02:59) [1]

> [0] Riply ©   (17.12.06 02:47)


> Так ли необходимо при изменении aObjPath снова коннектиться
> через WbemLocator.ConnectServer, или
> можно один раз подсоединиться SWbemLocator.ConnectServer("",
> "Root", "", "", "", "", 0, nil),
> а потом каким-то образом "переадресоваться" ?

практика - критерий истины :)

> Нужно ли перед новым вызовом SWbemLocator.ConnectServer,
> вызывать SWbemLocator.Disconnect ?

думаю не обязательно.

> Почему в примерах( которыя я видела), переменные, инициализированные
> через SWbemLocator.ConnectServer,
> SWBEMServices.Get и SWbemObject.Instances_ в конце работы
> не освобождаються ?

потому что используется технология COM, когда переменная выходит из зоны видимости - она автоматически освобождается, как в C#.

> Как это можно исправить ?

очевидно, запустив соответствующую службу на удаленной машине. по-умолчанию в системах 2k/xp/2003 WMI доступно.


 
Riply ©   (2006-12-17 03:15) [2]

>[1] Eraser ©   (17.12.06 02:59)
Спасибо.
По поводу "когда переменная выходит из зоны видимости - она автоматически освобождается"
прямо камень с души :)
> можно один раз подсоединиться,
> а потом каким-то образом "переадресоваться" ?
>практика - критерий истины :)
Проверила бы на практике, если бы знала способ как "переадресоваться"
Вызов SWBEMServices.Get("NewPath\NewSubPath",
выдает ошибку "ну совсем у Вас путь не правильный" :)
>запустив соответствующую службу на удаленной машине
А как она называется ?
Я уже эксперементировала с Remote Procedure Call и Remote Procedure Call Locator
не помогает :(


 
Eraser ©   (2006-12-17 15:01) [3]

> [2] Riply ©   (17.12.06 03:15)


> Проверила бы на практике, если бы знала способ как "переадресоваться"
> Вызов SWBEMServices.Get("NewPath\NewSubPath",
> выдает ошибку "ну совсем у Вас путь не правильный" :)

ну вот, значит нельзя :)

> А как она называется ?

не помню, честно говоря, но такая служба есть.
+ проверь, чтобы был отключен "простой общий доступ к файлам" и пароль админа был не пустой.


 
Riply ©   (2006-12-18 00:41) [4]

>[3] Eraser ©   (17.12.06 15:01)
>ну вот, значит нельзя :)
Логика у тебя хромает :))
Это не означает, что нельзя. Это означает
только то, что я ничерта не понимаю в WMI :)
и предложенный способ "переадресации" никуда не годится :)
А со службами уже просто замучалась. Может и не в них дело ?


 
Eraser ©   (2006-12-18 00:50) [5]

> [4] Riply ©   (18.12.06 00:41)


> А со службами уже просто замучалась. Может и не в них дело
> ?

вполне может и не в них. в одном из своих проектов активно использую WMI для одной фитчи (по сети), пока что, слава Богу, жалоб на подобную ошибку не было. На другие были, на это нет :)


 
Riply ©   (2006-12-18 00:59) [6]

> [5] Eraser ©   (18.12.06 00:50)
А что ты указываешь в параметрах при подсоединении ?
Как должны выглядеть первые три ?


 
Eraser ©   (2006-12-18 01:26) [7]

     Service := SWbemLocator1.ConnectServer(FThreadConnection.PeerHost,
       "root\cimv2",
       s1,
       FPassword,
       "",
       "", 0, nil);

1. IP адрес или имя хоста.
2. нужная ветка.
3. имя пользователя и домен.


 
Riply ©   (2006-12-19 16:06) [8]

Что мне покупать: бубен или метлу ?
Пытаюсь подсоединиться к удаленной машине:
SWbemLocator.ConnectServer("Rescue", "Root\CIMV2", "Riply",
                          "Password", "", "", 0, nil);

Возвращает ошибку:
"raised exception class EOleException with message "The RPC server is unavailable"."
SWbemLocator.ConnectServer("Rescue", "Root\CIMV2", "HOME_GROUP\Riply",
                          "Password", "", "", 0, nil)
- аналогично.
В сети два компьютера. На обоих XP SP2. Все настройки "по умолчанию".
Никаких FireWall - ов ( кроме родного XP - шного )
Remote Procedure Call и Remote Procedure Call Locator и останавливала и запускала...
Так что посоветуете покупать ?


 
umbra ©   (2006-12-19 16:58) [9]

чтобы с помощью WMI управлять другой машиной, надо, чтобы на той машине сказали, что "разрешено удаленное управление"


 
Riply ©   (2006-12-19 17:11) [10]

>[9] umbra ©   (19.12.06 16:58)
Remote Assistance - разрешила, Connect remotely - тоже.
Что ему ( ненасытному ) еще надо ? :))


 
Riply ©   (2006-12-19 17:16) [11]

P.S. RemoteRegistry, NamedPipes (и анонимо и нет) - все проходит


 
umbra ©   (2006-12-19 17:24) [12]

а имя сервера - Rescue?


 
Eraser ©   (2006-12-19 17:28) [13]

> [9] umbra ©   (19.12.06 16:58)

неправду говорите.


 
umbra ©   (2006-12-19 19:06) [14]

2 Eraser ©   (19.12.06 17:28) [13]

возможно :)

2 Riply ©

а откуда берется параметр WbemLocator в Вашей процедуре?


 
Riply ©   (2006-12-20 00:45) [15]

>  [14] umbra ©   (19.12.06 19:06)
TSWbemLocator - из WbemScripting_TLB
SWbemLocator:= TSWbemLocator.Create(nil);
try
........
"Rescue" - имя удаленного компьютера
"Riply" - имя пользователя ( администратора ) на уд. к.


 
Riply ©   (2006-12-20 11:20) [16]

И еще вопрос:
Если я правильно понимаю, при работе приведенного кода,
"события" это запросы, производимые по таймеру ?
const
wQueryCreate = "SELECT * FROM __InstanceCreationEvent WITHIN 1 WHERE TargetInstance ISA ""Win32_Process""";
...
begin
FLocator:= TSWbemLocator.Create(AOwner);
FService:= FLocator.ConnectServer(".", WMI_ROOT_CIMV2, "", "", "", "", 0, nil);

FSinkCreate := TSWbemSink.Create(AOwner);
FSinkCreate.OnObjectReady := ProcessCreated;
FService.ExecNotificationQueryAsync(FSinkCreate.DefaultInterface,
                                     wQueryCreate, "WQL", 0, nil, nil);
...

Если так, то почему это лучше, чем сравнение раз в секунду списков
процессов, полученых обычным путем ?


 
Amoeba ©   (2006-12-20 12:57) [17]

"WMI - практика применения в Delphi":
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=698



Страницы: 1 вся ветка

Текущий архив: 2007.01.07;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.057 c
2-1166371023
Com
2006-12-17 18:57
2007.01.07
dll


2-1166178990
Bullfrog
2006-12-15 13:36
2007.01.07
проблема с кодом программы


2-1166570104
Святослав
2006-12-20 02:15
2007.01.07
Базы данных и Delphi 2006


2-1166219308
antonn
2006-12-16 00:48
2007.01.07
TCheckBox, TRadioBox - caption


15-1166128677
Real
2006-12-14 23:37
2007.01.07
Аналоговые часы на десктопе