@משתמש-מקצוען ניתן לעשות שימוש במחלקה ManagementEventWatcher על מנת להירשם לאירועים במערכת המתאימים לשאילתות מותאמות אישית.
להלן מחלקה היפותטית לחלוטין אשר דוגמת את InstanceCreationEvent
מדי 2 שניות על מנת לגלות ערכים חדשים מסוג Win32_DiskDrive
(השימוש בWin32_DeviceChangeEvent
אינו יתכן במקרה זה, משום שאינו מכיל כל מידע על המכשיר) במידה וערך חדש מסוג Win32_DiskDrive
אכן נוצר, המתודה DeviceInsertedEvent
שרשמנו כEvent handler
תרוץ, במידה והמכשיר המסויים כבר התחבר בעבר, אנו נדפיס את הSerial Number לקונסול, במידה ולא, אנו נכניס אותו לרשימה של המכשירים המוכרים (familiarSerialNumbers
), כך שהSerial Number יודפס בפעם הבאה שהמכשיר יחובר.
class FamiliarDeviceDetection
{
private readonly string _query = "SELECT * FROM __InstanceCreationEvent WITHIN 2 WHERE TargetInstance ISA 'Win32_DiskDrive'";
private readonly List<string> _familiarSerialNumbers = new();
public FamiliarDeviceDetection()
{
var watcher = new ManagementEventWatcher();
watcher.Query = new WqlEventQuery(_query);
watcher.EventArrived += DeviceInsertedEvent;
watcher.Start();
}
private void DeviceInsertedEvent(object sender, EventArrivedEventArgs e)
{
var device = (ManagementBaseObject)e.NewEvent["TargetInstance"];
if (device["SerialNumber"].ToString() is var serialNumber && _familiarSerialNumbers.Contains(serialNumber))
{
Console.WriteLine(serialNumber);
}
else _familiarSerialNumbers.Add(serialNumber);
}
}
דוגמא לשימוש במחלקה הנ"ל באפליקציית Console:
public void Main()
{
new FamiliarDeviceDetection();
Console.ReadLine(); // comment out unless in console application
}
על מנת להשתמש בManagementEventWatcher
יש להוסיף לפרויקט את הספרייה System.Management
אשר הייתה בעבר חלק מהFramework, אולם הושמטה במעבר לCore עקב היותה מותאמת לסביבת ווינדוס בלבד (במטרה לטהר את הפלטפורמה ממחלקות אשר אינן מותאמות לריצה על לינוקס ו-MacOS) WMI עושה שימוש בDCOM (טכנולוגיה השייכת ופועלת ע"ג ווינדוס בלבד).
ניתן להוסיף את הספרייה באמצעות הפקודה:
dotnet add package System.Management
לחלופין ע"י הוספת השורה הבאה לקובץ הפרויקט (csproj):
<ItemGroup>
<PackageReference Include="System.Management" Version="6.0.0" />
</ItemGroup>
ניתן להרחיב על WMI עוד רבות, מעט התעצלתי, אולם אשמח לענות על שאלות ספציפיות.