2015-10-05 55 views
2

我有一個用C++編碼的Windows程序。要獲得驅動器的驅動器序列號,我使用_popen()在程序中運行「wmic path win32_physicalmedia get SerialNumber」。確定Windows上的程序的驅動器

但是,運行程序的計算機可能有許多驅動器,並且USB驅動器也出現在列表中。

我該怎麼做才能知道哪些驅動器有我正在運行的程序?謝謝!

+0

的可能的複製[從文件名中的Windows驅動器盤符(http://stackoverflow.com/questions/7122009/get-drive-letter-from-filename-in-windows) –

+0

@GáborBakos不欺騙, OP正在搜索給定路徑名稱的物理驅動器序列號。從文件名獲取驅動器號只是這項工作的第二步。 –

回答

1

假設你仍然想用WMI來做:首先你需要一些代碼來讀取C++中的WMI屬性。無需在此重複,您可以在Getting CPU ID code from C# to be in C++中找到它。

如果您有該代碼,您可以統計使用磁盤。首先,你需要記住的Windows如何組織磁盤:

  • 每個物理磁盤(Win32_DiskDrive)由分區(Win32_DiskPartition)製成。
  • 每個分區(Win32_DiskPartition)是一個邏輯磁盤(Win32_LogicalDisk)。
  • 彼此之間的映射使用Win32_DiskDriveToDiskPartitionWin32_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找到一個地方DeviceIDDisk #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_PhysicalMediaWin32_DiskDrive中獲得,否則您應該通過其Caption進行搜索)。

沒有WMI

如果你必須這樣做沒有WMI那麼它的點點更加棘手。

  • 首先,你需要找出哪個物理驅動器包含你的邏輯驅動器_你可以按照How to list physical disks?
  • 當你有物理驅動器的名稱最簡單的方法是CreateFile()打開驅動器並獲得信息與DeviceIoControl()發送S.M.A.R.T.命令。不要認爲它總是那麼容易:有很多驅動器會失敗,並且您需要管理權限。不幸的是沒有一個完美的解決方案,那麼你需要嘗試不同的方法。 AFAIK最好和最詳盡的代碼來處理這是由Lynn McGuire爲其DiskId32實用程序。
+0

謝謝!我不明白「\\ REPETTI \ root」行,但無論如何,我使用的是您列出的WMI命令,如下所示: – NaBUru38

+0

它是計算機名稱(Repetti,在我的域名中)。如果你運行相同的查詢,你會得到另一個名字 –

+0

謝謝!我不明白「\\ 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

相關問題