1æã®æãå人ãã質åãã©ãã»ã©æ¶Œããã£ãããšãã1ã€ã®ææ-ããã°ã©ã ãä»®æ³ãã·ã³ã®OSïŒWindows 7以éã®ãŠã£ã³ããŠã¢ããªã±ãŒã·ã§ã³ïŒã§å®è¡ãããŠãããã©ãããCïŒã§å€æããæ¹æ³ã
ãã®ãããªæ€åºåšã®èŠä»¶ã¯éåžžã«å³ãããã®ã§ããã
- å®å šã«ãœãŒã¹ã³ãŒãã§ããå¿ èŠããããŸãã
- Visual Studioã䜿çšããŠæ§ç¯ããå¿ èŠãããã
- æš©éã®ãªããŠãŒã¶ãŒã®ã¢ã«ãŠã³ãã§åäœããã¯ãã§ãïŒããšãã°ãããã€ã¹ãã©ã€ããŒã®ã€ã³ã¹ããŒã«ããŸãã¯ç®¡çè æš©éãå¿ èŠãšããä»ã®æäœãå¿ èŠãšããæ¹æ³ã¯äœ¿çšã§ããŸããïŒã
- .NET Framework 4.5ã䜿çšã§ããäžèŠãªäŸåé¢ä¿ïŒVisual C ++åé åžå¯èœããã±ãŒãžãªã©ïŒã¯äœ¿çšã§ããŸããã
ã«ããã®äžã«ã¯ãCïŒã§å®è£ ãããæ€åºåšã®èª¬æïŒæ¬¡ã®ããŒãã§ã¯C ++èŠçŽ ã䜿çšïŒ ãšã Visual Studio 2015 Communityã䜿çšãããŸãšããªéã®äžé©åãªã³ãŒãããããŸã ã
åºçæ§é
- 第1ã¬ãã«ã ææãšæãåçŽãªæ¢åã®ãœãªã¥ãŒã·ã§ã³ã®ç 究ïŒ
- ä»®æ³åã«é¢ããããã€ãã®çè«ã
- Windows Management InstrumentationïŒWMIïŒã®ããŒã¿ã䜿çšããVMæ€èšŒã®å®è£
ã
- 第2ã¬ãã«ã ä»®æ³ãã·ã³ã§ã®èµ·åæ€åºã«é¢ããèšäºãšåºçç©ãæ€çŽ¢ããŸãã
- WMIã§å®è£ ãå®äºããŸãã
- CPUIDåœä»€ãåŠçããŸãã
- 第3ã¬ãã«ã ããã«ãŒäŒè°ã®è³æãæ€çŽ¢ïŒ
- CPUIDã§äœæ¥ãçµäºãã
- ãã©ã¡ãŒã¿ãšãã¹ãçµæã®èŠçŽè¡šãäœæããŸãã
第1ã¬ãã«ã æ©åšãšæ¢åã®ãœãªã¥ãŒã·ã§ã³ã®ç 究
ä»®æ³åã«é¢ããå°ãã®çè«
ä»®æ³ãã·ã³ã®ç空å
ã§ç圢ã®éŠ¬ã®æ€åºåšãäœæããåã«ãåé¡ã®ãã¬ãŒã ã¯ãŒã¯å
ã§ãä»®æ³ãã·ã³ããšããçšèªãã©ã®ããã«ç解ããããç°¡åã«èª¬æããå¿
èŠããããŸãã
ä»®æ³åã®æŠå¿µã¯ã2ã€ã®ã«ããŽãªãŒïŒ 1 ïŒã«åé¡ã§ããŸãã
- 1ã€ç®ã¯ãªãœãŒã¹ã®ä»®æ³åã§ãã Dropboxãã¡ã€ã«ã¹ãã¬ãŒãžãµãŒãã¹ã®åçããªãœãŒã¹ä»®æ³åãšããŠè§£éã§ããçç±ããå®äŸãèŠãŠââã¿ãŸãããã
- ãã¡ã€ã«ãã¢ããããŒã/ããŠã³ããŒãããæ¹æ³ãããã³ãµãŒãã¹ãšããåãããæ¹æ³ã¯æ£ç¢ºã«ç¥ã£ãŠããŸããã=> ã«ãã»ã«åã®å éšã§ã©ã®ããã«æ©èœããããèªä¿¡ãæã£ãŠèšãããšã¯ã§ããŸããã
- åãŠãŒã¶ãŒã¯ç¬èªã®äžæã®ã¢ã«ãŠã³ããæã¡ãåã¢ã«ãŠã³ãã«ã¯ä¿åãããã¡ã€ã«ã®ãµã€ãºã®å²ãåœãŠããããåã¢ã«ãŠã³ãã«å¯ŸããŠåå¥ã«ã¢ã¯ã»ã¹èš±å¯ãèšå®ã§ããŸãïŒå®éãç°ãªããŠãŒã¶ãŒã®ããŒã¿ã¯åãã¹ãã¬ãŒãžã¡ãã£ã¢ã«ä¿åãããå ŽåããããŸãïŒ=> ãªãœãŒã¹ãå ±æããŸãã
- ã»ãšãã©ã®å ŽåãDropboxã®å
éšã«ã¯1å°ãŸãã¯2å°ã®ã³ã³ãã¥ãŒã¿ãŒã§ã¯ãªããDropboxã·ã¹ãã å
ã®ã¯ã©ã€ã¢ã³ãããã®ã³ãã³ããåäžã®å
šäœ=> ã¯ã©ã¹ã¿ãªã³ã°ãšããŠæäœããã³åŠçããå°ãªããšãæ°çŸå°ã®ãµãŒããŒããããŸãã
- 2ã€ç®ã¯ãã©ãããã©ãŒã ã®ä»®æ³åã§ããæ¢åã®ããŒããŠã§ã¢ãšããããã«äŸåããããŸãã¯äŸåããªããœãããŠã§ã¢ã·ã¹ãã ã«åºã¥ããŠãœãããŠã§ã¢ã·ã¹ãã ãäœæããŸãïŒ 1 ïŒã
2çªç®ã®ã«ããŽãªã§ã¯ãä»®æ³åçšã®ããŒããŠã§ã¢ãªãœãŒã¹ãšãœãããŠã§ã¢ãæäŸããã·ã¹ãã ïŒãã¹ãã·ã¹ãã ããã¹ãïŒãšãšãã¥ã¬ãŒãã·ã¹ãã ïŒã²ã¹ãã·ã¹ãã ãã²ã¹ãïŒã®2ã€ã®çšèªãããã«çŽ¹ä»ããŸãã
ããã«ãå®éã«ã¯ããã²ã¹ãã·ã¹ãã ãã®åœ¹å²ã¯æ¬¡ã®ãšããã§ãã
- ãšãã¥ã¬ãŒããããã·ã¹ãã ã®ãã¹ãŠã®ããŒããŠã§ã¢ãšãœãããŠã§ã¢-ãã®ã¿ã€ãã®ä»®æ³åã¯ã å®å
šãšãã¥ã¬ãŒã·ã§ã³ãŸãã¯ã·ãã¥ã¬ãŒã·ã§ã³ãšåŒã°ããŸã ã ãã®ã¿ã€ãã®ä»®æ³åãæäŸããããã°ã©ã ã®äŸïŒBochsãQEMUã
- ãã¹ãŠã®ãœãããŠã§ã¢ããã³ããŒããŠã§ã¢ã®äžéšã®ã¿ïŒã²ã¹ãã·ã¹ãã ã®åé¢ãä¿èšŒããã®ã«ååãªéšåïŒ-ãã®ã¿ã€ãã®ä»®æ³åã¯ã éšåãšãã¥ã¬ãŒã·ã§ã³ãŸãã¯ãã€ãã£ãä»®æ³åãšåŒã°ããŸãã ãã®ã¿ã€ãã®ä»®æ³åãæäŸããããã°ã©ã ã®äŸïŒVMWareã¯ãŒã¯ã¹ããŒã·ã§ã³ãVMWare ESXiãMicrosoft Hyper-VãOracle VirtualBoxã
- éšåä»®æ³å ã æºä»®æ³å ã ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã¬ãã«ã®ä»®æ³åãããã³ã¢ããªã±ãŒã·ã§ã³ã¬ãã«ã®ä»®æ³åãååšããŸãã 3ã€ã®å Žåãã¹ãŠã§ãç©ççã«1ã€ã®OSããããã²ã¹ãã·ã¹ãã ã¯åå¥ã®ããã»ã¹ãŸãã¯åå¥ã®ããã»ã¹ã°ã«ãŒãïŒãŠãŒã¶ãŒã¢ãŒãããã»ã¹ãªã©ïŒã§ãã
ãã®ãšã¯ã¹ã«ãŒã·ã§ã³ã®çµæïŒãã®èšäºã®ãã¬ãŒã ã¯ãŒã¯ãšä»®æ³ãã·ã³æ€åºåšã®äœæã§ã¯ããã€ãã£ããã©ãããã©ãŒã ã®ä»®æ³åã®ã¿ã«é¢å¿ããããŸã ïŒã€ãŸããHyper-VãVirtualBoxããŸãã¯ãã€ãã£ãä»®æ³åã䜿çšããä»ã®ããã°ã©ã ã®ç°å¢ã§ã®ã¿èµ·åã確èªããŸãïŒã ããã«ãVMWare Webãµã€ãã®å®çŸ©ã«åŸã£ãŠããä»®æ³ãã·ã³ããšããçšèªã解éããŸãããä»®æ³ãã·ã³ãã¯ãããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ãšã¢ããªã±ãŒã·ã§ã³ãå«ãå³å¯ã«åé¢ããããœãããŠã§ã¢ã³ã³ãããŒã§ããïŒ 2 ïŒã
Windows Management InstrumentationïŒWMIïŒã®ããŒã¿ã䜿çšããVMæ€èšŒã®å®è£
ç®æšïŒéšåãšãã¥ã¬ãŒã·ã§ã³ãåããç°å¢ã§ã®ããã°ã©ã ã®åäœã®äºå®ã決å®ããïŒãã»ãŒæå®ãããåŸããã®ã¿ã€ãã®æãæåãªä»®æ³ãã·ã³ïŒä»¥éãçãVMã®å ŽåïŒãšããããã®VMã«å²ãŸããèµ·åãšå®éã®ããŒããŠã§ã¢ã§ã®OSã®èµ·åãåºå¥ããæ¹æ³ãèŠã€ãããŸã
人æ°ã®ããä»®æ³åããã°ã©ã ã®éçºè ã®èããæããããŸããåºåããŒãžãèªãã§ã圌ãã®ä»äºã®ç¹å®ã®äžè¬çãªã¹ããŒã ãç§ã®é ã«æµ®ãã³ãŸãïŒãã¡ãããéçºè ã§ã¯ãªãããã°ã©ã ã®ä»äºã®ã¹ããŒã ïŒïŒ
- ãã¹ãOSããããŸãã äžè¬æ§ã倱ãããšãªããããã1ã€ã§ãããšæ³å®ããŸãã
- ä»®æ³åã®ããã°ã©ã ã¯ããã¹ãOSïŒä»¥äžããã€ããŒãã€ã¶ãŒãšåŒã³ãŸãïŒã«ã€ã³ã¹ããŒã«ãããŸãã
- ãã€ããŒãã€ã¶ãŒã¯ãã²ã¹ãOSã®ã€ã³ã¹ããŒã«ãšãã®åŸã®æäœã®ããã®ã€ã³ã¿ãŒãã§ãŒã¹ãæäŸããŸãã
泚 ïŒãã¹ãOSãšãã€ããŒãã€ã¶ãŒãåäžã®ã·ã³å šäœã§ããå Žåãããããã¹ãOSãšãã€ããŒãã€ã¶ãŒãå¥ã ã«äœ¿çšããå Žåãšæ¯èŒããŠã³ã³ãã¥ãŒã¿ãŒãªãœãŒã¹ã®æ¶è²»ãåæžã§ããŸãïŒäŸïŒVMWare ESXiãŸãã¯Windows Hyper-V ServerïŒã
ããããå®éã«ã¯ãã»ãšãã©ãã¹ãŠã®ãã€ããŒãã€ã¶ãŒããã²ã¹ãè¿œå ããã€ã³ã¹ããŒã«ããæ©èœãæã£ãŠããŸã-ãã€ããŒãã€ã¶ãŒãæäŸããç¹å¥ãªããã°ã©ã ãšãã©ã€ããŒ
ã²ã¹ãOSã®æ©èœã®æ¡åŒµå¶åŸ¡ïŒã²ã¹ãOSãããªãŒãºããŠãããã©ããã®ç¢ºèªãRAMã®äœ¿çšå¯èœãªRAMã®åçãªå€æŽããã¹ãããã³ã²ã¹ãOSã®ãå
±éãããŠã¹ïŒã ããããåºåã«ãããšããVMã¯å³å¯ã«åé¢ããããœãããŠã§ã¢ã³ã³ãããŒã§ãããå Žåããã®ãããªã¢ã¯ã·ã§ã³ã¯ã©ã®ããã«å®è£
ãããŸããïŒ
ã²ã¹ãOSã«ã€ã³ã¹ããŒã«ãããã²ã¹ãã¢ããªã³ã¯ãå³å¯ã«å®çŸ©ãããæ¹æ³ã§ããã¹ãOSã§å®è¡ãããŠãããã€ããŒãã€ã¶ãŒãšçŽæ¥å¯Ÿè©±ããããšãããããŸããã ã€ãŸããVMå®çŸ©ããã°ã©ã ããã®çžäºäœçšãå©çšã§ããå ŽåãOSãVMäžã§å®è¡ãããŠããããšã蚌æãããŸãã 確ãã«ãåé¡ã®ç¶æ³ã«å¿ããŠãç¬èªã®ãã©ã€ããŒã䜿çšããã«ãŠãŒã¶ãŒã¢ãŒãã§èšŒæãå®è¡ããå¿ èŠããããŸã...
次ã®å Žæãããã«ç¢ºèªããŠç¢ºèªããŸãã
- åã«ç©çãã·ã³äžã«ååšã§ããªãã·ã¹ãã å ã®ç¹å®ã®æ©åšãæ€çŽ¢ããŸãã
- VMã«ã®ã¿å®è£ ãããŠããïŒãŸãã¯ãã®éãç©çãã·ã³ã«ã®ã¿å®è£ ãããŠããïŒããŒããŠã§ã¢ã€ã³ã¿ãŒãã§ã€ã¹ãæ€çŽ¢ããŸãã
å®éãæ€çŽ¢è¡ã«ãdetect hyper-v CïŒããŸãã¯ãdetect vmware CïŒããšå ¥åãããšããã®ãããªãã®ã«ééããŸãããããã¯äžè¬åããããã ãã§ãã
ããŸããŸãªæ€èšŒåºæºã®æãå®å šãªèª¬æã¯ã2013幎ã®Hackerèªã®èšäºïŒ 3 ïŒã§èŠã€ãããŸãããèšäºãåºç€ãšããŠåãäžããŸãã ãŸããOSã®æ©åšãšããã»ã¹ã«é¢ããé¢é£ããŒã¿ãååŸããã«ã¯ãWindows Management InstrumentationïŒWMIïŒã¡ã«ããºã ïŒæåéããWindows Management InstrumentationãïŒã䜿çšããŸãã ç¹ã«ãWMIã䜿çšãããšã管çè æš©éãªãã§ãOSãèªèããæ©åšã«é¢ãã倧éã®æ å ±ãç°¡åã«ããã°ãããåãåãããšãã§ããŸãã
WMIãä»ããŠããŒã¿ãååŸããã«ã¯ãWQLèšèªïŒWMIã¯ãšãªèšèªïŒã§ã¯ãšãªãäœæããå¿ èŠããããŸããWQLèšèªã¯ãæ¬è³ªçã«éåžžã«åçŽåãããSQLã§ãã ããšãã°ãWMIãä»ããŠOSã§å©çšå¯èœãªããã»ããµã«é¢ããæ å ±ãååŸããã«ã¯ã次ã®èŠæ±ãå¿ èŠã§ãã
SELECT * FROM Win32_Processor
ãã®èŠæ±ã«å¯Ÿããçãã¯ãæ¢ç¥ã®ãã£ãŒã«ãåãæã€Win32_Processorã¿ã€ãã®ãªããžã§ã¯ãã®ã»ããã§ãïŒäœ¿çšå¯èœãªãã£ãŒã«ããšã¯ã©ã¹ã®è©³çŽ°ãªãªã¹ãã«ã€ããŠã¯ã 4ãåç §ããŠãã ããïŒã ãã¡ããããã¹ãŠã®ãã£ãŒã«ããå¿ èŠãªãå Žåã¯ã*ã®ä»£ããã«ãå¿ èŠãªãã£ãŒã«ãã®ã¿ãã³ã³ãã§ãªã¹ãã§ããŸãã WQL SELECTã¹ããŒãã¡ã³ãã§ã¯ãSQLãšåæ§ã«ãWHEREå¥ããµããŒããããŠããŸããããã«ããããã£ãŒã«ãã®å€ãæå®ãããæ¡ä»¶ãæºãããªããžã§ã¯ãã®ã¿ãéžæã§ããŸãã
ãã·ãŒããããããã«ã次ã®ã¿ã€ãã®WMIãªããžã§ã¯ããã次ã®ããŒã¿ãååŸããæ¹æ³ãåŠç¿ããŸãïŒVMã®ããŒã¿ãšæåŸ å€ã¯3ããååŸãããŸãïŒã
WMIãªããžã§ã¯ããšãã®ãããã㣠| ãªããžã§ã¯ãã®WQLã¯ãšãªã®æ¡ä»¶ | 䜿ãæ¹ | |
---|---|---|---|
Win32_Processor | |||
ã¡ãŒã«ãŒ | VirtualBoxã®å Žåã¯ãVBoxVBoxVBoxããVMWareã®å Žåã¯ãVMwareVMwareããParallelsã®å Žåã¯ãprl hypervãã«çãããªããŸãã | ||
Win32_BaseBoard | |||
ã¡ãŒã«ãŒ | Hyper-Vã®å ŽåãMicrosoftããã¶ãŒããŒãããªãªãŒã¹ããªããšããäºå®ã«ããããããããMicrosoft Corporationããšåçã§ãïŒ èå³æ·±ãããšã«ããã®ãã©ã¡ãŒã¿ãŒã¯Microsoft Surfaceã¿ãã¬ããã§äœã瀺ããŸããïŒïŒã | ||
Win32_DiskDrive | |||
PNPDeviceID | VirtualBoxã®å Žåã¯ãVBOX_HARDDISKããå«ã¿ãVMWareã®å Žåã¯ãVEN_VMWAREããå«ã¿ãŸãã | ||
Win32_NetworkAdapter | |||
MACAddress | PhysicalAdapter = 1 | 補é å ã¯MACã¢ãã¬ã¹ã®äžäœ3ãã€ãã§èå¥ã§ããããšãããã£ãŠãããä»®æ³ãã·ã³ã®è£œé å ãäŸå€ã§ã¯ãããŸããïŒã€ãŸããPhysicalAdapter笊å·= 1ã®ã¢ããã¿ãŒãVMWareããŒã«ããMACã¢ãã¬ã¹ãæã£ãŠããå Žåã¯ãVMã§ããã°ã©ã ãèµ·åãããå¯èœæ§ãé«ããªããŸãïŒã | |
Win32_Process | |||
ãåå | ã²ã¹ãã¢ããªã³ãVMã«ã€ã³ã¹ããŒã«ããããšãæ¢ç¥ã®ååãæã€è¿œå ã®ããã»ã¹ãã·ã¹ãã ã«è¡šç€ºãããŸãã |
TMI.Utils.Environmentã©ã€ãã©ãªã®åœ¢åŒã§ãWMIãä»ããæ©åšããŒã¿ã®åä¿¡ãå¥ã®ãããžã§ã¯ãã«å®è£ ããŸãã
ãããžã§ã¯ãã次ã®ããã«æ§æããŸãã
- ãšã³ãã£ãã£-WMIããåä¿¡ããããŒã¿ïŒãšã³ãã£ãã£ïŒãæã€ãªããžã§ã¯ãã
- ãµãŒãã¹ -ãµãŒãã¹; ããšãã°ã.NET WMIã©ãããŒãšã®çžäºäœçšãã«ãã»ã«åãããµãŒãã¹ã
- ã€ã³ã¿ãŒãã§ãŒã¹ -ã€ã³ã¿ãŒãã§ãŒã¹; ããšãã°ãWMIãµãŒãã¹ã€ã³ã¿ãŒãã§ã€ã¹ã
- ã¯ãšãª -WMIèŠæ±ã®ãã©ã¡ãŒã¿ãŒãå«ããªããžã§ã¯ããæå®ããããšã³ãã£ãã£ã¿ã€ããååŸãããŸãã
ãã®ã©ã€ãã©ãªã®ãŠãŒã¶ãŒã次ã®ãããªãã®ãäœæã§ããããã«ããããšæããŸãã
var bios = wmiService.QueryFirst<WmiBios>(new WmiBiosQuery()); var processors = wmiService.QueryAll<WmiProcessor>(new WmiProcessorQuery());
WMIãšããåãããããªã¯ãšã¹ããäœæããããŸãã¯ã¬ã¹ãã³ã¹ãå³å¯ã«åæå®ãããCïŒèšèªã¯ã©ã¹ã«å€æããã¡ã«ããºã ã«ã€ããŠå¿é ããŸããã§ããã
å®éããããå®è£ ããã®ã¯ããã»ã©é£ãããããŸããã
æåã«ãSystem.Managementã©ã€ãã©ãªãžã®ãªã³ã¯ããããžã§ã¯ãã«æ¥ç¶ããŸãïŒããã¯ãWMIã«ã¢ã¯ã»ã¹ããããã®.NETã¯ã©ã¹ãååšããå Žæã§ãïŒã 次ã«ãIWmiServiceãµãŒãã¹ã®ã€ã³ã¿ãŒãã§ã€ã¹ã«ã€ããŠèª¬æããŸãïŒãã®ã€ã³ã¿ãŒãã§ã€ã¹ã®å®è£
ã¯ãããŒã¿ãååŸãããããå³å¯ã«åæå®ããããªããžã§ã¯ãã«å€æããŸãïŒã
/// <summary> /// Windows Management Instrumentation (WMI). /// </summary> public interface IWmiService { /// <summary> /// WMI. /// </summary> /// <typeparam name="TResult"> , .</typeparam> /// <param name="wmiQuery">, WMI-.</param> /// <returns> .</returns> TResult QueryFirst<TResult>(WmiQueryBase wmiQuery) where TResult : class, new(); /// <summary> /// WMI. /// </summary> /// <typeparam name="TResult"> , .</typeparam> /// <param name="wmiQuery">, WMI-.</param> /// <returns> .</returns> IReadOnlyCollection<TResult> QueryAll<TResult>(WmiQueryBase wmiQuery) where TResult : class, new(); }
次ã«ããããžã§ã¯ãã§ãšã³ãã£ãã£ãã©ã®ããã«èŠããããèšå®ããŸãããã æ€åºã®ããã«ãWin32_BaseBoardåã®WMIãªããžã§ã¯ãããã®æ¬¡ã®ãã£ãŒã«ããå¿ èŠã ãšããŸãã
public class WmiBaseBoard { public string Manufacturer { get; private set; } public string Product { get; private set; } public string SerialNumber { get; private set; } }
çæ³çã«ã¯ãWMLãªã¯ãšã¹ãã®çµæããã®ããŒã¿ãäžèšã®ãšã³ãã£ãã£ã«å€æããããã«DTOãäœæããå¿ èŠããããŸããããããžã§ã¯ãã®ãšã³ãã£ãã£ã®ããããã£ãWMLãªã¯ãšã¹ãã®çµæããã®ãªããžã§ã¯ãã®ãã£ãŒã«ãã«1察1ã§å¯Ÿå¿ãããšä»®å®ãããšãåãšã³ãã£ãã£ã§DTOãå®è¡ããŸãå調ãªã³ãŒããããããæžããŸãã
ããã°ã©ããŒã®ã¡ã€ã³ããããã£ïŒé
延ïŒã䜿çšããæ¬æ ŒçãªDTOãäœæãã代ããã«ãåããããã£ã次ã®å±æ§ãšããŠå±æ§ã§ããŒã¯ããã ãã§ãããããã£ãšWMLãªã¯ãšã¹ãã®çµæãã£ãŒã«ããé¢é£ä»ããããšãã§ããŸãã
/// <summary> /// , WMI. /// </summary> [AttributeUsage(AttributeTargets.Property)] public class WmiResultAttribute : Attribute { public WmiResultAttribute(string propertyName) { PropertyName = propertyName; } /// <summary> /// WMI. /// </summary> public string PropertyName { get; } }
æå®ãããå±æ§ã§ãšã³ãã£ãã£ã®ããããã£ãããŒã¯ãããšã次ã®ããã«ãªããŸãã
public class WmiBaseBoard { internal const string MANUFACTURER = "Manufacturer"; internal const string PRODUCT = "Product"; internal const string SERIAL_NUMBER = "SerialNumber"; // ReSharper disable UnusedAutoPropertyAccessor.Local [WmiResult(MANUFACTURER)] public string Manufacturer { get; private set; } [WmiResult(PRODUCT)] public string Product { get; private set; } [WmiResult(SERIAL_NUMBER)] public string SerialNumber { get; private set; } // ReSharper restore UnusedAutoPropertyAccessor.Local }
ãªã¯ãšã¹ããä¿åãããªããžã§ã¯ããåŠçããããã«æ®ããŸãã åã®ã³ãŒãäŸã§ã¯ãWQLã¯ãšãªçµæã®ãã£ãŒã«ãåãå
éšå®æ°ã§ã¬ã³ããªã³ã°ãããŠããããšã«æ°ã¥ãããšæããŸãã ããã¯ããªã¯ãšã¹ãã¯ã©ã¹ã§éè€ããªãããã«ç¹ã«è¡ãããŸããã ãšããã§ãèå³æ·±ãå¯äœçšã§ããããšãå€æããŸããããã®ã¢ãã«ã䜿çšãããšãæœåºãããšã³ãã£ãã£ã®ããããã£ãæå®ãããŸã§ãWMIãªããžã§ã¯ãã®ãã£ãŒã«ãããŒã¿ãWMIããèªã¿åãããšãã§ããŸããã
using System.Management; /// <summary> /// WMI. /// </summary> public class WmiQueryBase { private readonly SelectQuery _selectQuery; /// <summary> /// WMI. /// </summary> /// <param name="className"> , .</param> /// <param name="condition"> .</param> /// <param name="selectedProperties"> .</param> protected WmiQueryBase(string className, string condition = null, string[] selectedProperties = null) { _selectQuery = new SelectQuery(className, condition, selectedProperties); } /// <summary> /// SELECT- WMI. /// </summary> internal SelectQuery SelectQuery { get { return _selectQuery; } } }
using TTC.Utils.Environment.Entities; public class WmiBaseBoardQuery : WmiQueryBase { public WmiBiosQuery() : base("Win32_BaseBoard", null, new[] { WmiBios.MANUFACTURER, WmiBios.PRODUCT, WmiBios.SERIAL_NUMBER, }) { } }
ã¯ãšãªã¯ã©ã¹ã®ãã®ãããªæ§é ã§ã¯ãåä»ãªããšã1ã€ã ããããŸããã¯ã©ã¹å
ã®WMLèŠæ±ã®WHEREéšåã®ãã©ã¡ãŒã¿ãŒãäœæããã®ã¯äžäŸ¿ã§ãã ãã©ã¡ãŒã¿ã«å¿ããŠãæãªããã®æ¹æ³ã§ãã³ã䜿çšããŠç·ã圢æããå¿
èŠããããŸãã
using System.Text; using TTC.Utils.Environment.Entities; public class WmiNetworkAdapterQuery : WmiQueryBase { private static readonly string[] COLUMN_NAMES = { WmiNetworkAdapter.GUID, WmiNetworkAdapter.MAC_ADDRESS, WmiNetworkAdapter.PNP_DEVICE_ID, }; public WmiNetworkAdapterQuery(WmiNetworkAdapterType adapterType = WmiNetworkAdapterType.All) : base("Win32_NetworkAdapter", null, COLUMN_NAMES) { if (adapterType == WmiNetworkAdapterType.Physical) SelectQuery.Condition = "PhysicalAdapter=1"; else if (adapterType == WmiNetworkAdapterType.Virtual) SelectQuery.Condition = "PhysicalAdapter=0"; } }
è¯ãïŒãšã³ãã£ãã£ã«æ£åšããããŒã¿ãã¯ãšãªãååã§æžãããšãåŠãã ã®ã§ããããã®ã¯ã©ã¹ã§åäœãããµãŒãã¹ãã©ã®ããã«ãªãããç解ããå¿
èŠããããŸãã
/// <summary> /// Windows Management Instrumentation (WMI). /// </summary> public class WmiService : IWmiService { /// <summary> /// WMI . /// </summary> /// <typeparam name="TResult"> , .</typeparam> /// <param name="managementObject">, WMI.</param> /// <returns> .</returns> private static TResult Extract<TResult>(ManagementBaseObject managementObject) where TResult : class, new() { var result = new TResult(); foreach (var property in typeof(TResult).GetProperties()) { var wmiAttribute = (WmiResultAttribute)Attribute.GetCustomAttribute(property, typeof(WmiResultAttribute)); if (wmiAttribute != null) { var sourceValue = managementObject.Properties[wmiAttribute.PropertyName].Value; var targetType = Nullable.GetUnderlyingType(property.PropertyType) ?? property.PropertyType; object targetValue; if (sourceValue == null) { targetValue = null; } else if (targetType == typeof(DateTime)) { targetValue = ManagementDateTimeConverter.ToDateTime(sourceValue.ToString()).ToUniversalTime(); } else if (targetType == typeof(Guid)) { targetValue = Guid.Parse(sourceValue.ToString()); } else { targetValue = Convert.ChangeType( managementObject.Properties[wmiAttribute.PropertyName].Value, targetType); } property.SetValue(result, targetValue); } } return result; } /// <summary> /// WMI. /// </summary> /// <param name="selectQuery"> .</param> /// <param name="searcher"> WMI.</param> /// <returns> .</returns> private ManagementObjectCollection QueryAll(SelectQuery selectQuery, ManagementObjectSearcher searcher = null) { searcher = searcher ?? new ManagementObjectSearcher(); searcher.Query = selectQuery; return searcher.Get(); } /// <summary> /// WMI. /// </summary> /// <param name="selectQuery"> .</param> /// <param name="searcher"> WMI.</param> /// <returns> .</returns> private ManagementBaseObject QueryFirst(SelectQuery selectQuery, ManagementObjectSearcher searcher = null) { return QueryAll(selectQuery, searcher).Cast<ManagementBaseObject>().FirstOrDefault(); } public TResult QueryFirst<TResult>(WmiQueryBase wmiQuery) where TResult : class, new() { var managementObject = QueryFirst(wmiQuery.SelectQuery); return managementObject == null ? null : Extract<TResult>(managementObject); } public IReadOnlyCollection<TResult> QueryAll<TResult>(WmiQueryBase wmiQuery) where TResult : class, new() { var managementObjects = QueryAll(wmiQuery.SelectQuery); return managementObjects?.Cast<ManagementBaseObject>() .Select(Extract<TResult>) .ToList(); } }
WmiService.Extract <TResult>ã¡ãœããã«é¢ããããã€ãã®èšèã
éåžžãWMIãªããžã§ã¯ãã«ã¯ããªãå€æ°ã®ããããã£ããããŸãïŒå€ãã®ãã£ãŒã«ãã¯NULLã«ãªãå ŽåããããŸãïŒã ã¿ã¹ã¯ã®äžç°ãšããŠãWMIããå°æ°ã®ãªããžã§ã¯ãããããã£ã®ã¿ãã¢ã³ããŒããããšããåæã®äžã§ãçµæã®ãšã³ãã£ãã£ã®ããããã£ã䞊ã¹æ¿ããŠããŒã¿ã®ãããã³ã°ãéå§ããããšã¯è«ççã§ãã ããã«ãããããã£ã«WmiResultAttributeå±æ§ãããå Žåãã¯ãšãªçµæãªããžã§ã¯ãããå±æ§ã§æå®ãããååã®ããããã£ã®å€ãèªã¿åããåå€æãå®è¡ããŸãã ããã«ããšã³ãã£ãã£ã®ããããã£ããæšæºã®Convert.ChangeTypeã¡ãœãããåŠçã§ããªãåã§ããããåžæããæ¹æ³ã§åãå€æããªãå ŽåãSystem.DateTimeåããã³System.Guidåã§è¡ãããŠããããã«ãå¶åŸ¡ãå€æã«ç°¡åã«ç§»è¡ã§ããŸãã
ã¡ãªã¿ã«ãExtractã2ã€ã®ã¡ãœããã«åé¢ããããšããå§ãããŸãïŒæåã®ã¡ãœããã¯ã¯ã©ã¹ã¿ã€ãããæ å ±ãæœåºãã2çªç®ã®ã¡ãœããã¯ã€ã³ã¹ã¿ã³ã¹ãåããŸãïŒããã§ãªãå Žåãåºåã³ã¬ã¯ã·ã§ã³ã®2çªç®ä»¥éã®èŠçŽ ã®QueryAllã¡ãœããã¯ããã®ã¿ã€ãã®æ§é ã®åæ€èšã«äžèŠãªäœæ¥ãè¡ããŸãïŒ ãã ããç¹ã«ä»®æ³ãã·ã³ãæ€åºããããã«ã1åã®ãªã¯ãšã¹ãã§10åãè¶ ãããªããžã§ã¯ããæåŸ ããããšã¯ã»ãšãã©ãããŸããããããã£ãŠããã®ã¿ã¹ã¯ããå®è£ ãããŠããŸããã ãããã誰ãããã®ãããªä¿®æ£ãæã«å ¥ããã-ç§ã¯ããªãã®ä¿®æ£ãåãã§åãå ¥ããŸãã
ããšãã
èšäºã®ãã®éšåãã©ã€ãã©ãªã ãã§çµããããªãããã«ããã®ã©ã€ãã©ãªã®æ©èœã䜿çšããŠãäžèšã®åºæºã«åºã¥ããŠVMWareãMicrosoftãParallelsãOracleã®æã人æ°ã®ããä»®æ³ãã·ã³ã®ããã€ããæ€åºããæãåçŽãªã¢ããªã±ãŒã·ã§ã³ãäœæããŸãã
å¥ã®ãããžã§ã¯ã-ã³ã³ãœãŒã«ã¢ããªã±ãŒã·ã§ã³TTC.Utils.VMDetectãäœæãããã®äžã«æ¬¡ã®ã¯ã©ã¹DemoTrivialVmDetectorãäœæããŸãããã
/// <summary> /// - . /// </summary> class DemoTrivialVmDetector { private readonly IWmiService _wmiService; public DemoTrivialVmDetector(IWmiService wmiService) { _wmiService = wmiService; } public MachineType GetMachineType() { var wmiProcessor = _wmiService.QueryFirst<WmiProcessor>(new WmiProcessorQuery()); if (wmiProcessor.Manufacturer != null) { if (wmiProcessor.Manufacturer.Contains("VBoxVBoxVBox")) return MachineType.VirtualBox; if (wmiProcessor.Manufacturer.Contains("VMwareVMware")) return MachineType.VMWare; if (wmiProcessor.Manufacturer.Contains("prl hyperv")) return MachineType.Parallels; } var wmiBaseBoard = _wmiService.QueryFirst<WmiBaseBoard>(new WmiBaseBoardQuery()); if (wmiBaseBoard.Manufacturer != null) { if (wmiBaseBoard.Manufacturer.Contains("Microsoft Corporation")) return MachineType.HyperV; } var wmiDiskDrives = _wmiService.QueryAll<WmiDiskDrive>(new WmiDiskDriveQuery()); if (wmiDiskDrives != null) foreach (var wmiDiskDrive in wmiDiskDrives) { if (wmiDiskDrive.PnpDeviceId.Contains("VBOX_HARDDISK")) return MachineType.VirtualBox; if (wmiDiskDrive.PnpDeviceId.Contains("VEN_VMWARE")) return MachineType.VMWare; } return MachineType.Unknown; } }
ã©ã€ãã©ãªãšæãåçŽãªãã¹ãã¢ããªã±ãŒã·ã§ã³ãå«ããã¹ãŠã®ã³ãŒãã¯githubãªããžããªã«æçš¿ãããŠããŸã ãã¬ãã¥ãŒãšã³ã¡ã³ãã¯æè¿ããŸãã
次ã®ããŒãã§ã¯ãæ¢ç¥ã®VMã䜿çšããŠäœæ¥ãå°ãæ§é åããã¢ã»ã³ãã©ãŒåœä»€CPUIDã䜿çšããŠãæ¢ã«äžæãªVMãæ€åºããããšããŸãã