PDA

View Full Version : بحث در مورد (WQL(WMI Query Language



sepehr.net
سه شنبه 28 آبان 1387, 17:57 عصر
سلام
من چند وقتی هست که با WQL اشنا شدم. ولی هنوز نکات زیادی هست که اونها رو نمیدونم
برای همین این تاپیک رو ایجاد کردم تا دوستانی که اطلاعاتی در این زمینه دارند اون ها رو در اختیار بقیه ی دوستان هم قرار بدهند:چشمک:

sepehr.net
سه شنبه 28 آبان 1387, 18:39 عصر
برای اینکه دوستان بیشتر از (WMI Query Language) یا WQL بدونند و مشتاق به یادگیری این مبحث بشوند کمی در مورد آن توضیح میدم
WQL همانند SQL یک زبان اسکریپتی است. به وسیله ی این زبان ما میتونیم از سیستم عامل پرس و جو بکنیم
مثلا میتونیم مشخصات یک سخت افزار خاصی رو درخواست کنیم و جواب اون رو مشاهده کنیم.
نحوه ی نوشتن کوئری با این زبان شباهت خیلی زیادی با زبان SQL دارد.
مثلا دستور

SELECT * FROM Win32_DisplayConfiguration
یک پرس و جو از Win32_DisplayConfiguration انجام میده که مربوط به سخت افزار کارت گرافیکه.
(اینکه Win32_DisplayConfiguration چی هست رو خود من هم نمیدونم اگه کسی اطلاعات بیشتری داره خوشحال میشیم که در اختیار بقیه دوستان هم قرار بده)
ما میتونیم به وسیله ی این دستور نام کارت گرافیک یا مشخصات مربوط به اون رو مشاهده کنیم.

sepehr.net
سه شنبه 28 آبان 1387, 18:55 عصر
برای اینکه بتونیم از این زبان در ویژوال بیسیک استفاده کنیم احتیاج به رفرنس System.Management داریم
در ابتد این رفرنس رو به برنامه اضافه میکنیم و سپس همین رفرنس رو Import میکنیم

Imports System.Management
پس از این کار باید یک متغیری از ManagementObject تعریف کنیم

Dim ObjMng As New Management.ManagementObject
دقیقا نمیدونم اگه اشتباه میگم دوستان اصلاح کنند
فکر کنم این ManagementObject شامل تمامی اطلاعاتی هست که ما میخواهیم از اونها پرس و جو کنیم چون ما در یک حلقه ی For Each از اون استفاده میکنیم و پرس جو رو در اون انجام میدیم.
پس از این کار حالا نوبت به این میرسه که یک شیئ از ManagementObjectSearcher بسازیم و در اون دستورات WQL رو قرار بدیم و پرس جو رو شروع کنیم

Dim MngObjSrch As New Management.ManagementObjectSearcher("SELECT * FROM Win32_DisplayConfiguration")
نتیجه ی این پرس جو در یک حلقه ی ForEach مشخص میشه

Dim DisplayName As String
For Each ObjMng In MngObjSrch.Get
DisplayName = ObjMng("DeviceName").ToString
Next
MsgBox(DisplayName)
این روش استفاده از دستورات WQL در زبان VB.NET بود.
این کلاس و این زبان کارایی بسیار بهتر و بیشتری از آن چه که گفته شد دارند. امیدوارم در این تاپیک به بسیاری از آنها اشاره بشه

sepehr.net
چهارشنبه 29 آبان 1387, 08:42 صبح
این هم یک سایت خوب که لیست تمامی متد ها و پارامتر های WQL رو گذاشته
http://www.yogageneration.com/~mvkazit/demo/WQLAnalyzer/meta_data_html/index.html

rooshan2008
چهارشنبه 29 آبان 1387, 22:59 عصر
با سلام
من چند وقت پیش با این امکان پی بردم و تا اینجا دست گیرم شد که با Wql بصورت دستورات Sql می تونیت از سیستم عامل پرسجوکنید( البته درباره منابع سیستم خودتون)
همین کاری که خود سیستم عامل انجام میده. این امکانات بسیار کاربردی و خیلی جالبه بطوری که با داشتن کلاس و دستور مورد نظر می تونید تمام امکانات سیستمتون رو بصورت خیلی راحت بدون استفاده از Api و کارهای دیگه به این امکانات دسترسی داشته باشد.

مثلاً این دستور زیر:



Dim Obj As New System.Management.ManagementObjectSearcher("SELECT * FROM Win32_OperatingSystem")


این دستور مشخصات سیستم عاملتون رو با جزئیات بر می گردونه..



For Each Wql In Obj.Get

Msgbox (Wql.GetText(TextFormat.Mof)

Next

درواقعه دستور( Wql.GetText(TextFormat.Mof دستور متن زیر رو به ما بر می گردونه:


instance of Win32_OperatingSystem
{
BootDevice = "\\Device\\HarddiskVolume1 (file://\\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 (file://\\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 :



Private Function Extra(ByVal obj As String) As String

Dim pBegin As Integer

Try

pBegin = InStr(pBegin + 1, obj, "=")
Return Trim(Mid(obj, 2, pBegin - 2))
Catch ex As Exception
Return Nothing

End Try

End Function


Private Function GetProperties(ByVal obj As String) As List(Of String)
Dim List As New List(Of String)
Dim s As String

Dim pBegin, pEnd, pTemp As Integer

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))
If Not (s) = "" Then

List.Add(Trim(s))
End If

End While

End If

Return List
End Function



حالا برای اینکه یک مثال بزنیم یه فرم باز کنید و توش یک TreeView و یک دکمه بزارید :
این برنامه دستور رو اجرا و نتیجه رو داخل treeview نمایش میده...





Private Function Extra(ByVal obj As String) As String

Dim pBegin As Integer

Try

pBegin = InStr(pBegin + 1, obj, "=")
Return Trim(Mid(obj, 2, pBegin - 2))
Catch ex As Exception
Return Nothing

End Try

End Function

Private Function GetProperties(ByVal obj As String) As List(Of String)
Dim List As New List(Of String)
Dim s As String

Dim pBegin, pEnd, pTemp As Integer

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)
If Not (s) = "" Then

List.Add((s))
End If

End While

End If

Return List
End Function

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim objTv As TreeNode
Dim Result As List(Of String)
Dim Obj As New System.Management.ManagementObjectSearcher("SELECT * FROM CIM_LogicalDisk ")
For Each Wql In Obj.Get
Try

If IsNothing(Result) Then

Result = GetProperties(Wql.GetText(TextFormat.Mof))
End If

For Each s In Result
My.Application.DoEvents()
objTv = Tv1.Nodes.Add(s)
objTv.Nodes.Add(Wql(s).ToString)
Next

Catch ex As Exception
End Try

Next

End Sub


به کدی که توش select هست توجه کنید درست مثل sql ولی بجای جدول نام دستور رو نوشتیم شما می تونید این دستور رو عوض کنید لیستی از این دستورات رو می تونید از سایتی که دوستمون در قسمت بالا لینکش رو گزاشتن پیدا کنید حتی شما می تونید از دستور where هم استفاده کنید.
البته این چیزی بود که من بلد بودم و روش های زیادی وجود داره تا property ها رو بدست بیارید ولی همون طور گفتم من قبلاً با این کد با جزئیات دست پیدا کردم.

یکی از کاربد های Wmi این که شما می تونید کلاسی بنویسید که درباره کارت گرافیک و یا هر اجزای سیستمتون تا مشخصات اون رو بدست بیاره .
این لینک رو ببینید:
http://www.freevbcode.com/ShowCode.asp?ID=4571
البته اگه جایی رو اشتباه کردم به بزرگواریتون ببخشید

vcldeveloper
پنج شنبه 30 آبان 1387, 00:53 صبح
من چند وقت پیش با این امکان پی بردم و تا اینجا دست گیرم شد که با Wql بصورت دستورات Sql می تونیت از سیستم عامل پرسجوکنید( البته درباره منابع سیستم خودتون)
نه، WMI یک ابزار مدیریتی ویندوز هست، شما با استفاده از WMI می تونید (در صورت داشتند مجوزهای لازم)، نه تنها اطلاعات مختلفی از پیکربندی سخت افزار و نرم افزار سیستم خودتان بدست بیارید، بلکه می توانید به کمک آن به اطلاعات سایر سیستم های موجود در شبکه خود هم دسترسی داشته باشید. علاوه بر آن،WMI صرفا یک ابزار اطلاع رسانی نیست، بلکه می توانید با آن اعمال مدیریت هم بکنید، فرضا برخی تنظیمات سیستم را تغییر بدهید.

Sub Zero
پنج شنبه 30 آبان 1387, 07:29 صبح
در سایت ماکروسافت هم ابزاری با نام WMI Code Creator (http://www.microsoft.com/downloads/details.aspx?familyid=2cc30a64-ea15-4661-8da4-55bbc145c30e&displaylang=en) قرار داده شده که قابلیت ایجاد کوئری های مختلف برای دریافت اطلاعات از سیستم عامل رو داراست . این ابزار توانایی ایجاد کوئریها در قالب VB.Net,C#,VBScript رو داره .

sepehr.net
یک شنبه 03 آذر 1387, 10:24 صبح
سلام
این هم یک نرم افزار خوب برای کار با WQL همراه با سورس:چشمک:

sepehr.net
پنج شنبه 07 آذر 1387, 10:19 صبح
کتابی کامل و خوب در این زمینه
http://www1.vista-server.com/uploadfile/6/4/2/2362221748.zip

sepehr.net
پنج شنبه 07 آذر 1387, 10:38 صبح
اگر دوستان لطف کنند کاربرد هایی که WMI میتونه برای ما و برنامه هایمان داشته باشه رو بگن ممنون میشیم

sepehr.net
پنج شنبه 07 آذر 1387, 21:23 عصر
این هم یک نرم افزار کامل و خیلی خوب برای کار با WMI پیشنهاد میکنم حتما دانلود کنید :چشمک:

saed2006
سه شنبه 09 آذر 1389, 19:50 عصر
چجوری میشه تعداد bad sector های هارد رو بیرون اورد؟

Alghoochi
چهارشنبه 10 آذر 1389, 15:15 عصر
این برنامه کدباز رو هم از من داشته باشید. تمامی ویژگی های سخت افزارها رو بیرون میاره.

http://www.codeproject.com/KB/system/GetHardwareInformation.aspx