سلام
من چند وقتی هست که با WQL اشنا شدم. ولی هنوز نکات زیادی هست که اونها رو نمیدونم
برای همین این تاپیک رو ایجاد کردم تا دوستانی که اطلاعاتی در این زمینه دارند اون ها رو در اختیار بقیه ی دوستان هم قرار بدهند:چشمک:
Printable View
سلام
من چند وقتی هست که با WQL اشنا شدم. ولی هنوز نکات زیادی هست که اونها رو نمیدونم
برای همین این تاپیک رو ایجاد کردم تا دوستانی که اطلاعاتی در این زمینه دارند اون ها رو در اختیار بقیه ی دوستان هم قرار بدهند:چشمک:
برای اینکه دوستان بیشتر از (WMI Query Language) یا WQL بدونند و مشتاق به یادگیری این مبحث بشوند کمی در مورد آن توضیح میدم
WQL همانند SQL یک زبان اسکریپتی است. به وسیله ی این زبان ما میتونیم از سیستم عامل پرس و جو بکنیم
مثلا میتونیم مشخصات یک سخت افزار خاصی رو درخواست کنیم و جواب اون رو مشاهده کنیم.
نحوه ی نوشتن کوئری با این زبان شباهت خیلی زیادی با زبان SQL دارد.
مثلا دستور
SELECT * FROM Win32_DisplayConfiguration
یک پرس و جو از Win32_DisplayConfiguration انجام میده که مربوط به سخت افزار کارت گرافیکه.
(اینکه Win32_DisplayConfiguration چی هست رو خود من هم نمیدونم اگه کسی اطلاعات بیشتری داره خوشحال میشیم که در اختیار بقیه دوستان هم قرار بده)
ما میتونیم به وسیله ی این دستور نام کارت گرافیک یا مشخصات مربوط به اون رو مشاهده کنیم.
برای اینکه بتونیم از این زبان در ویژوال بیسیک استفاده کنیم احتیاج به رفرنس 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 بود.
این کلاس و این زبان کارایی بسیار بهتر و بیشتری از آن چه که گفته شد دارند. امیدوارم در این تاپیک به بسیاری از آنها اشاره بشه
این هم یک سایت خوب که لیست تمامی متد ها و پارامتر های WQL رو گذاشته
http://www.yogageneration.com/~mvkaz...tml/index.html
با سلام
من چند وقت پیش با این امکان پی بردم و تا اینجا دست گیرم شد که با 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
البته اگه جایی رو اشتباه کردم به بزرگواریتون ببخشید
نه، WMI یک ابزار مدیریتی ویندوز هست، شما با استفاده از WMI می تونید (در صورت داشتند مجوزهای لازم)، نه تنها اطلاعات مختلفی از پیکربندی سخت افزار و نرم افزار سیستم خودتان بدست بیارید، بلکه می توانید به کمک آن به اطلاعات سایر سیستم های موجود در شبکه خود هم دسترسی داشته باشید. علاوه بر آن،WMI صرفا یک ابزار اطلاع رسانی نیست، بلکه می توانید با آن اعمال مدیریت هم بکنید، فرضا برخی تنظیمات سیستم را تغییر بدهید.نقل قول:
من چند وقت پیش با این امکان پی بردم و تا اینجا دست گیرم شد که با Wql بصورت دستورات Sql می تونیت از سیستم عامل پرسجوکنید( البته درباره منابع سیستم خودتون)
در سایت ماکروسافت هم ابزاری با نام WMI Code Creator قرار داده شده که قابلیت ایجاد کوئری های مختلف برای دریافت اطلاعات از سیستم عامل رو داراست . این ابزار توانایی ایجاد کوئریها در قالب VB.Net,C#,VBScript رو داره .
سلام
این هم یک نرم افزار خوب برای کار با WQL همراه با سورس:چشمک:
کتابی کامل و خوب در این زمینه
http://www1.vista-server.com/uploadf...2362221748.zip
اگر دوستان لطف کنند کاربرد هایی که WMI میتونه برای ما و برنامه هایمان داشته باشه رو بگن ممنون میشیم
این هم یک نرم افزار کامل و خیلی خوب برای کار با WMI پیشنهاد میکنم حتما دانلود کنید :چشمک:
چجوری میشه تعداد bad sector های هارد رو بیرون اورد؟
این برنامه کدباز رو هم از من داشته باشید. تمامی ویژگی های سخت افزارها رو بیرون میاره.
http://www.codeproject.com/KB/system...formation.aspx