Что нового

Уникальный номер USB-диска (флешки)

Centrinar

Новичок
Сообщения
100
Репутация
1
У каждого устройства есть серийник, его можно посмотреть через DriveGetSerial. Но проблема в том, что если мы копируем образ, например через ULTRAISO то Serial так же копируется. А необходимо защитить скрипт, дабы он запускался только на конкретной флешке. Может есть у кого идеи?
Спасибо
 

_Lexa98_

Осваивающий
Сообщения
551
Репутация
25
При запуске прошраммы проверяй, соответствует ли сирийник записанный в файл/код с сирийником диска, если нет, то сразу выхожи из программы
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
_Lexa98_ [?]
При запуске прошраммы проверяй, соответствует ли сирийник записанный в файл/код с сирийником диска, если нет, то сразу выхожи из программы
OffTopic:
Интересно, Вы читаете свои сообщения перед отправкой?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Centrinar [?]
И мой вопрос читали?
Серийный номер.
Код:
$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 & @LF & $objItem.Tag)
	EndIf
Next
 
Автор
C

Centrinar

Новичок
Сообщения
100
Репутация
1
Не пойму, а как прочитать номер флешки а не HDD
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Серийный номер, это уникальный номер, присущий только конкретно данному устройству. Такие номера имеют, например, жесткие диски, процессоры, видеокарты (не все). Флешки - нет. Функция DriveGetSerial() возвращает серийный номер файловой системы, который никак не связан с самим устройством. Кроме того, этот номер изменится после форматирования диска или же его можно легко изменить программно.

Единственное, что можно сделать, это идентифицировать флешку по Device ID. Этот номер будет повторяться только для данной модели флешки данного производителя. Его можно посмотреть в свойствах диска, и имеет он примерно следующий вид:

VEN_&PROD_SILICON-POWER&REV_PMAP

Для большей уникальности сюда можно добавить тот же серйный номер файловой системы, количество цилиндров, головок, секторов и т.д, например

VEN_&PROD_SILICON-POWER&REV_PMAPNTFS142301716697325515631245248115

Далее, чтобы никто не догадался, берете от этой строки хеш, например MD5, и выводите его в виде GUID:

{2CCBF6A7-D775-9A37-39F2-E1780C65AD77}

Это и будет "уникальный" номер вашей флешки. Сделать рабочую копию такой флешки можно только, если скопировать ее образ на точно такую же флешку того же производителя. В принципе, для большинства задач этого будет вполне достаточно. Для еще большего усложнения задачи можете взять редко встречающиеся флешки минимального объема.

Как теперь привязать скрипт к такой флешке? Создаете в корне оной скрытый текстовый или двойчный файл, содержащий соответствующий этой флешке GUID. Далее скрипт пытается прочитать со всех съемных дисков этот файл и сравнить ID с вычесленным значением для этого диска (на котором находится файл).

Код:
#Include  <Crypt.au3>

ConsoleWrite(_UniqueUSBFlashID('G:') & @CR)

