مراقبة محركات الأقراص مع WMI
سؤال
أحاول مراقبة محركات الأقراص على جهاز كمبيوتر محلي. أنا مهتم بحدثين: عندما يتم توصيل محرك الأقراص (محرك أقراص USB ، قرص مضغوط ، محرك الشبكة ، إلخ) وفصل الاتصال. كتبت دليلًا سريعًا على المفهوم باستخدام ManagementOperationObserver وهو يعمل جزئيًا. الآن (مع الكود أدناه) ، أحصل على كل أنواع الأحداث. أرغب في الحصول على أحداث فقط عند توصيل محرك الأقراص وفصله. هل هناك طريقة لتحديد هذا في استعلام WQL؟
شكرًا!
private void button2_Click(object sender, EventArgs e)
{
t = new Thread(new ParameterizedThreadStart(o =>
{
WqlEventQuery q;
ManagementOperationObserver observer = new ManagementOperationObserver();
ManagementScope scope = new ManagementScope("root\\CIMV2");
scope.Options.EnablePrivileges = true;
q = new WqlEventQuery();
q.EventClassName = "__InstanceOperationEvent";
q.WithinInterval = new TimeSpan(0, 0, 3);
q.Condition = @"TargetInstance ISA 'Win32_LogicalDisk' ";
w = new ManagementEventWatcher(scope, q);
w.EventArrived += new EventArrivedEventHandler(w_EventArrived);
w.Start();
}));
t.Start();
}
void w_EventArrived(object sender, EventArrivedEventArgs e)
{
//Get the Event object and display its properties (all)
foreach (PropertyData pd in e.NewEvent.Properties)
{
ManagementBaseObject mbo = null;
if ((mbo = pd.Value as ManagementBaseObject) != null)
{
this.listBox1.BeginInvoke(new Action(() => listBox1.Items.Add("--------------Properties------------------")));
foreach (PropertyData prop in mbo.Properties)
this.listBox1.BeginInvoke(new Action<PropertyData>(p => listBox1.Items.Add(p.Name + " - " + p.Value)), prop);
}
}
}
المحلول
أنت هناك تقريبا. للتمييز بين محرك الأقراص المتصل بجهاز وجهاز يتم إزالة محرك الأقراص ، تحتاج إلى التحقق مما إذا كان e.NewEvent
هو مثال __instancecreationevent أو __Instancedeletionevent على التوالى. شيء على طول هذه الخطوط:
ManagementBaseObject baseObject = (ManagementBaseObject) e.NewEvent;
if (baseObject.ClassPath.ClassName.Equals("__InstanceCreationEvent"))
Console.WriteLine("A drive was connected");
else if (baseObject.ClassPath.ClassName.Equals("__InstanceDeletionEvent"))
Console.WriteLine("A drive was removed");
علاوة على ذلك ، يمكنك أيضًا الحصول على مثيل Win32_LogicalDisk عبر TargetInstance
منشأه.
ManagementBaseObject logicalDisk =
(ManagementBaseObject) e.NewEvent["TargetInstance"];
Console.WriteLine("Drive type is {0}",
logicalDisk.Properties["DriveType"].Value);
لا تنتمي إلى StackOverflow