Изменение OEM информации

Материал из OSZone.net wiki.

Перейти к: навигация, поиск
Исправленный и дополненный oeminfo.cmd

Содержание

Описание

Данный файл используется для добавления даты установки (или обновления) системы, а также списка апдейтов в окно "Сведения о поддержке" ("Support Information") при автоматической установке ОС Windows. Перед применением этого файла рекомендуется прочесть статью Изменение OEM информации и логотипа.


Перед Вами новый вариант файла. Теперь список обновлений может быть составлен одним из трех способов: назовем их условно SvcPack, CatRoot, Reg. По ум., используется SvcPack; если маркерный файл не найден - CatRoot; метод Reg нужно задавать принудительно, запустив oeminfo.cmd с ключом /r (или /R).


Ключи командной строки

  • /r - Использовать реестровый метод составления списка обновлений.
  • /k - Добавить серийный номер ОС в файл OEM-информации.
  • /v - Сделать серийный номер ОС видимым в окне "Сведения о поддержке".


Код

! Внимание !
Весь выделенный красным текст должен быть в кодировке ANSI (CP1251), зеленым - не важно (это просто комментарии). Метки выделены фуксином просто для лучшего восприятия кода.
Коричневым цветом я выделил те значения переменных, к-рые Вам захочется или понадобится (возможно) изменить.

@echo off

rem магические слова :)
setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION

