![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Несколько вопросов по WMI.
Riply © (2006-12-17 02:47:00)Здравствуйте !
В свете последней моды и утверждений "некоторые вещи досупны только через 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'."
Как это можно исправить ?
Amoeba (2006-12-20 12:57:00) [1]"WMI - практика применения в Delphi":
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=698
Riply (2006-12-20 11:20:00) [2]И еще вопрос:
Если я правильно понимаю, при работе приведенного кода,
"события" это запросы, производимые по таймеру ?
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);
...
Если так, то почему это лучше, чем сравнение раз в секунду списков
процессов, полученых обычным путем ?
Riply (2006-12-20 00:45:00) [3]> [14] umbra © (19.12.06 19:06)
TSWbemLocator - из WbemScripting_TLB
SWbemLocator:= TSWbemLocator.Create(nil);
try
........
'Rescue' - имя удаленного компьютера
'Riply' - имя пользователя ( администратора ) на уд. к.
umbra (2006-12-19 19:06:00) [4]2 Eraser © (19.12.06 17:28) [13]
возможно :)
2 Riply ©
а откуда берется параметр WbemLocator в Вашей процедуре?
Eraser (2006-12-19 17:28:00) [5]> [9] umbra © (19.12.06 16:58)
неправду говорите.
umbra (2006-12-19 17:24:00) [6]а имя сервера - Rescue?
Riply (2006-12-19 17:16:00) [7]P.S. RemoteRegistry, NamedPipes (и анонимо и нет) - все проходит
Riply (2006-12-19 17:11:00) [8]>[9] umbra © (19.12.06 16:58)
Remote Assistance - разрешила, Connect remotely - тоже.
Что ему ( ненасытному ) еще надо ? :))
umbra (2006-12-19 16:58:00) [9]чтобы с помощью WMI управлять другой машиной, надо, чтобы на той машине сказали, что "разрешено удаленное управление"
Riply (2006-12-19 16:06:00) [10]Что мне покупать: бубен или метлу ?
Пытаюсь подсоединиться к удаленной машине:
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 и останавливала и запускала...
Так что посоветуете покупать ?
Eraser (2006-12-18 01:26:00) [11]
Service := SWbemLocator1.ConnectServer(FThreadConnection.PeerHost,
'root\cimv2',
s1,
FPassword,
'',
'', 0, nil);
1. IP адрес или имя хоста.
2. нужная ветка.
3. имя пользователя и домен.
Riply (2006-12-18 00:59:00) [12]> [5] Eraser © (18.12.06 00:50)
А что ты указываешь в параметрах при подсоединении ?
Как должны выглядеть первые три ?
Eraser (2006-12-18 00:50:00) [13]> [4] Riply © (18.12.06 00:41)
> А со службами уже просто замучалась. Может и не в них дело
> ?
вполне может и не в них. в одном из своих проектов активно использую WMI для одной фитчи (по сети), пока что, слава Богу, жалоб на подобную ошибку не было. На другие были, на это нет :)
Riply (2006-12-18 00:41:00) [14]>[3] Eraser © (17.12.06 15:01)
>ну вот, значит нельзя :)
Логика у тебя хромает :))
Это не означает, что нельзя. Это означает
только то, что я ничерта не понимаю в WMI :)
и предложенный способ "переадресации" никуда не годится :)
А со службами уже просто замучалась. Может и не в них дело ?
Eraser (2006-12-17 15:01:00) [15]> [2] Riply © (17.12.06 03:15)
> Проверила бы на практике, если бы знала способ как "переадресоваться"
> Вызов SWBEMServices.Get('NewPath\NewSubPath',
> выдает ошибку "ну совсем у Вас путь не правильный" :)
ну вот, значит нельзя :)
> А как она называется ?
не помню, честно говоря, но такая служба есть.
+ проверь, чтобы был отключен "простой общий доступ к файлам" и пароль админа был не пустой.
Riply (2006-12-17 03:15:00) [16]>[1] Eraser © (17.12.06 02:59)
Спасибо.
По поводу "когда переменная выходит из зоны видимости - она автоматически освобождается"
прямо камень с души :)
> можно один раз подсоединиться,
> а потом каким-то образом "переадресоваться" ?
>практика - критерий истины :)
Проверила бы на практике, если бы знала способ как "переадресоваться"
Вызов SWBEMServices.Get('NewPath\NewSubPath',
выдает ошибку "ну совсем у Вас путь не правильный" :)
>запустив соответствующую службу на удаленной машине
А как она называется ?
Я уже эксперементировала с Remote Procedure Call и Remote Procedure Call Locator
не помогает :(
Eraser (2006-12-17 02:59:00) [17]> [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 доступно.