Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Получение серийного номера всех съемных устройств и физических жестких дисков (http://forum.oszone.net/showthread.php?t=257450)

Dragokas 30-03-2013 02:37 2121968

Получение серийного номера всех съемных устройств и физических жестких дисков
 
Вложений: 2
Выкладываю полезное решение.

Получение серийного номера всех съемных устройств и физических жестких дисков (не разделов).
Получение имен разделов физических накопителей (кроме оптических).


Код:

@echo off&:: by Alex Dragokas
Setlocal EnableDelayedExpansion EnableExtensions
Echo.
::Получаем PNPDeviceID и PhysicalDrive Name устройств, подключенных по интерфейсу USB
echo Перечень cъемных накопителей:
echo.
For /F "Skip=2 Tokens=2-4 delims=," %%i In (
  'WMIC DiskDrive Where InterfaceType^="USB" Get Name^,PNPDeviceID^,Model /Value /format:csv 2^>nul'
) do (
    Set AtLeastOneDevice=true
    Call :Get_USB_SN "%%k" Device_SN
    Call :GetPartition "%%j" Drives
    Echo Model: %%i
    Echo %%j
    Echo Disk^(s^):                !Drives!
    Echo Device S/N:                  "!Device_SN!"
    Echo.
)
if not defined AtLeastOneDevice Echo Съемных USB накопителей не обнаружено.
Echo.
Echo Перечень жестких дисков:
Echo.
For /F "Skip=2 Tokens=2-4 delims=," %%i In (
  'WMIC DiskDrive Where "InterfaceType^!^='USB'" Get Name^,PNPDeviceID^,Model /Value /format:csv'
) do (
    Call :GetPartition "%%j" Drives
    Call :Get_HDD_SN "%%j" Device_SN
    Echo Model: %%i
    Echo %%j
    Echo Disk^(s^):                !Drives!
    Echo Device S/N:                  "!Device_SN!"
    Echo "!Device_SN!">>%~dp0file.txt
    Echo.
)
pause>nul
Goto :eof

::Парсим часть с серийным номером устройства
:Get_USB_SN %1-in.PNPDeviceID %2-out.Device_S/N
  Set "%~2="
  Set "PNP=%~1"
  Set "PNP=%PNP:\=" "%"
  Set "PNP=%PNP:;=" "%"
  Set "PNP=%PNP:&=" "%"
  Set _Prev=
  For %%i in ("%PNP%") do (
    if "!_Prev:~0,4!"=="REV_" (Set "%~2=%%~i"& Exit /B)
    Set "_Prev=%%~i"
  )
  Exit /B

:Get_HDD_SN %1.in-PhysicalDrive_Name %2-out.Device_S/N
  Set "tag=%~1"
  Set "tag=%tag:\=\\%"
  For /F "UseBackQ skip=2 tokens=2 delims=," %%i In (
    `wmic path Win32_PhysicalMedia where "tag='%tag%'" Get SerialNumber /format:csv`
  ) do call set "_serial=%%i"
  ::Выше используется Call, чтобы удалить служебный символ 0x0D из переменной
  set "_serial=%_serial: =%"
  ::Проверяем признак 16-ричного кода (ответ длинной 40 символов)
  if "%_serial:~39,1%" neq "" Call :Hex_To_String "%_serial%" "_serial"
  set "%~2=%_serial%"
  Exit /B

:Hex_To_String %1-in.Reversed.Hex.Number %2-out.String
  SetLocal& set "x16=%~1"
  set n=45
  for %%A in (- . / 0 1 2 3 4 5 6 7 8 9) do set s.!n!=%%A& set /a n+=1
  set n=65
  for %%A in (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z) do set s.!n!=%%A& set /a n+=1
  set n=97
  for %%A in (a b c d e f g h i j k l m n o p q r s t u v w x y z) do set s.!n!=%%A& set /a n+=1
  set xs=
  for /L %%C in (0,4,8184) do (
    if "!x16:~%%C,1!"=="" goto _ex_Hex
    set /A cplus=%%C+2
    call set /A x10=0x%%x16:~!cplus!,2%%
    call set xs=!xs!%%s.!x10!%%
    set /A x10=0x!x16:~%%C,2!
    call set xs=!xs!%%s.!x10!%%
  )
  :_ex_Hex
  EndLocal& set "%~2=%xs%"& Exit /B

::Конвертация PhysicalDrive Name -> Partition Names -> Drive Names
  :GetPartition %1.in-PhysicalDrive_Name %2-out.Drive_Names
  Set "%~2="
  For /F "skip=2 delims==, tokens=3,6-7" %%i In (
    'WMIC path Win32_DiskDriveToDiskPartition get /format:csv'
  ) do (
    if %%i=="%~1" (
      For /F "skip=2 delims==, tokens=3-4,7" %%I In (
        'WMIC path Win32_LogicalDiskToPartition get Antecedent^,Dependent /format:csv'
      ) do (
        if "%%I,%%J"=="%%j,%%k" Set "%~2=!%~2! %%K"
  )))
  Exit /B



Время: 01:00.

Время: 01:00.
© OSzone.net 2001-