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

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

Dragokas 25-03-2013 03:55 2117856

Перевод серийного номера из 16-ричного значения в символьную строку
 
Код:

wmic path Win32_PhysicalMedia where "tag like '%Drive0%'" Get Tag,SerialNumber
Выдает серийный номер в 16-ричном формате, в отличие от VBScript
2020202020202020202020203157304641444b57
а должно быть W1F0DAWK

1) Хотелось бы знать почему консольная WMIC себя так ведет?
2) Главный вопрос: как элегантно перевести в символьную строку. Есть же там команды на подобие
Код:

Set /A x=0x3A
, правда не совсем то.
3) Этот класс некорректно определяет серийные номера USB-устройств.
Но ничего страшного, обойдусь парсингом PNPDevice класса DiskDrive. Но вот проблема (хоть и не критичная),
если задать команду
Код:

wmic path Win32_PhysicalMedia Get SerialNumber
я получу ответ Invalid XML Request, потому что в серийный номер USB уст-ва закрался непечатаемый символ.
Возможно ли от этого уйти, не используя ключевое слово Where?

Заранее благодарен за ответы.

Dragokas 28-03-2013 21:43 2121032

Актуально.

Foreigner 28-03-2013 22:31 2121069

Цитата:

Цитата Diskretor
Выдает серийный номер в 16-ричном формате »

Как воспроизвести?
Код:

> wmic path Win32_PhysicalMedia where "tag like '%Drive0%'" Get Tag,SerialNumber
SerialNumber          Tag                                                       
110310PBN418M7JRREVE  \\.\PHYSICALDRIVE0

> wmic path Win32_PhysicalMedia Get SerialNumber
SerialNumber                                     
110310PBN418M7JRREVE


Dragokas 28-03-2013 23:05 2121088

Foreigner, это хороший вопрос.

Вероятно, понадобится система Win 7 x64 ru или подобная.
Завтра проверю на работе на XP.

Я ошибся. VBScript тоже выдает в таком формате (просто запускал Scriptomatic с повышенными правами).

У меня в консоли вот что показывает (вывод от 4 ЖД):

P.S. проблема частично решена. WMI выдает верные данные, если консоль запускать в режиме повышенных прав:
А вот этот вывод: 2020202020202020202020203157304641444b57 - я вообще не знаю, содержит ли туже самую строку, или является просто мусором.

Доп. вопрос: SN диска типа SSD определился неверно. Знаете ли другой класс или метод, которым можно попробовать вытянуть верный серийник?

Dragokas 29-03-2013 01:05 2121161

Доп.: с SSD похоже разобрался: http://www.intel.com/support/ru/mt/mt_win.htm
Т.е. S/N на упаковке этих дисков так называемый Secure S/N и не соответствует обычному S/N.

Dragokas 29-03-2013 17:39 2121627

Сегодня проверил на XP и расстроился. Пробовал и от имени главного Администратора (через Runas) с заданием пароля - все равно выдает серийник в этом странном 16-ричном формате. Ну что ему еще сделать?

Dragokas 29-03-2013 21:34 2121786

Помогли на другом форуме:

Преобразование идет попарно HEX -> 10-ричная СС -> Chr
Нет ли готового скрипта для этого?

CyberDaemon 29-03-2013 23:00 2121862

0x2020202020202020202020203157304641444b57 == "<12 пробелов>1W0FADKW" != "W1F0DAWK", т.е. оно "little endian" и там еще нужно байты попарно менять местами.

Dragokas 30-03-2013 02:14 2121958

Спасибо. Готово.

Код:

@echo off
Setlocal EnableExtensions EnableDelayedExpansion

set x16=434f2d5a3238585741315758374437454f303856
Call :Hex_To_String "%x16%" str
echo.%str%

pause>nul
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



Время: 14:48.

Время: 14:48.
© OSzone.net 2001-