rem <--- ОБЪЯВЛЕНИЕ ПЕРЕМЕННЫХ --->
rem полный путь и имя файла oeminfo
set OEMFILE=%SYSTEMROOT%\system32\oeminfo.ini
rem использовать ли реестровый метод для составления списка апдейтов (1 - да; 0 - нет)
set REGMODE=0
rem маркерный файл для определения cdrom-а
set TAGFILE=WIN51
rem производитель
set MANUFACTURER=Sanja Alone
rem модель
set MODEL=Unattended XP DVD
rem кол-во апдейтов в одной строке (по ум. 6)
set UPMAX=6
rem по какой длине выравнивать названия обновлений (по ум. 8)
set UPNAMEL=8
rem вписывать или нет серийник в файл oeminfo (1 - да; 0 - нет)
set KEY=0
rem сделать ли видимым серийник в окне "Сведения о поддержке" (1 - да; 0 - нет)
rem невидимость серийника означает, что он не будет виден в окне "Сведения о поддержке", но в файле OEMINFO он будет в строке SerialNo=
set KEYISVISIBLE=0
rem присвоение переменной CDROM буквы cdrom-а, определенной по маркерному файлу
rem (CDROM-ом считается первый найденный дисковод с маркерным файлом)
for %%d in (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 (if exist "%%d:\%TAGFILE%" set CDROM=%%d:&& goto metka)
:metka
rem каталог с апдейтами и маска для отбора файлов в каталоге апдейтов (*.* - все; *.cat - только каталоги безопасности; KB*.* - только начинающиеся с KB и т.п.)
if defined CDROM (
       set UPDATESDIR=%CDROM%\I386\SVCPACK
       set UPDATESMASK=*.*
) else (
       rem определяем переменную CDROM как каталог на HDD
       rem (если файл oeminfo.cmd у Вас будет не в каталоге $OEM$, 
       rem то измените число обрезаемых от переменной справа символов с 7 на требуемое Вам)
       set CDROM=%~dp0
       set CDROM=!CDROM:~0,-7!
       set UPDATESDIR=%SYSTEMROOT%\system32\CatRoot\{F750E6C3-38EE-11D1-85E5-00C04FC295EE}
       set UPDATESMASK=KB*.*
)

rem Определение версии REG.EXE
for /F "tokens=1" %%j in ('reg 2^>nul') do if "%%j"=="REG" set REGEXE=rus

rem Обеспечение правильности отработки мультизагрузочного CD/DVD
if exist "%CDROM%\I386\winn?.sif" (
       set WINNTSIF=%CDROM%\I386\winn?.sif
) else (
       if defined REGEXE (
for /F "tokens=3 delims=	" %%j in ('reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v SourcePath') do set SrcP=%%j
       ) else (
               for /F "tokens=3 delims= " %%j in ('reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v SourcePath') do set SrcP=%%j
       )
       if exist "!SrcP!\winn?.sif" set WINNTSIF=!SrcP!\winn?.sif
)
rem <--- ОКОНЧАНИЕ ОБЪЯВЛЕНИЯ ПЕРЕМЕННЫХ --->

rem язык (419 - рус.), а также название, пакет обновлений, версия и сборка ОС
rem !ВАЖНО! - в кач-ве разделителя нужно указать только символ табуляции для 
rem русской версии REG.EXE и только пробел для английской
if defined REGEXE (
for /F "tokens=3 delims=	" %%j in ('reg query "HKCU\Control Panel\International" /v Locale') do set lang=%%j
for /F "tokens=3 delims=	" %%j in ('reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v ProductName') do set PN=%%j
for /F "tokens=3 delims=	" %%j in ('reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v CSDVersion') do set CSDV=%%j
for /F "tokens=3 delims=	" %%j in ('reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v CurrentVersion') do set CV=%%j
for /F "tokens=3 delims=	" %%j in ('reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v BuildLab') do set BUILD=%%j
) else (
for /F "tokens=3 delims= " %%j in ('reg query "HKCU\Control Panel\International" /v Locale') do set lang=%%j
for /F "tokens=3* delims= " %%j in ('reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v ProductName') do set PN=%%j %%k
for /F "tokens=3* delims= " %%j in ('reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v CSDVersion') do set CSDV=%%j %%k
for /F "tokens=3 delims= " %%j in ('reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v CurrentVersion') do set CV=%%j
for /F "tokens=3 delims= " %%j in ('reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v BuildLab') do set BUILD=%%j
)

rem Анализ командной строки
for /F %%j in ('echo.%* ^| find /i /c "/k"') do if %%j GTR 0 set KEY=1
for /F %%j in ('echo.%* ^| find /i /c "/v"') do if %%j GTR 0 set KEYISVISIBLE=1
for /F %%j in ('echo.%* ^| find /i /c "/r"') do if %%j GTR 0 set REGMODE=1

rem Т.к. используется символ ">", то существующий файл OEMFILE будет перезаписан;
rem т.о. нет нужды его предварительно удалять
echo [General]> "%OEMFILE%"
echo Manufacturer=%MANUFACTURER%>> "%OEMFILE%"
echo Model=%MODEL%>> "%OEMFILE%"

rem Достаем из winn?.sif серийный номер
rem Это работает независимо от вида записи ProductKey=XXXX или ProductKey = XXXX (с пробелами)
if defined WINNTSIF (
       if %KEY% == 1 (
               for /F "tokens=3 delims==] " %%j in ('find /I /N "ProductKey" "%WINNTSIF%"') do set PK=%%j
       )
)

rem вспомогательные переменные
set i=1
set l=0
set c=0
set n=0

if %REGMODE% == 1 (
       rem Все обновления, установленные в системе 
       rem (отбираются по подветкам; повторяющиеся эл-ты исключаются)
       for /F "tokens=5* delims=\" %%j in ('reg query "HKLM\SOFTWARE\Microsoft\Updates" /s ^| findstr /i /v "REG_ FileList"') do (
               if %ERRORLEVEL%==0 (
                       for /F "usebackq tokens=3 delims=\" %%m in ('%%j\%%k') do (
                               rem !ВАЖНО! - в следующей строке после %%m должно быть не меньше UPNAMEL-1 пробелов
                               rem (это нужно для выравнивания списка обновлений при наличии апдейтов с короткими названиями - WGA, IE7)
                               set tmp=%%m          
                               set tmp=!tmp:~0,%UPNAMEL%!
                               set kb[!tmp!]=!tmp:~2,6!
                       )
                       rem учет обновлений .Net 2.0
                       for /F "tokens=2 delims=\" %%m in ('echo %%j\%%k^| findstr /i /c:" .NET"') do (
                               set tmp=%%m          
                               set tmp=!tmp:~0,%UPNAMEL%!
                               set kb[!tmp!]=!tmp:~2,6!
                       )
               )
       )
       rem Обновления, перечисленные в ветке Uninstall (начиннающиеся с KB + 6 цифр)
       for /F "tokens=7 delims=\" %%m in ('reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" ^| findstr /i "\<KB[0-9][0-9][0-9][0-9][0-9][0-9]"') do (
               set tmp=%%m          
               set tmp=!tmp:~0,%UPNAMEL%!
               set kb[!tmp!]=!tmp:~2,6!
       )
       
       rem Определяем общее количество обновлений
       for /F %%j in ('set kb[') do set /A n+=1
       
       call :suppinfo
       
       rem Сортировка и перенос списка обновлений в файл, указанный в переменной OEMFILE
       for /F "tokens=2 delims=[]" %%j in ('set kb[ ^| sort') do (set kbname=%%j&& call :myprint)
) else (
       rem Определение общего кол-ва файлов в каталоге апдейтов соотв-щих маске
       for /F %%j in ('dir /b /a:-d "%UPDATESDIR%\%UPDATESMASK%"') do set /A n+=1
       
       call :suppinfo
       
       rem Список апдейтов (имена всех файлов без расширений; имена выравниваются по длине до UPNAMEL символов)
       for /F "tokens=1 delims=." %%j in ('dir /b /a:-d "%UPDATESDIR%\%UPDATESMASK%"') do (set kbname=%%j&&set kbname=!kbname!          &&set kbname=!kbname:~0,%UPNAMEL%!&& call :myprint)
)
rem Выход из этого пакетного файла.
rem Команда GOTO принимает в качестве метки перехода строку :EOF, которая вызывает
rem передачу управления в конец текущего пакетного файла. Это позволяет легко
rem выйти из пакетного файла без определения каких-либо меток. (из справки по goto)
goto :EOF

