>************************************************************** >* Marco Plaza, 2018,2021 >* @nfoxDev >* https://github.com/nftools/wmiquery >************************************************************** >* >* WMI Query Tool : returns an object with item count & items array from wmiquery >* >* simple usage: wmiQuery( wmiQuery [, wmiClass] ) >* ( wmiclass defaults to "CIMV2" ) >* >* Returns: Object as #oWmiResult >* >*#oWmiResult: >* .count = "i" >* .items[] >* -item = "v" >* >* sample procedure "testme" included below >***************************************************************** >Parameters wmiClass,wmiNameSpace > >Private All > >wmiClass = Evl(m.wmiClass,'') >wmiNameSpace = Evl(m.wmiNameSpace,'CIMV2') > >emessage = '' > >#If Version(5) > 7 > #Define EMPTYORLINE 'empty' >#Else > #Define EMPTYORLINE 'line' >#Endif > > >Try > objwmiservice = Getobject("winmgmts://./root/"+m.wmiNameSpace) > oquery = objwmiservice.execquery( 'SELECT * FROM '+m.wmiClass,,48) > owmi = processobject( m.oquery ) >Catch To oerr > emessage = m.oerr.Message >Endtry > >If !Empty(m.emessage) > Error ' Invalid WMI Class or NameSpace ' > Return .Null. >Else > Return m.owmi >Endif > >*------------------------------------------------- >Procedure processobject( oquery ) >*------------------------------------------------- >Private All > >owmi = Createobject(EMPTYORLINE) >AddProperty(owmi,'items(1)',.Null.) >nitem = 0 > >Try > > For Each oitem In m.oquery > > nitem = m.nitem + 1 > Dimension owmi.items(m.nitem) > owmi.items(m.nitem) = Createobject(EMPTYORLINE) > setproperties( m.oitem, owmi.items(m.nitem) ) > > Endfor > >Catch > >Endtry > >AddProperty(owmi,'count',m.nitem) > >Return m.owmi > >*-------------------------------------------------------- >Procedure setproperties( oitem , otarget ) >*-------------------------------------------------------- >Private All > >For Each property In m.oitem.properties_ > Try > Do Case > Case Vartype( m.property.Value ) = 'O' > thisproperty = Createobject(EMPTYORLINE) > setproperties(m.property.Value, m.thisproperty ) > AddProperty( otarget ,m.property.Name,m.thisproperty) > > Case m.property.isarray > > AddProperty( otarget ,property.Name+'(1)',.Null.) > thisarray = 'otarget.'+m.property.Name > > nitem = 0 > > If !Isnull(m.property.Value) > > For Each Item In m.property.Value > > nitem = m.nitem+1 > Dimension &thisarray(m.nitem) > > If Vartype( m.item) = 'O' > thisitem = Createobject(EMPTYORLINE) > setproperties( m.item, m.thisitem ) > &thisarray(m.nitem) = m.thisitem > Else > &thisarray(m.nitem) = m.item > Endif > > Endfor > > Endif > > Otherwise > Try > AddProperty( otarget ,m.property.Name,m.property.Value) > Catch > newName = property.Name+'_' > AddProperty( otarget ,m.newName,m.property.Value) > Endtry > > Endcase > > Catch To oerr > Messagebox( Textmerge('<<oerr.lineno>> <<oerr.message>> '),0) > Exit > Endtry >Endfor > >*---------------------------------- >Procedure testme >*---------------------------------- >Public oinfo > >oinfo = Create(EMPTYORLINE) > >Wait 'Running WMI Query....please wait.. ' Window Nowait At Wrows()/2,Wcols()/2 > > >AddProperty( oinfo, "monitors" , wmiquery('Win32_PNPEntity where service = "monitor"') ) >AddProperty( oinfo, "diskdrive" , wmiquery('Win32_diskDrive') ) >AddProperty( oinfo, "startup" , wmiquery('Win32_startupCommand')) >AddProperty( oinfo, "BaseBoard" , wmiquery('Win32_baseBoard') ) >AddProperty( oinfo, "netAdaptersConfig", wmiquery('Win32_NetworkAdapterConfiguration') ) > > >Messagebox( 'Please explore "oInfo" in debugger watch window or command line ',0) > > > >*--------------------------------------------------------------------------------- >Procedure testme_ >* note: >* this code uses underscore ( _.prg ) as replacement for addproperty() >* available at https://raw.githubusercontent.com/nftools/underscore/master/_.prg >* the "addobject" version is below ( function testme_no_ ) >*--------------------------------------------------------------------------------- >Public oinfo > >oinfo = Create(EMPTYORLINE) > >Wait 'Running WMI Query....please wait.. ' Window Nowait At Wrows()/2,Wcols()/2 > > >With _( m.oinfo ) > .monitors = wmiquery('Win32_PNPEntity where service = "monitor"') > .diskdrive = wmiquery('Win32_diskDrive') > .startup = wmiquery('Win32_startupCommand') > .BaseBoard = wmiquery('Win32_baseBoard') > .netAdaptersConfig = wmiquery('Win32_NetworkAdapterConfiguration') >Endwith > > >Messagebox( 'Please explore "oInfo" in debugger watch window or command line ',0) > >