با سلام
من چند وقت پیش با این امکان پی بردم و تا اینجا دست گیرم شد که با Wql بصورت دستورات Sql می تونیت از سیستم عامل پرسجوکنید( البته درباره منابع سیستم خودتون)
همین کاری که خود سیستم عامل انجام میده. این امکانات بسیار کاربردی و خیلی جالبه بطوری که با داشتن کلاس و دستور مورد نظر می تونید تمام امکانات سیستمتون رو بصورت خیلی راحت بدون استفاده از Api و کارهای دیگه به این امکانات دسترسی داشته باشد.
مثلاً این دستور زیر:
Dim Obj AsNew System.Management.ManagementObjectSearcher("SELECT * FROM Win32_OperatingSystem")
این دستور مشخصات سیستم عاملتون رو با جزئیات بر می گردونه..
ForEach Wql In Obj.Get
Msgbox (Wql.GetText(TextFormat.Mof)
Next
درواقعه دستور( Wql.GetText(TextFormat.Mof دستور متن زیر رو به ما بر می گردونه:
instance of Win32_OperatingSystem
{
BootDevice = "
\\Device\\HarddiskVolume1";
BuildNumber = "2600";
BuildType = "Uniprocessor Free";
Caption = "Microsoft Windows XP Professional";
CodeSet = "1256";
CountryCode = "981";
CreationClassName = "Win32_OperatingSystem";
CSCreationClassName = "Win32_ComputerSystem";
CSDVersion = "Service Pack 2";
CSName = "ROSHANFEKR";
CurrentTimeZone = 210;
DataExecutionPrevention_32BitApplications = TRUE;
DataExecutionPrevention_Available = TRUE;
DataExecutionPrevention_Drivers = TRUE;
DataExecutionPrevention_SupportPolicy = 2;
Debug = FALSE;
Description = "";
Distributed = FALSE;
EncryptionLevel = 168;
ForegroundApplicationBoost = 2;
FreePhysicalMemory = "339300";
FreeSpaceInPagingFiles = "1833016";
FreeVirtualMemory = "2054716";
InstallDate = "20050507185405.000000+210";
LargeSystemCache = 0;
LastBootUpTime = "20081119204219.500000+210";
LocalDateTime = "20081119220201.875000+210";
Locale = "0429";
Manufacturer = "Microsoft Corporation";
MaxNumberOfProcesses = 4294967295;
MaxProcessMemorySize = "2097024";
Name = "Microsoft Windows XP Professional|C:\\WINDOWS|\\Device\\Harddisk0\\Part ition1";
NumberOfProcesses = 37;
NumberOfUsers = 2;
Organization = "";
OSLanguage = 1033;
OSType = 18;
Primary = TRUE;
ProductType = 1;
QuantumLength = 0;
QuantumType = 0;
RegisteredUser = "Roshan.2008";
SerialNumber = "55274-640-5150253-23868";
ServicePackMajorVersion = 2;
ServicePackMinorVersion = 0;
SizeStoredInPagingFiles = "2369640";
Status = "OK";
SuiteMask = 272;
SystemDevice = "
\\Device\\HarddiskVolume1";
SystemDirectory = "C:\\WINDOWS\\system32";
SystemDrive = "C:";
TotalVirtualMemorySize = "2097024";
TotalVisibleMemorySize = "981424";
Version = "5.1.2600";
WindowsDirectory = "C:\\WINDOWS";
};
این متن همون مشخصات سیستم عامل هست که شما صادر کردید اگه بخواهید به مشخصات اون به صورت تک تک اجزا بپردازید باید در قسمت
Wql("نام ").ToString
مثلاً از نوشته بالا Caption رو به جای نام بزارید.
یا WindowsDirectory رو به جای نام بزارید
من قبلاً یک تابع نوشته بودم که تمام properties منربوط بر هر دستور اجراشده رو بر می گردوند به صورتی List of string :
PrivateFunction Extra(ByVal obj AsString) AsString
Dim pBegin AsInteger
Try
pBegin = InStr(pBegin + 1, obj,
"=")
Return Trim(Mid(obj, 2, pBegin - 2))
Catch ex As Exception
ReturnNothing
EndTry
EndFunction
PrivateFunction GetProperties(ByVal obj AsString) As List(OfString)
Dim List AsNew List(OfString)
Dim s AsString
Dim pBegin, pEnd, pTemp AsInteger
obj = Replace(obj, vbTab,
"", 1) 'Remove tab Key
pBegin = InStr(obj,
"{") 'search for Begin oF Text
pEnd = InStr(obj,
"}") 'End of Text
If pBegin > 0 Then
While pBegin < pEnd - 1 And pBegin <> 0
pTemp = pBegin
pBegin = InStr(pBegin + 1, obj, ";")
s = Mid(obj, pTemp + 1, (pBegin - pTemp) - 1)
s = LTrim(Extra(s))
IfNot (s) = ""Then
List.Add(Trim(s))
End If
End While
EndIf
Return List
EndFunction
حالا برای اینکه یک مثال بزنیم یه فرم باز کنید و توش یک TreeView و یک دکمه بزارید :
این برنامه دستور رو اجرا و نتیجه رو داخل treeview نمایش میده...
PrivateFunction Extra(ByVal obj AsString) AsString
Dim pBegin AsInteger
Try
pBegin = InStr(pBegin + 1, obj,
"=")
Return Trim(Mid(obj, 2, pBegin - 2))
Catch ex As Exception
ReturnNothing
EndTry
EndFunction
PrivateFunction GetProperties(ByVal obj AsString) As List(OfString)
Dim List AsNew List(OfString)
Dim s AsString
Dim pBegin, pEnd, pTemp AsInteger
obj = Replace(obj, vbTab,
"", 1) 'Remove tab Key
pBegin = InStr(obj,
"{") 'search for Begin oF Text
pEnd = InStr(obj,
"}") 'End of Text
If pBegin > 0 Then
While pBegin < pEnd - 1 And pBegin <> 0
pTemp = pBegin
pBegin = InStr(pBegin + 1, obj, ";")
s = Mid(obj, pTemp + 1, (pBegin - pTemp) - 1)
s = Extra(s)
IfNot (s) = ""Then
List.Add((s))
EndIf
EndWhile
EndIf
Return List
EndFunction
PrivateSub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim objTv As TreeNode
Dim Result As List(OfString)
Dim Obj AsNew System.Management.ManagementObjectSearcher("SELECT * FROM CIM_LogicalDisk ")
ForEach Wql In Obj.Get
Try
If IsNothing(Result) Then
Result = GetProperties(Wql.GetText(TextFormat.Mof))
EndIf
ForEach s In Result
My.Application.DoEvents()
objTv = Tv1.Nodes.Add(s)
objTv.Nodes.Add(Wql(s).ToString)
Next
Catch ex As Exception
EndTry
Next
EndSub
به کدی که توش select هست توجه کنید درست مثل sql ولی بجای جدول نام دستور رو نوشتیم شما می تونید این دستور رو عوض کنید لیستی از این دستورات رو می تونید از سایتی که دوستمون در قسمت بالا لینکش رو گزاشتن پیدا کنید حتی شما می تونید از دستور where هم استفاده کنید.
البته این چیزی بود که من بلد بودم و روش های زیادی وجود داره تا property ها رو بدست بیارید ولی همون طور گفتم من قبلاً با این کد با جزئیات دست پیدا کردم.
یکی از کاربد های Wmi این که شما می تونید کلاسی بنویسید که درباره کارت گرافیک و یا هر اجزای سیستمتون تا مشخصات اون رو بدست بیاره .
این لینک رو ببینید:
http://www.freevbcode.com/ShowCode.asp?ID=4571
البته اگه جایی رو اشتباه کردم به بزرگواریتون ببخشید