-
שלום וברכה
[אני מתחיל ממש בC#]בניתי תוכנה פשוטה
ואני מעונין שבעת הכנסת התקן חיצוני (USB)
התוכנה תזהה את המספר הסיראלי שלו
ותבצע פעולה מסויימתחיפשתי ולא מצאתי תשובה ברורה
כיצד ניתן לזהות התקנים נשלפים לפי המספר הסידורי שלהםאשמח לדעת כיצד ניתן לעשות זאת
בתודה מראש -
-
-
@משתמש-מקצוען אמר בכיצד ניתן לזהות התקן USB לפי הסיריאל שלו:
כיצד ניתן לזהות התקנים נשלפים לפי המספר הסידורי שלהם
השאלה לא כל כך ברורה בעצם.
אתה רוצה לדעת הסיריאלי של הכונן? או לזהות אותו לפי הסיריאלי (שאני לא מבין מה זה אומר)כדי לקבל הסיריאלי שלו, אתה יכול פשוט להריץ CMD
רק שים לב שבכרטיסי SD יש עם זה בעייה, אני כבר לא זוכר בדיוק אבל אאל"ט זה יוצא תמיד אותו דבר.wmic DISKDRIVE get SerialNumber wmic diskdrive get PNPDeviceID
-
@שואף אני רוצה לבנות תוכנה
שרצה כל הזמן במחשב
וברגע שאני יכניס דיסק און קי שמזוהה בתוכנה
התוכנה תציג טופס
חשבתי שהדרך היחידה שאפשרית לזיהוי הדיסק און קי היא ע"י הסיריאל שלו (שאני יכול גם לשנות באופן ידני).
אשמח לקבל הכוונה כיצד הקוד אמור להיות בנוי.
[חשוב לי לציין שאני ממש מתחיל... ועדיין באמצע ללמוד ממדריכים את הבסיס עצמו, ואעפ"כ מכיר קצת את העסק ונהנה להעתיק קוד מ stackoverflow.com , לכן לא ממש הצלחתי עדיין בניסויים שלי].
ואגב, הפקודות שהבאת לCMD לא מציגות לי את הסיריאל של הדיסק און קי. אלא רצף של ספרות ואותיות אחרות. -
@משתמש-מקצוען לא ציינת את הסביבה שבה תרוץ התוכנה (Windows/Linux)
-
@משתמש-מקצוען ניתן לעשות שימוש במחלקה 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 עוד רבות, מעט התעצלתי, אולם אשמח לענות על שאלות ספציפיות.
-