Что нового

Помогите получить заводской серийный номер диска по его букве

aleratorio

Осваивающий
Сообщения
85
Репутация
43
Подскажите пожалуйста, как определить серийный номер диска по его букве? Не серийный номер тома, который выдает функция DriveGetSerial, а именно заводской номер. Я так понял, что функция http://autoit-script.ru/index.php/topic,1945.0.html при флаге $UHID_HDD получает id по серийным номерам дисков, но где тот кусок, который определяет серийный номер, так и не понял.

P.S. Хотелось бы, если возможно, определить серийник не только несъемных дисков с интерфейсами ATA или SATA, но так же и IDE и внешних USB дисков и флешек.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
Не знаю что там с флешками, но вот обрезок кода от Yashied, по нахождению серийника
Код:
#Include  <WinAPI.au3>

ConsoleWrite(_DriveGetSerial() & @CRLF)

Func _DriveGetSerial()
	$oService = ObjGet('winmgmts:\\.\root\cimv2')
	$oItems = $oService.ExecQuery('SELECT * FROM Win32_PhysicalMedia')
	$Str = ''
	$tSPQ = DllStructCreate('dword;dword;byte[4]')
	$tSDD = DllStructCreate('ulong;ulong;byte;byte;byte;byte;ulong;ulong;ulong;ulong;dword;ulong;byte[512]')
	For $Property In $oItems
		$hFile = _WinAPI_CreateFile($Property.Tag, 2, 0, 0)
		DllCall('kernel32.dll', 'int', 'DeviceIoControl', 'ptr', $hFile, 'dword', 0x002D1400, 'ptr', DllStructGetPtr($tSPQ), 'dword', DllStructGetSize($tSPQ), 'ptr', DllStructGetPtr($tSDD), 'dword', DllStructGetSize($tSDD), 'dword*', 0, 'ptr', 0)
		If Not DllStructGetData($tSDD, 5) Then
			$Str &= $Property.SerialNumber
		EndIf
		_WinAPI_CloseHandle($hFile)
	Next
	Return $Str
EndFunc
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
У меня и так определяет:
Код:
$objWMIService = ObjGet('winmgmts:\\.\root\cimv2')
$colItems = $objWMIService.ExecQuery('Select * from Win32_PhysicalMedia')

For $objItem In $colItems
	If $objItem.SerialNumber <> '' Then
		MsgBox(0, 'HDD serial number', $objItem.SerialNumber)
	EndIf
Next

Обрезок из ScriptOmatic.au3
 
Автор
A

aleratorio