:myprint
if !c! == 0 (
       set str=!kbname!
) else (
       set str=!str!  !kbname!
)

set /A c+=1

if !c! == %UPMAX% (
       echo Line!i!=!str!>> "%OEMFILE%"
       set /A i+=1
       set /A l+=1
       set str=
       set c=0
       set /A tmp=n-l*UPMAX
) else (
       if %n% LSS %UPMAX% (
               if !c! == %n% (
                       echo Line!i!=!str!>> "%OEMFILE%"
               )
       )
       if !tmp! LSS %UPMAX% (
               if !c! == !tmp! (
                       echo Line!i!=!str!>> "%OEMFILE%"
               )
       )
)
goto :EOF

:suppinfo
if defined PK (
       if %KEYISVISIBLE% == 0 (
               echo [OEMSpecific]>> "%OEMFILE%"
               echo SerialNo=%PK%>> "%OEMFILE%"
               )
       )
)

echo [Support Information]>> "%OEMFILE%"
if %lang% == 00000419 (
        echo Line!i!=ОС:%PN:Microsoft=% %CSDV:Service Pack=SP% версия %CV% сборка %BUILD%>> "%OEMFILE%"
) else (
        echo Line!i!=OS:%PN:Microsoft=% %CSDV:Service Pack=SP% version %CV% build %BUILD%>> "%OEMFILE%"
)
set /A i+=1

if defined PK (
       if %KEYISVISIBLE% == 1 (
               if %lang% == 00000419 (
                       echo Line!i!=Ключ продукта: %PK%>> "%OEMFILE%"
               ) else (
                       echo Line!i!=Product Key: %PK%>> "%OEMFILE%"
               )
               set /A i+=1
       )
)
echo Line!i!=>> "%OEMFILE%"
set /A i+=1

