我有一個用C++編碼的Windows程序。要獲得驅動器的驅動器序列號,我使用_popen()在程序中運行「wmic path win32_physicalmedia get SerialNumber」。確定Windows上的程序的驅動器
但是,運行程序的計算機可能有許多驅動器,並且USB驅動器也出現在列表中。
我該怎麼做才能知道哪些驅動器有我正在運行的程序?謝謝!
我有一個用C++編碼的Windows程序。要獲得驅動器的驅動器序列號,我使用_popen()在程序中運行「wmic path win32_physicalmedia get SerialNumber」。確定Windows上的程序的驅動器
但是,運行程序的計算機可能有許多驅動器,並且USB驅動器也出現在列表中。
我該怎麼做才能知道哪些驅動器有我正在運行的程序?謝謝!
假設你仍然想用WMI來做:首先你需要一些代碼來讀取C++中的WMI屬性。無需在此重複,您可以在Getting CPU ID code from C# to be in C++中找到它。
如果您有該代碼,您可以統計使用磁盤。首先,你需要記住的Windows如何組織磁盤:
Win32_DiskDrive
)由分區(Win32_DiskPartition
)製成。Win32_DiskPartition
)是一個邏輯磁盤(Win32_LogicalDisk
)。Win32_DiskDriveToDiskPartition
和Win32_LogicalDiskToPartition
完成。你已經知道where you're running那麼你可以做這樣的映射:
從Win32_LogicalDisk
取了一個地方DeviceID
屬性相匹配驅動你在運行:
DeviceID=C:
查詢Win32_LogicalDiskToPartition
並挑選Antecedent
爲其中Dependent
有您之前找到的ID:
\\REPETTI\root\cimv2:Win32_DiskPartition.DeviceID="Disk #1, Partition #1" \\REPETTI\root\cimv2:Win32_LogicalDisk.DeviceID="C:"
現在你應該查詢分區中Win32_DiskPartition
找到一個地方DeviceID
是Disk #1, Partition #1
但是也可以Win32_DiskDriveToDiskPartition
使用DeviceID
這種映射,那麼你可以直接查詢Win32_DiskDriveToDiskPartition
匹配給定ID:
\\REPETTI\root\cimv2:Win32_DiskDrive.DeviceID="\\.\PHYSICALDRIVE1" \\REPETTI\root\cimv2:Win32_DiskPartition.DeviceID="Disk #1, Partition #1"
現在你只需要查詢Win32_DiskDrive
搜索設備ID \\.\PHYSICALDRIVE1
:
WDC WDxxx ATA Device \\.\PHYSICALDRIVE1 WDC WDxxx ATA Device
,你可以得到它的序列號(在這種情況下,相同的屬性可在Win32_PhysicalMedia
和Win32_DiskDrive
中獲得,否則您應該通過其Caption
進行搜索)。
沒有WMI
如果你必須這樣做沒有WMI那麼它的點點更加棘手。
CreateFile()
打開驅動器並獲得信息與DeviceIoControl()
發送S.M.A.R.T.命令。不要認爲它總是那麼容易:有很多驅動器會失敗,並且您需要管理權限。不幸的是沒有一個完美的解決方案,那麼你需要嘗試不同的方法。 AFAIK最好和最詳盡的代碼來處理這是由Lynn McGuire爲其DiskId32實用程序。謝謝!我不明白「\\ REPETTI \ root」行,但無論如何,我使用的是您列出的WMI命令,如下所示: – NaBUru38
它是計算機名稱(Repetti,在我的域名中)。如果你運行相同的查詢,你會得到另一個名字 –
謝謝!我不明白「\\ REPETTI \ root」行,但我使用了列出的WMI命令: 1.調用「GetModuleFileNameW()」以獲取分區字母(例如'C')。 2.調用「wmic logicaldisk其中(DeviceID =」C:「)assoc/assocclass:Win32_LogicalDiskToPartition」以獲取分區ID(「Disk#0,Partition#1」)。 (DeviceID =「Disk#0,Partition#1」)assoc/assocclass:Win32_DiskDriveToDiskPartition「來獲取物理驅動器ID(」\\\\。\\ PHYSICALDRIVE0「)。 4.調用「wmic path win32_diskdrive get deviceid,serialnumber」獲取序列號,並按ID搜索。 – NaBUru38
的可能的複製[從文件名中的Windows驅動器盤符(http://stackoverflow.com/questions/7122009/get-drive-letter-from-filename-in-windows) –
@GáborBakos不欺騙, OP正在搜索給定路徑名稱的物理驅動器序列號。從文件名獲取驅動器號只是這項工作的第二步。 –