Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.01.07;
Скачать: [xml.tar.bz2];

Вниз

Несколько вопросов по 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.055 c
15-1166114616
Ricko
2006-12-14 19:43
2007.01.07
Ваши пожелания к клиенту этого форума


15-1166178034
Beavercrazy
2006-12-15 13:20
2007.01.07
Почему не грузятся некоторые картинки


2-1166528411
niko
2006-12-19 14:40
2007.01.07
Выгрузка dll


8-1147940602
Белый Орёл
2006-05-18 12:23
2007.01.07
Быстрая перемотка DVD


2-1165919107
koha
2006-12-12 13:25
2007.01.07
Удаление строки в ADOQuery через SQL - Немогу удалить





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский