Existe-t-il un moyen facile d'obtenir le numéro de série de tous les disques durs d'un PC en utilisant l'API Win32?Comment obtenir le numéro de série des disques durs?
Répondre
GetVolumeInformation est votre ami.
GetVolumeInformation() ne vous donnera que le numéro de série du volume. Volume du disque! = Disque dur. La série de volumes est généralement un horodatage 32 bits à partir du moment où le disque a été formaté. –
Vous avez raison. –
L'ID de volume est 101% non fiable car il peut être facilement changé! – Ampere
GetVolumeInformation
vous donnera des informations uniquement sur la partition ou le volume , pas tout disque dur.
Vous devez utiliser la fonction DeviceIoControl
pour obtenir des informations.
Voici le code possible:
#include <atlstr.h>
#include <Windows.h>
#include <winioctl.h>
BOOL getSerial(CString diskSerial) {
BOOL bResult = FALSE;
STORAGE_PROPERTY_QUERY storagePropertyQuery;
STORAGE_DESCRIPTOR_HEADER storageDescHeader = { 0 };
STORAGE_DEVICE_DESCRIPTOR *pDeviceDesc;
DWORD dwBytes = 0;
DWORD dwOutBufferSize = 0;
DWORD dwSerialNumberOffset = 0;
BYTE *pOutBuffer = nullptr;
ZeroMemory(&storagePropertyQuery, sizeof(STORAGE_PROPERTY_QUERY));
storagePropertyQuery.PropertyId = StorageDeviceProperty;
storagePropertyQuery.QueryType = PropertyStandardQuery;
HANDLE hDevice = CreateFile("\\\\.\\PhysicalDrive0", 0,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, OPEN_EXISTING, 0, NULL);
if (hDevice == INVALID_HANDLE_VALUE) {
std::cout << "Can't get access to HDD.\nTerminating." << std::endl;
exit(EXIT_FAILURE);
}
bResult = DeviceIoControl(hDevice, IOCTL_STORAGE_QUERY_PROPERTY,
&storagePropertyQuery, sizeof(storagePropertyQuery),
&storageDescHeader, sizeof(storageDescHeader),
&dwBytes, NULL);
dwOutBufferSize = storageDescHeader.Size;
try {
pOutBuffer = new BYTE[dwOutBufferSize];
ZeroMemory(pOutBuffer, sizeof(pOutBuffer));
} catch (std::bad_alloc exp) {
CloseHandle(hDevice);
std::cout << exp.what() << std::endl;
return FALSE;
}
bResult = DeviceIoControl(hDevice, IOCTL_STORAGE_QUERY_PROPERTY,
&storagePropertyQuery, sizeof(STORAGE_PROPERTY_QUERY),
pOutBuffer, dwOutBufferSize, &dwBytes, NULL);
pDeviceDesc = (STORAGE_DEVICE_DESCRIPTOR *)pOutBuffer;
dwSerialNumberOffset = pDeviceDesc->SerialNumberOffset;
diskSerial = CString(pOutBuffer + dwSerialNumberOffset);
std::cout << "Serial Number: " << diskSerial << std::endl;
delete[] pOutBuffer;
CloseHandle(hDevice);
return TRUE;
}
Si vous avez plus d'1 disques durs installés, u devrait changer "\\\\.\\PhysicalDrive0"
à "\\\\.\\PhysicalDrive1"
etc.
Cela peut être une réponse à la question. Ce sera mieux si vous mettez un exemple (pour le futur lecteur, au cas où le lien se casse) –
@PriyeshKumar Merci pour le conseil, je suis juste nouveau à stackoverflow. – johnbrovi
Avec API Win, NO. Vous devez utiliser une bibliothèque dédiée de bas niveau (ASM). – Ampere