>>************************************************************** >>* 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) >> >>whoops!