rem Дата и время инсталляции ОС в формате DD.MM.YYYY (hh:mm), например 20.05.2005 (14:37)
rem !!!!!!!!!!!!!!!!!!!!!!!!!!!
rem Вы можете добавить дополнительную инф-цию для отображения в окне "Сведения о поддержке" 
rem в рус. и/или анг. версии (для вставки пустой строки исп-те команду echo Line!i!=>> "%OEMFILE%"
rem ; и не забывайте ставить set /A i+=1 перед каждой строкой)
rem !!!!!!!!!!!!!!!!!!!!!!!!!!!
for /F %%t in ('time/T') do set T=%%t
if %lang% == 00000419 (
       echo Line!i!=Дата и время установки ^(обновления^): %date% ^(%T%^)>> "%OEMFILE%"
       set /A i+=1
       echo Line!i!=>> "%OEMFILE%"
       rem Пример добавления своих строк
       rem set /A i+=1
       rem echo Line!i!=Ваша информация>> "%OEMFILE%"
       set /A i+=1
       echo Line!i!=Установленные компоненты и обновления ^(%n%^):>> "%OEMFILE%"
) else (
       echo Line!i!=Installation ^(updation^) date and time: %date% ^(%T%^)>> "%OEMFILE%"
       set /A i+=1
       echo Line!i!=>> "%OEMFILE%"
       rem Example for adding custom information
       rem set /A i+=1
       rem echo Line!i!=Your information>> "%OEMFILE%"
       set /A i+=1
       echo Line!i!=Installed Components and Updates ^(%n%^):>> "%OEMFILE%"
)
set /A i+=1
echo Line!i!=>> "%OEMFILE%"
set /A i+=1
goto :EOF


История изменений

С этого все начиналось: тема на MSFN

Затем я, Sanja Alone, решил расширить функциональность путем внедрения метода CatRoot (предложил ANDYru, а YuriPet скрестил его с моим тогдашним файлом). Немного позже, alcos, основываясь на патчере VseDoFeNi, представил свой oeminfo.cmd. YuriPet снова скомбинировал этот файл с моим (приговорив при этом метод CatRoot). В конце концов, я решил собрать все воедино. Правда, реестровый метод я переписал с нуля, взяв за основу более правильную ветку реестра и избавив его от необходимости работы посредством временных файлов. Пока это все :)

  • 2006-11-05
    • Учтены обновления, перечисленные в ветке Uninstall (начинающиеся с KB + 6 цифр).
  • 2006-11-04
    • Можно указать по какой длине выравнивать названия обновлений - 8 символов по ум. (определяется переменной UPNAMEL).
    • Буквы M, S, Q в названиях обновлений больше не заменяются на KB.
  • 2006-11-01
    • Решена проблема с обновлениями .Net 2.0. Теперь они также попадают в список.
  • 2006-10-31
    • Введен анализ командной строки (можно использовать ключи /k, /v, /r).
    • Файл правильно работает как с русской, так и с английской версией REG.EXE.
    • Названия обновлений выравниваются по длине в 8 символов при любом методе составления списка.
  • 2006-10-30
    • В список попадают все обновления ветки HKLM\SOFTWARE\Microsoft\Updates.
    • Если название обновления короче 8 символов, то оно дополняется пробелами до этой длины (нужно для выравнивания списка в окне "Сведения о поддержке").
  • 2006-10-29
    • При отсутствии файла winn?.sif по базовому пути производится попытка определения файла на основе пути из параметра реестра SourcePath.
  • 2006-10-27
    • Реализован реестровый метод (Reg) составления списка обновлений (запускайте файл с ключом /r или /R).
    • Расширена выводимая информация об ОС.
    • Появилась возможность дополнить отображаемую инф-цию своими строками (ищите в файле текст "Пример добавления своих строк").
    • Проведена оптимизация (выброшены н-рые лишние операции, н-рые заменены более продуктивными).
  • 2006-10-10
    • Оптимизирован цикл определения CDROM-а (CDROM-ом считается первый найденный дисковод с маркерным файлом).
  • 2006-09-19
    • Код работоспособен на любом этапе установки ОС (проблемы с cmdlines.txt решены).
    • При ненахождении маркерного файла, переменная CDROM устанавливается равной пути запуска файла oeminfo.cmd без 7 последних символов \$OEM$\ (в кач-ве альтернативы, можно было бы брать путь из параметра SourcePath в реестре, но этот способ менее универсален). В данном сл. для составления списка обновлений исп-ся метод CatRoot.
    • Записи в "Сведениях о поддержке" теперь соответствуют языку локали ОС.
    • В конце строки "Установленные компоненты и обновления" ("Installed Components and Updates") в скобках отображается общее к-во обновлений.


Ссылки

Скачать файл: Rar_icon.png OEMINFO.cmd Info_circle.png

Тема на форуме: Добавление OEM информации


Sanja Alone 05:53, 5 ноября 2006 (MSK)

Личные инструменты