Изменение OEM информации
Материал из OSZone.net wiki.
Содержание |
Описание
Данный файл используется для добавления даты установки (или обновления) системы, а также списка апдейтов в окно "Сведения о поддержке" ("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") в скобках отображается общее к-во обновлений.
Ссылки
Скачать файл:
OEMINFO.cmd
Тема на форуме: Добавление OEM информации
Sanja Alone 05:53, 5 ноября 2006 (MSK)