Func _UniqueUSBFlashID($sDrive)

	Local $oService, $oItems, $Hash, $Disk = '', $Part = '', $Text = ''

	$oService = ObjGet('winmgmts:\\.\root\cimv2')
	If Not IsObj($oService) Then
		Return SetError(1, 0, '')
	EndIf
	$oItems = $oService.ExecQuery('SELECT * FROM Win32_LogicalDiskToPartition')
	If Not IsObj($oItems) Then
		Return SetError(2, 0, '')
	EndIf
	For $Property In $oItems
		If StringInStr($Property.Dependent, '"' & $sDrive & '"') Then
			$Part = StringTrimLeft($Property.Antecedent, StringInStr($Property.Antecedent, '='))
			ExitLoop
		EndIf
	Next
	If Not $Part Then
		Return SetError(3, 0, '')
	EndIf
	$oItems = $oService.ExecQuery('SELECT * FROM Win32_DiskDriveToDiskPartition')
	If Not IsObj($oItems) Then
		Return SetError(2, 0, '')
	EndIf
	For $Property In $oItems
		If StringInStr($Property.Dependent, $Part) Then
			$Disk = StringTrimLeft($Property.Antecedent, StringInStr($Property.Antecedent, '='))
			ExitLoop
		EndIf
	Next
	If Not $Disk Then
		Return SetError(3, 0, '')
	EndIf
	$oItems = $oService.ExecQuery('SELECT * FROM Win32_DiskDrive WHERE DeviceID = ' & $Disk)
	If Not IsObj($oItems) Then
		Return SetError(2, 0, '')
	EndIf
	For $Property In $oItems
		If $Property.InterfaceType = 'USB' Then
			$Text = StringTrimLeft($Property.PnPDeviceID, StringInStr($Property.PnPDeviceID, '&VEN_'))
			$Text = StringStripWS(StringLeft($Text, StringInStr($Text, '\', 0, -1) - 1), 8)
			$Text &= DriveGetFileSystem($sDrive) & DriveGetSerial($sDrive)
			$Text &= $Property.TotalCylinders
			$Text &= $Property.TotalHeads
			$Text &= $Property.TotalSectors
			$Text &= $Property.TotalTracks
			ExitLoop
		EndIf
	Next
	If Not $Text Then
		Return SetError(3, 0, '')
	EndIf
	$Hash = StringTrimLeft(_Crypt_HashData($Text, $CALG_MD5), 2)
	If Not $Hash Then
		Return SetError(4, 0, '')
	EndIf
	Return '{' & StringMid($Hash, 1, 8) & '-' & StringMid($Hash, 9, 4) & '-' & StringMid($Hash, 13, 4) & '-' & StringMid($Hash, 17, 4) & '-' & StringMid($Hash, 21, 12) & '}'
EndFunc   ;==>_UniqueUSBFlashID
 

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
Centrinar
Данный скрипт использую для идентификации чужих забытых флэшек, может подойдёт для примера:

Код:
; НАЧАЛО

 #Region
 #AutoIt3Wrapper_OutFile=usbname.exe
 #AutoIt3Wrapper_icon=compiled.ico
 #AutoIt3Wrapper_Compression=4
 #AutoIt3Wrapper_UseAnsi=y
 #AutoIt3Wrapper_Res_Description=Идентификатор USB-накопителей
 #AutoIt3Wrapper_Res_Fileversion=2012.10.06.01
 #AutoIt3Wrapper_Res_Fileversion_AutoIncrement=n
 #AutoIt3Wrapper_Res_LegalCopyright=snoitaleR
 #AutoIt3Wrapper_Res_Language=1049
 #AutoIt3Wrapper_Run_AU3Check=n
 #EndRegion

 #NoTrayIcon

 $GUI=GUICreate('')

 If @Compiled Then
  GUISetIcon('shell32.dll',-166)
  TraySetIcon('shell32.dll',-166)
 Else
  GUISetIcon('shell32.dll',-170)
  TraySetIcon('shell32.dll',-170)
 EndIf

 TraySetToolTip('Идентификатор USB-накопителей')

 GUISetState(@SW_HIDE,$GUI)

 GUIRegisterMsg(0x0219,'WM_DEVICECHANGE')

 While Sleep(100)
 WEnd

 Func NEW()
  $KEY1='HKLM\System\CurrentControlSet\Services\usbstor\Enum'
  $KEY2='HKLM\System\CurrentControlSet\Enum'
  $COUNT=RegRead($KEY1,'Count')
  $DESC=''
  For $I=0 To $COUNT-1
   $DEVICE=RegRead($KEY1,$I)
   $DESC=RegRead($KEY2&'\'&$DEVICE,'DeviceDesc')
   $LIST=IniReadSection(@ScriptDir&'\usbname.ini','USBSTOR')
   $INLIST=False
   For $J=1 To UBound($LIST)-1
    If $LIST[$J][0]=$DEVICE Then
     $INLIST=True
     $DESC=IniRead(@ScriptDir&'\usbname.ini','USBSTOR',$DEVICE,'')
    EndIf
   Next
   If Not $INLIST Then
    $DESC=InputBox('Идентификация','Введите имя',$DESC)
    IniWrite(@ScriptDir&'\usbname.ini','USBSTOR',$DEVICE,$DESC)
   EndIf
  Next
  Return $DESC
 EndFunc

 Func WM_DEVICECHANGE($hWnd,$Msg,$wParam,$lParam)
  If ($wParam=0x8000) Or ($wParam=0x8004) Then
   Local $DEV_BROADCAST_VOLUME = DllStructCreate('int dbcvsize;int dbcvdevicetype;int dbcvreserved;int dbcvunitmask;ushort dbcvflags',$lParam)
   Local $iDriveType = DllStructGetData($DEV_BROADCAST_VOLUME, 'dbcvdevicetype')
  Else
   Return 'GUI_RUNDEFMSG'
  EndIf
  If $iDriveType <> 0x00000002 Then Return 'GUI_RUNDEFMSG'
  Local $iMask = DllStructGetData($DEV_BROADCAST_VOLUME, 'dbcvunitmask')
  $iMask = Log($iMask) / Log(2)
  Local $iDrive = Chr(65 + $iMask) & ':'
  Switch $wParam
   Case 0x8000
    TrayTip('Подключено',NEW(),5,1)
   Case 0x8004
  EndSwitch
  Return 'GUI_RUNDEFMSG'
 EndFunc

; КОНЕЦ
 
Верх