wmi_hdd()

Veröffentliche deine funktionierenden Skripte und Funktionen

Moderator: jNizM

User avatar
haichen
Posts: 631
Joined: 09 Feb 2014, 08:24

wmi_hdd()

Post by haichen » 16 Mar 2020, 06:24

Ich wollte speziell die Hardware-ID für USB-Laufwerke auslesen. Auf der Kommandozeile kann man dies mit wmi machen.

Code: Select all

 wmic diskdrive get Name,Manufacturer,Model,InterfaceType,MediaType,SerialNumber,PNPDeviceID
 wmic LogicalDisk get VolumeName,name
Ich wollte nun gerne die Hardware-ID mit dem Laufwerksbuchstaben suchen.
Die Daten von Win32_LogicalDisk und Win32_DiskDrive miteinander zu verknüpfen ist aber nicht so einfach..

Nach allerlei Versuchen ist das hier herausgekommen:

Code: Select all

for k, v in wmi_hdd(){
    MsgBox % "Drive:`t`t" v.Driveletter "`nLabel:`t`t" v.VolumeLabel "`nModell:`t`t" v.Model "`nInterface:`t`t" v.InterfaceType  "`nSer.Nr. hdd:`t" v.SerialNumber "`nSer.Nr. Vol.:`t" v.VolumeSerialNumber  "`nHardwareID:`t" v.PNPDeviceID      
}


wmi_hdd()
{
	;nach https://www.autohotkey.com/boards/viewtopic.php?p=141182&sid=50826a0ab47fd6c1936a3e7cca89d8b0#p141182
	;und https://www.mbsplugins.de/archive/2012-02-24/Detecting_drive_letter_for_an_
	;Win32_DiskDrive und Win32_LogicalDisk werden über den Laufwerksbuchstaben verbunden
	;So kann bei USB-Festplatten die Hardware-ID über den Laufwerksbuchstaben gefunden werden.
    static HDD := []
    for objItem in ComObjGet("winmgmts:").ExecQuery("SELECT * FROM Win32_DiskDrive") {  ; WHERE InterfaceType='USB' or InterfaceType='SCSI' or InterfaceType='IDE'") {
        HDD[A_Index, "DeviceID"]      := objItem.DeviceID
		devID := objItem.DeviceID
        HDD[A_Index, "Model"]         := objItem.Model
        HDD[A_Index, "SerialNumber"]  := trim(objItem.SerialNumber)
		HDD[A_Index, "PNPDeviceID"]  := objItem.PNPDeviceID          ;Hardware-ID
		HDD[A_Index, "InterfaceType"]  := objItem.InterfaceType
		;...
		
		i:=A_Index

		for objItem in ComObjGet("winmgmts:").ExecQuery("Associators of {Win32_DiskDrive.DeviceID='" . devID . "'} where AssocClass=Win32_DiskDriveToDiskPartition") {
			HDD[i, "Name"]  := objItem.DeviceID
			devPart:=  objItem.DeviceID
			
		    for objItem in ComObjGet("winmgmts:").ExecQuery("Associators of {Win32_DiskPartition.DeviceID='" . devPart . "'} where AssocClass=Win32_LogicalDiskToPartition") {
				HDD[i, "DriveLetter"]  := objItem.DeviceID
				devDl:=objItem.DeviceID
				for objItem in ComObjGet("winmgmts:").ExecQuery("SELECT * FROM Win32_LogicalDisk WHERE Name='" . devDl . "'") {
					HDD[i, "VolumeLabel"]  := objItem.VolumeName
					HDD[i, "VolumeSerialNumber"]  := objItem.VolumeSerialNumber
					;....
				}				
			}	
		}
	
	}
	return hdd
}

Die Ausgabe für eine Laufwerk sieht dann so aus:
Drive: F:
Label: Archiv
Modell: WD Elements 107C USB Device
Interface: USB
Ser.Nr. hdd: Wxxxxxxxxxx8
Ser.Nr. Vol.: Cyyyyyy3
HardwareID: USBSTOR\DISK&VEN_WD&PROD_ELEMENTS_107C&REV_1065\...
Last edited by haichen on 17 Mar 2020, 03:29, edited 1 time in total.

User avatar
haichen
Posts: 631
Joined: 09 Feb 2014, 08:24

Re: wmi_hdd()

Post by haichen » 17 Mar 2020, 03:27

Code: Select all

	for objItem in ComObjGet("winmgmts:").ExecQuery("Associators of {Win32_DiskDrive.DeviceID='" . devID . "'} where AssocClass=Win32_DiskDriveToDiskPartition") {
			;Das Ergebnis war hier deutsch. Die nächste Abfrage braucht aber das englische Pendant:
			objItem.Name := StrReplace(objItem.Name, "Datenträgernr. " , "Disk #")
			objItem.Name := StrReplace(objItem.Name, "Partitionsnr. " , "Partition #")
			HDD[i, "Name"]  := objItem.Name
			devPart:=  objItem.Name
geändert in

Code: Select all

	for objItem in ComObjGet("winmgmts:").ExecQuery("Associators of {Win32_DiskDrive.DeviceID='" . devID . "'} where AssocClass=Win32_DiskDriveToDiskPartition") {
			HDD[i, "Name"]  := objItem.DeviceID
			devPart:=  objItem.DeviceID

Post Reply

Return to “Skripte und Funktionen”