Осваивающий
Сообщения
85
Репутация
43
Это я уж разобрался, но хотелось бы по букве: $Serial = _DriveGetSerial('C:\'), и любой тип диска...
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
aleratorio
тип диска любой, ибо флешка не диск. как определять его серийник, я не знаю. в инете ходит противоречивая инфа по этому поводу. проверять нет времени. а находить по букве, хм... ты вроде хотел именно серийник самого диска, а буквы это вторичное. в любом случае, WMI запрос выше перечисляет именно физически установленные в системе безотносительно буквы. кстати, в системе можно установить диск и без буквы примонтировав его к папке на другом диске как это делается в линуксе, как тогда определить его серийник? :smile:


Добавлено:
Сообщение автоматически объединено:

вот первоисточник, где можешь почерпнуть много полезной информации
http://msdn.microsoft.com/en-us/library/aa394346%28VS.85%29.aspx
и вот еще,
aleratorio [?]
Это я уж разобрался
этого нельзя было сказать до того, как начали выкладывать варианты? ведь изначально было
[?]
но где тот кусок, который определяет серийный номер, так и не понял.
как бы бесполезную работу никому делать не охота
 
Автор
A

aleratorio

Осваивающий
Сообщения
85
Репутация
43
Но ведь windows как то определяет серийный номер флешек. Например для моей флешки Kingston его можно узнать из реестра в ветке: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USBSTOR\Disk&Ven_Kingston&Prod_DT_101_II&Rev_1.00\00400539BC5BF9A1075D0D12&0
Выделенный синим номер и есть серийник, правда связи с буквой тоже не нашел.

Хочу сделать привязку скрипта к диску с которого он запускается(типа защита от копирования) примерно таким образом:
Код:
If StringCompare(_DriveGetSerial(StringLeft(@ScriptDir, 3)), '00400539BC5BF9A1075D0D12') <> 0 Then Exit


Вот только как реализовать функцию _DriveGetSerial($Drive)?

P.S. Разобрался, пока выкладывали варианты - 50 минут прошло.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
aleratorio сказал(а):
Выделенный синим номер и есть серийник...

У флешек нет серийникров.

aleratorio сказал(а):
Вот только как реализовать функцию _DriveGetSerial($Drive)?

Код:
#Include <WinAPiEx.au3>

ConsoleWrite(_GetPhysicalDriveSerial('C:') & @CR)

Func _GetPhysicalDriveSerial($sDrive)

	Local $tSDN, $oService, $oItems

	If IsString($sDrive) Then
		$tSDN = _WinAPI_GetDriveNumber($sDrive)
		If (Not @error) And (DllStructGetData($tSDN, 'DeviceType') = 7) Then
			$sDrive = DllStructGetData($tSDN, 'DeviceNumber')
		Else
			Return ''
		EndIf
	EndIf
	Switch _WinAPI_GetDriveBusType('\\.\PHYSICALDRIVE' & $sDrive)
		Case $DRIVE_BUS_TYPE_ATA, $DRIVE_BUS_TYPE_SATA

		Case Else
			Return ''
	EndSwitch
	$oService = ObjGet('winmgmts:\\.\root\cimv2')
	If IsObj($oService) Then
		$oItems = $oService.ExecQuery('SELECT SerialNumber, Tag FROM Win32_PhysicalMedia WHERE Tag = "\\\\.\\PHYSICALDRIVE' & $sDrive & '"')
		For $Property In $oItems
			Return StringStripWS($Property.SerialNumber, 3)
		Next
	EndIf
	Return ''
EndFunc   ;==>_GetPhysicalDriveSerial
 
Автор
A

aleratorio

Осваивающий
Сообщения
85
Репутация
43
Что то мне этот код
Код:
#Include <WinAPiEx.au3>

ConsoleWrite(_GetPhysicalDriveSerial('C:') & @CR)

Func _GetPhysicalDriveSerial($sDrive)

    Local $tSDN, $oService, $oItems

    If IsString($sDrive) Then
        $tSDN = _WinAPI_GetDriveNumber($sDrive)
        If (Not @error) And (DllStructGetData($tSDN, 'DeviceType') = 7) Then
            $sDrive = DllStructGetData($tSDN, 'DeviceNumber')
        Else
            Return ''
        EndIf
    EndIf
    Switch _WinAPI_GetDriveBusType('\\.\PHYSICALDRIVE' & $sDrive)
        Case $DRIVE_BUS_TYPE_ATA, $DRIVE_BUS_TYPE_SATA

        Case Else
            Return ''
    EndSwitch
    $oService = ObjGet('winmgmts:\\.\root\cimv2')
    If IsObj($oService) Then
        $oItems = $oService.ExecQuery('SELECT SerialNumber, Tag FROM Win32_PhysicalMedia WHERE Tag = "\\\\.\\PHYSICALDRIVE' & $sDrive & '"')
        For $Property In $oItems
            Return StringStripWS($Property.SerialNumber, 3)
        Next
    EndIf
    Return ''
EndFunc   ;==>_GetPhysicalDriveSerial
только серийник IDE диска выдал, а для SATA диска - пустую строку

Yashied сказал(а):
У флешек нет серийникров.
А что же это тогда? Во всяком случае этот номер уникален для каждой флешки, не меняется при форматировании и программа USBDeview как раз определяет его как серийный номер устройства
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
aleratorio [?]
А что же это тогда? Во всяком случае этот номер уникален для каждой флешки, не меняется при форматировании и программа USBDeview как раз определяет его как серийный номер устройства
Вот что у меня определяет утилита USBDeview:
[box]DataTraveler 2.0 Kingston DataTraveler 2.0 USB Device Mass Storage No No No No 5B7305AFA624 23.08.2007 19:42:48 N/A 13fe
DataTraveler 2.0 Kingston DataTraveler 2.0 USB Device Mass Storage No No No No 5B7419A2F20D 07.08.2007 19:04:38 N/A 13fe[/box]
Как видно, это одна и та же флешка:
S/N - 5B7305AFA624 и 5B7419A2F20D
VendorID - 13fe и 13fe

И где тут одинаковый серийный номер?
Одинаковый, VendorID.
 
Автор
A

aleratorio

Осваивающий
Сообщения
85
Репутация
43
Garrett сказал(а):
Вот что у меня определяет утилита USBDeview:
[box]DataTraveler 2.0 Kingston DataTraveler 2.0 USB Device Mass Storage No No No No 5B7305AFA624 23.08.2007 19:42:48 N/A 13fe
DataTraveler 2.0 Kingston DataTraveler 2.0 USB Device Mass Storage No No No No 5B7419A2F20D 07.08.2007 19:04:38 N/A 13fe[/box]
Как видно, это одна и та же флешка:
S/N - 5B7305AFA624 и 5B7419A2F20D
VendorID - 13fe и 13fe

И где тут одинаковый серийный номер?
Одинаковый, VendorID.

А ты уверен что это не две разных флешки, с одинаковым именем, но, как раз, разными серийными номерами?
 
Автор
A

aleratorio

Осваивающий
Сообщения
85
Репутация
43
Ну не знаю, просто у меня для всех устройств он не менялся. И именно по этому номеру в некоторых заведениях учитывают какие флешки разрешено подключать к компу, а какие нет.
 
Верх