Namespace WMINamespace WMI PublicClass QueryInfoClass QueryInfo Public ServerName AsString="." Public NamespacePath AsString="root/cimv2" Public RelativePath AsString Public UserName AsString Public Password AsString End Class End Namespace
Query.vb
Namespace WMINamespace WMI PublicClass QueryClass Query PrivateSub New()SubNew() End Sub PrivateShared gQueryInfo AsNew QueryInfo PrivateShared gManagementPath As System.Management.ManagementPath PrivateShared gConnectionOptions As System.Management.ConnectionOptions PrivateShared gManagementScope As System.Management.ManagementScope PrivateShared gObjectGetOptions As System.Management.ObjectGetOptions PrivateShared gEnumerationOptions As System.Management.EnumerationOptions PublicSharedReadOnlyProperty QueryInfo()Property QueryInfo() As QueryInfo Get Return gQueryInfo EndGet End Property <System.ComponentModel.EditorBrowsable(ComponentModel.EditorBrowsableState.Never)> _ PublicSharedReadOnlyProperty ManagementPath()Property ManagementPath() As System.Management.ManagementPath Get Return gManagementPath EndGet End Property <System.ComponentModel.EditorBrowsable(ComponentModel.EditorBrowsableState.Never)> _ PublicSharedReadOnlyProperty ConnectionOptions()Property ConnectionOptions() As System.Management.ConnectionOptions Get Return gConnectionOptions EndGet End Property <System.ComponentModel.EditorBrowsable(ComponentModel.EditorBrowsableState.Never)> _ PublicSharedReadOnlyProperty ObjectGetOptions()Property ObjectGetOptions() As System.Management.ObjectGetOptions Get Return gObjectGetOptions EndGet End Property <System.ComponentModel.EditorBrowsable(ComponentModel.EditorBrowsableState.Never)> _ PublicSharedReadOnlyProperty EnumerationOptions()Property EnumerationOptions() As System.Management.EnumerationOptions Get Return gEnumerationOptions EndGet End Property SharedSub New()SubNew() gManagementPath =New System.Management.ManagementPath gConnectionOptions =New System.Management.ConnectionOptions gObjectGetOptions =New System.Management.ObjectGetOptions gEnumerationOptions =New System.Management.EnumerationOptions End Sub PrivateSharedSub Connect()Sub Connect() With gManagementPath .Server = gQueryInfo.ServerName .NamespacePath = gQueryInfo.NamespacePath .RelativePath = gQueryInfo.RelativePath EndWith If gQueryInfo.UserName IsNot NothingThen gQueryInfo.UserName = gQueryInfo.UserName.Trim If gQueryInfo.UserName =""Then QueryInfo.UserName =Nothing QueryInfo.Password =Nothing EndIf Else gQueryInfo.Password =Nothing EndIf With gConnectionOptions .Username = gQueryInfo.UserName .Password = gQueryInfo.Password EndWith If gManagementScope IsNot NothingThen gManagementScope =Nothing gManagementScope =New System.Management.ManagementScope(gManagementPath, gConnectionOptions) gManagementScope.Connect() End Sub PrivateSharedFunction Excute0()Function Excute0() As System.Management.ManagementObjectCollection Connect() Return (New System.Management.ManagementClass(gManagementScope, gManagementPath, gObjectGetOptions)).GetInstances End Function PrivateSharedFunction Excute1()Function Excute1(ByVal query AsString) As System.Management.ManagementObjectCollection Connect() Return (New System.Management.ManagementObjectSearcher(gManagementScope, New System.Management.ObjectQuery(query), gEnumerationOptions)).Get End Function PublicSharedFunction GetManagementObject()Function GetManagementObject(ByVal relativepath AsString) As System.Management.ManagementObject QueryInfo.RelativePath = relativepath Connect() ReturnNew System.Management.ManagementObject(gManagementScope, gManagementPath, gObjectGetOptions) End Function PublicSharedFunction GetManagementObjectCollection()Function GetManagementObjectCollection(ByVal ClassOrSelectString AsString) As System.Management.ManagementObjectCollection Dim tmp As Management.ManagementObjectCollection =Nothing ClassOrSelectString = ClassOrSelectString.Trim.ToUpper If ClassOrSelectString.StartsWith("SELECT") Then tmp = Excute1(ClassOrSelectString) Else QueryInfo.RelativePath = ClassOrSelectString tmp = Excute0() EndIf Return tmp End Function <System.ComponentModel.EditorBrowsable(ComponentModel.EditorBrowsableState.Never)> _ PublicSharedSub MoveNext()Sub MoveNext(ByVal mgmtObjectCollection As System.Management.ManagementObjectCollection, ByVal action As Action(Of System.Management.ManagementObject)) MoveNext(Of System.Management.ManagementObject)(mgmtObjectCollection.GetEnumerator, action) End Sub <System.ComponentModel.EditorBrowsable(ComponentModel.EditorBrowsableState.Never)> _ PublicSharedSub MoveNext()Sub MoveNext(ByVal mgmtObject As System.Management.ManagementObject, ByVal action As Action(Of System.Management.PropertyData)) MoveNext(Of System.Management.PropertyData)(mgmtObject.Properties.GetEnumerator, action) End Sub <System.ComponentModel.EditorBrowsable(ComponentModel.EditorBrowsableState.Never)> _ PublicSharedSub MoveNext()Sub MoveNext(Of T)(ByVal enumerator As IEnumerator, ByVal action As Action(Of T)) If (enumerator IsNothing) Then ThrowNew ArgumentNullException("enumerator") EndIf If (action IsNothing) Then ThrowNew ArgumentNullException("action") EndIf While enumerator.MoveNext action.Invoke(CType(enumerator.Current, T)) EndWhile End Sub End Class End Namespace
Delegate.vb
Namespace WMINamespace WMI PublicDelegateSub GetCurentManagementObjectHandler()Sub GetCurentManagementObjectHandler(ByVal e As System.Management.ManagementObject) PublicDelegateSub GetCurentPropertyDataHandler()Sub GetCurentPropertyDataHandler(ByVal e As System.Management.PropertyData) End Namespace
SimpleQuery.vb
Namespace WMINamespace WMI PublicClass SimpleQueryClass SimpleQuery PublicSharedEvent CurrentManagementObject As GetCurentManagementObjectHandler PublicSharedEvent CurrentPropertyData As GetCurentPropertyDataHandler PrivateSub New()SubNew() End Sub SharedSub New()SubNew() End Sub PublicSharedWriteOnlyProperty ServerName()Property ServerName() AsString Set(ByVal value AsString) Query.QueryInfo.ServerName = value EndSet End Property PublicSharedWriteOnlyProperty UserName()Property UserName() AsString Set(ByVal value AsString) Query.QueryInfo.UserName = value EndSet End Property PublicSharedWriteOnlyProperty Password()Property Password() AsString Set(ByVal value AsString) Query.QueryInfo.Password = value EndSet End Property PublicSharedWriteOnlyProperty EnumerateDeep()Property EnumerateDeep() AsBoolean Set(ByVal value AsBoolean) Query.EnumerationOptions.EnumerateDeep = value EndSet End Property PublicSharedSub Excute()Sub Excute(ByVal mgmtSql AsString) If mgmtSql IsNothingThen mgmtSql ="" If mgmtSql.IndexOf("."c) <>-1Then OutPutManageMentObject(Query.GetManagementObject(mgmtSql)) Else Query.MoveNext(Query.GetManagementObjectCollection(mgmtSql), AddressOf OutPutManageMentObject) EndIf End Sub PrivateSharedSub OutPutManageMentObject()Sub OutPutManageMentObject(ByVal e As System.Management.ManagementObject) RaiseEvent CurrentManagementObject(e) Query.MoveNext(e, AddressOf OutPutPropertyData) End Sub PrivateSharedSub OutPutPropertyData()Sub OutPutPropertyData(ByVal e As System.Management.PropertyData) RaiseEvent CurrentPropertyData(e) End Sub End Class End Namespace
WMIClass.vb
Namespace WMINamespace WMI PublicClass WMIClassClass WMIClass PrivateSub New()SubNew() End Sub PrivateShared gAll(-1) AsString PrivateShared gIndex AsInteger=0 PublicSharedReadOnlyProperty All()Property All() AsString() Get Return gAll EndGet End Property SharedSub New()SubNew() Dim tmpRoot AsNew System.Management.ManagementClass() Dim tmpOptions AsNew System.Management.EnumerationOptions() tmpOptions.EnumerateDeep =True Dim tmpObjects As System.Management.ManagementObjectCollection = tmpRoot.GetSubclasses(tmpOptions) ReDim gAll(tmpObjects.Count -1) Using tmpObjects Query.MoveNext(Of Management.ManagementObject)(tmpObjects.GetEnumerator, AddressOf GetAllClass) End Using Array.Sort(gAll) tmpOptions =Nothing tmpRoot =Nothing End Sub PrivateSharedSub GetAllClass()Sub GetAllClass(ByVal obj As System.Management.ManagementObject) gAll(gIndex) = obj("__Class").ToString gIndex +=1 End Sub End Class End Namespace
<Serializable()> _ PublicClass PropertyDataInfoClass PropertyDataInfo Private gName AsString Private gValue AsString Private gIsArray AsBoolean=False Private gStatus AsBoolean=True Sub New()SubNew() End Sub PublicSub GetData()Sub GetData(ByVal obj As Management.PropertyData) With obj gName = .Name gIsArray = .IsArray gStatus =True Try If gIsArray Then gValue =String.Join(",", CType(obj.Value, String())) Else gValue = obj.Value.ToString EndIf Catch ex As Exception gValue ="" gStatus =False EndTry EndWith End Sub PublicProperty Name()Property Name() AsString Get Return gName EndGet Set(ByVal value AsString) gName = value EndSet End Property PublicProperty Value()Property Value() AsString Get Return gValue EndGet Set(ByVal value AsString) gValue = value EndSet End Property PublicProperty IsArray()PropertyIsArray() AsBoolean Get Return gIsArray EndGet Set(ByVal value AsBoolean) gIsArray = value EndSet End Property PublicProperty Status()Property Status() AsBoolean Get Return gStatus EndGet Set(ByVal value AsBoolean) gStatus = value EndSet End Property PublicSub Clear()Sub Clear() gName =Nothing gValue =Nothing gIsArray =False gStatus =True End Sub PublicShadowsFunction ToString()Function ToString() AsString ReturnString.Format("属性:{0},值:{1},数组:{2},状态:{3}", gName, gValue, gIsArray, gStatus) End Function End Class
上面状态为False时表示无法读取该属性值。数组为True表示该属性的值类型是一数组。
使用时的大概代码是这样的:
PublicClass Form1Class Form1 Dim mItem AsNew PropertyDataInfo PrivateDelegateSub SetTextCallback()Sub SetTextCallback(ByVal [text] AsString) PrivateSub SetLoadingLableText()Sub SetLoadingLableText(ByVal [text] AsString) Me.ListBox1.Items.Add([text]) End Sub PrivateSub ListBoxItemAdd()Sub ListBoxItemAdd(ByVal message AsString) IfMe.ListBox1.InvokeRequired Then Dim d AsNew SetTextCallback(AddressOf SetLoadingLableText) Me.Invoke(d, NewObject() {message}) Else SetLoadingLableText(message) EndIf Application.DoEvents() End Sub PrivateSub ButtonClear_Click()Sub ButtonClear_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonClear.Click ListBox1.Items.Clear() End Sub PrivateSub ButtonQuery_Click()Sub ButtonQuery_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonQuery.Click Start() End Sub PrivateSub Start()Sub Start() ListBoxItemAdd(String.Format("Begin AT {0}", Now.ToString)) ListBoxItemAdd("") LzmTW.WMI.SimpleQuery.ServerName =Me.TextBoxServerName.Text LzmTW.WMI.SimpleQuery.UserName =Me.TextBoxUserName.Text LzmTW.WMI.SimpleQuery.Password =Me.TextBoxPassword.Text LzmTW.WMI.SimpleQuery.EnumerateDeep =Me.CheckBoxEnumerateDeep.Checked Try LzmTW.WMI.SimpleQuery.Excute(Me.ComboBoxSelect.Text) Catch ex As Exception ListBoxItemAdd(String.Format("Error! Msg:{0}", ex.Message)) EndTry ListBoxItemAdd("") ListBoxItemAdd(String.Format("End AT {0}", Now.ToString)) End Sub PrivateSub GetCurentManagementObject()Sub GetCurentManagementObject(ByVal e As System.Management.ManagementObject) ListBoxItemAdd("") ListBoxItemAdd(e.ToString) mItem.Clear() End Sub PrivateSub GetCurentPropertyData()Sub GetCurentPropertyData(ByVal e As System.Management.PropertyData) mItem.GetData(e) ListBoxItemAdd(mItem.ToString) End Sub PrivateSub Form1_Load()Sub Form1_Load(ByVal sender AsObject, ByVal e As System.EventArgs) HandlesMe.Load AddHandler LzmTW.WMI.SimpleQuery.CurrentManagementObject, AddressOf GetCurentManagementObject AddHandler LzmTW.WMI.SimpleQuery.CurrentPropertyData, AddressOf GetCurentPropertyData Me.ComboBoxSelect.DataSource = LzmTW.WMI.WMIClass.All End Sub PrivateSub ListBox1_SelectedIndexChanged()Sub ListBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListBox1.SelectedIndexChanged If ListBox1.SelectedItem IsNothingThenExit Sub Clipboard.SetDataObject(ListBox1.SelectedItem, False) End Sub End Class