Показать полную графическую версию : [решено] Перевод серийного номера из 16-ричного значения в символьную строку
Dragokas
25-03-2013, 03:55
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
Актуально.
Foreigner
28-03-2013, 22:31
Выдает серийный номер в 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
Foreigner, это хороший вопрос.
Вероятно, понадобится система Win 7 x64 ru или подобная.
Завтра проверю на работе на XP.
Я ошибся. VBScript тоже выдает в таком формате (просто запускал Scriptomatic с повышенными правами).
У меня в консоли вот что показывает (вывод от 4 ЖД): http://s8.postimg.org/uv74wg37p/Phys_Media_Rights_off.png
P.S. проблема частично решена. WMI выдает верные данные, если консоль запускать в режиме повышенных прав: http://s10.postimg.org/73xf4h3ax/Phys_Media_Rights_on.png
А вот этот вывод: 2020202020202020202020203157304641444b57 - я вообще не знаю, содержит ли туже самую строку, или является просто мусором.
Доп. вопрос: SN диска типа SSD определился неверно. Знаете ли другой класс или метод, которым можно попробовать вытянуть верный серийник?
Dragokas
29-03-2013, 01:05
Доп.: с SSD похоже разобрался: http://www.intel.com/support/ru/mt/mt_win.htm
Т.е. S/N на упаковке этих дисков так называемый Secure S/N и не соответствует обычному S/N.
Dragokas
29-03-2013, 17:39
Сегодня проверил на XP и расстроился. Пробовал и от имени главного Администратора (через Runas) с заданием пароля - все равно выдает серийник в этом странном 16-ричном формате. Ну что ему еще сделать?
Dragokas
29-03-2013, 21:34
Помогли на другом форуме:
Преобразование идет попарно HEX -> 10-ричная СС -> Chr
Нет ли готового скрипта для этого?
CyberDaemon
29-03-2013, 23:00
0x2020202020202020202020203157304641444b57 == "<12 пробелов>1W0FADKW" != "W1F0DAWK", т.е. оно "little endian" и там еще нужно байты попарно менять местами.
Dragokas
30-03-2013, 02:14
Спасибо. Готово.
@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
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.