|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
WMI перебор значений
Добрый день ув. Программисты.
Имеется код: Код:
procedure GetWMI(wmi,par:string); var locator : ISWbemLocator; objectSet : ISWbemObjectSet; obj : ISWbemObject; sl,pl : TStringList; i,j:integer; wmiClass, selectList : string; propName : string; propValue : string; varProp : oleVariant; intVal : cardinal; varEnum : IEnumVariant; varObj : oleVariant; fetched : cardinal; begin locator := CoSWbemLocator.Create(); form1.services := locator.ConnectServer('.','root\cimv2','','','','',0,nil); locator := nil; sl := TStringList.Create; pl := TStringList.Create; sl.Values[wmi] := par; for i:=0 to sl.Count - 1 do begin wmiClass := sl.Names[i]; selectList := sl.ValueFromIndex[i]; pl.CommaText := selectList; objectSet :=Form1.services.ExecQuery('select '+ selectList + ' from ' + wmiClass,'WQL', wbemFlagReturnImmediately and wbemFlagForwardOnly,nil); varEnum := objectSet._NewEnum as IEnumVariant; varEnum.Next(1,varObj,fetched); obj := IUnknown(varObj) as ISWbemObject; for j := 0 to pl.count -1 do begin propName := pl[j]; varProp := obj.Properties_.Item(propName,0); if not varIsNull(varProp) then propValue := varToStr(varProp) else propValue := ''; form1.memo1.Lines.Add(propName+' | '+propValue); end; end; form1.memo1.Lines.Add('==========================='); sl.Free; pl.Free; end; Значения передаю так: Код:
procedure TForm1.Button9Click(Sender: TObject); begin GetWMI('Win32_Share','Caption, Name, Path'); end; Проблема в том что он выводит не все расшаренные папки. Если смотреть через консоль WMI то там их более 5и. В консоле WMI, первая папка это: Caption | Удаленный Admin Name | ADMIN$ Path | C:\Windows Эту первую папку он мне выводит в memo, а дальше никак. Перебор значений есть. но по чему то добавляет только одну( В чем причина? |
#2
|
|||
|
|||
Сам спросил.Сам отвечаю:
Код:
procedure GetWMI; var FSWbemLocator : OLEVariant; FWMIService : OLEVariant; FWbemObjectSet: OLEVariant; FWbemObject : OLEVariant; oEnum : IEnumvariant; iValue : LongWord; begin; FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator'); FWMIService := FSWbemLocator.ConnectServer('.', 'root\CIMV2', '', ''); FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_Share','WQL',$00000020); oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant; while oEnum.Next(1, FWbemObject, iValue) = 0 do begin Form1.memo2.lines.add(Format('Caption %s',[String(FWbemObject.Caption)]));// String Form1.memo2.lines.add(Format('Description %s',[String(FWbemObject.Description)]));// String Form1.memo2.lines.add(Format('Name %s',[String(FWbemObject.Name)]));// String Form1.memo2.lines.add(Format('Path %s',[String(FWbemObject.Path)]));// String Form1.memo2.lines.add('***'); FWbemObject:=Unassigned; end; end; procedure TForm1.Button9Click(Sender: TObject); begin try CoInitialize(nil); try GetWMI; finally CoUninitialize; end; except on E:EOleException do Form1.memo1.lines.add(Format('EOleException %s %x', [E.Message,E.ErrorCode])); on E:Exception do Form1.memo1.lines.add(E.Classname, ':', E.Message); end; end; |