Форум: "Начинающим";
Текущий архив: 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.01 c