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

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Автоматическая установка Windows 2000/XP/2003 (http://forum.oszone.net/forumdisplay.php?f=32)
-   -   (solved) RunOnceEx и WHS (http://forum.oszone.net/showthread.php?t=58037)

UnDetect 14-12-2005 17:05 383061

(solved) RunOnceEx и WHS
 
Добрай всем день. Возможно то, о чем я спрошу, уже обсуждалось на форуме, однако я этого, к сожалению, не нашел.

Делаю unattended установку WindowsXP с использованием RunOnceEx. Но CMD формат меня не устраивает в силу того, что мне надо взять значение из HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders\Common Programs и подставить его в HKCU\Environment\COMMONPROGRAMSLNK. Все мои эксперементы с REG COPY закончились ничем в силу того, что я не понял как скопировать ExpandedStringValue из одного ключа реестра в другой. соотвественно в исходнике этот ExpandedStringValue называется Common Programs, а в приемнике COMMONPROGRAMSLNK.
Попробовал JS и VBS, но они в момент установки винды не срабатывали.

Кто что может подсказать на этот предмет?

PS: в RunOnceEx.CMD указать при запуске выполнить VBS скрипт - не прокатит, потому как переопределяются макропеременные, а видны они станут только при следующем логоне.

PPS: как в VBS реализовано вот такое сочетание символов: \"
Тупая подстановка ничего не дает кроме ошибок.
Решение

Vadikan 15-12-2005 01:32 383224

UnDetect
Это видимо вы мне задавали вопрос по эл. почте, забыв упомянуть, что тема уже создана...

Непонятен следующий моемнт.
Цитата:

Но CMD формат меня не устраивает в силу того, что мне надо взять значение из HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders\Common Programs и подставить его в HKCU\Environment\COMMONPROGRAMSLNK.
Что значит надо взять значение? Вы же его можете самостоятельно сформировать импортировав в реестр из cmdlines.txt. Иными словами, вы сами выставляете нужное значение, а раз оно уже известно, то его можно использовать на других этапах. Поясните вопрос.

Если же нужно узнать какое значение находится в определенном ключе реестра, то можно использовать команду FOR в сочетании с REG QUERY. Вот, например, фрагмент из HotFixes Installer VseDoFeni, в котором он определяет установлена ли XP и установлен ли на нее SP2
Код:

FOR /F "usebackq tokens=* delims==" %%i IN (`REG QUERY "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v CurrentVersion`) do set CV=%%i
IF %CV:~-3%==5.1 FOR /F "usebackq skip=4 tokens=4*" %%i IN (`REG QUERY "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v CSDVersion`) do set CSDV=%%j


Petya V4sechkin 15-12-2005 10:16 383281

UnDetect
Цитата:

в RunOnceEx.CMD указать при запуске выполнить VBS скрипт - не прокатит, потому как переопределяются макропеременные, а видны они станут только при следующем логоне.
тут я не совсем понял, если можно - поподробнее.
при следующем логоне - это при втором логоне? или при первом?

UnDetect 15-12-2005 14:45 383401

Petya V4sechkin:
Цитата:

тут я не совсем понял, если можно - поподробнее.
при следующем логоне - это при втором логоне? или при первом?
То, на что наткнулся я: если мы запускаем VBS или JS скриптик с внесением записей в HKCU\Environment (то есть создаем макропеременные типа того же %Temp% и %Tmp%), то они становятся видны пользователю только при следующем логоне. Почему не в этом же - не знаю и ничего сказать не могу. Вот так вот это сделали мелкомягкие.

UnDetect 15-12-2005 15:48 383418

Vadikan:
Цитата:

Непонятен следующий моемнт.
Цитата:
Цитата:

Но CMD формат меня не устраивает в силу того, что мне надо взять значение из HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders\Common Programs и подставить его в HKCU\Environment\COMMONPROGRAMSLNK.
Что значит надо взять значение? Вы же его можете самостоятельно сформировать импортировав в реестр из cmdlines.txt. Иными словами, вы сами выставляете нужное значение, а раз оно уже известно, то его можно использовать на других этапах. Поясните вопрос.
Фишка в том, что в этой строке хранится ссылка на %SYSTEMROOT%\Documents and Settings\All Users\Start Menu\Programs для английской винды и %SYSTEMROOT%\Documents and Settings\All Users\Главное Меню\Программы для русской, не говоря уж про другие языки. Если я перепишу это значение - потеряется ряд ярлыков.

По поводу REG QUERY - ну руки у меня кривые, не могу я подобрать подходящих ключиков. Либо "ERROR: More data is available.", либо "End of search: 0 match(es) found."

Petya V4sechkin 15-12-2005 18:38 383505

UnDetect
Цитата:

Попробовал JS и VBS, но они в момент установки винды не срабатывали.
в момент установки - это когда?
скажем, если в Cmdlines.txt вставить строчку "wscript.exe Myscript.vbs", неужели оно не сработает? Что-то не верится.

Далее, может, вместо "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders\Common Programs" использовать "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders\Common Programs"?

Если так уж хочется через батник, то пожалуйста:
Код:

@Echo Off
SetLocal EnableExtensions
 
ChCP 1251 >nul
For /F "UseBackQ Tokens=3 Delims=        " %%I In (`Reg Query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /V "Common Programs"`) Do Set V=%%I
Reg Add "HKCU\Environment" /V COMMONPROGRAMSLNK /D "%V%" /F >nul
ChCP 866 >nul
 
Exit

В Delims= символ табуляции.
Кодовые страницы приходится менять (иначе крякозябры будут в русской винде).

А если через VBS, то так:
Код:

Dim Sh
Set Sh = WScript.CreateObject("WScript.Shell")
 
Sh.RegWrite "HKCU\Environment\COMMONPROGRAMSLNK", Sh.SpecialFolders("AllUsersPrograms")

Неужели не работает?

UnDetect 15-12-2005 19:05 383519

проверяю вариан "wscript.exe Myscript.vbs"

Сервер сценариев Windows:
Цитата:

Сценарий: C:\$WIN_NT$.~LS\$OEM$\RunOnceEx.vbs
Строка: 26
Символ: 1
Ошибка: Критическая ошибка
Код: 8004100A
Источник: SWbemObjectEx
Ругается как раз на "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders\Common Programs". Буду копать дальше :(

"HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders\Common Programs" не спасает

Petya V4sechkin 15-12-2005 20:58 383564

Надо же..
Кстати, прошу прощения, там же REG_EXPAND_SZ
Ну вот тебе 6 вариантов, хоть один должен работать :)

Если на T-12 не пашут, придется после первого логона запускать. Дело в том, что на T-12 Explorer еще не запущен, поэтому многих записей в реестре попросту не существует.

1) батник:
Код:

@Echo Off
SetLocal EnableExtensions
 
ChCP 1251 >nul
For /F "UseBackQ Tokens=3 Delims=        " %%I In (`Reg Query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /V "Common Programs"`) Do Set V=%%I
Reg Add "HKCU\Environment" /V COMMONPROGRAMSLNK /T REG_EXPAND_SZ /D "%V%" /F >nul
ChCP 866 >nul
 
Exit

2) батник:
Код:

@Echo Off
SetLocal EnableExtensions
 
ChCP 1251 >nul
For /F "UseBackQ Tokens=3 Delims=        " %%I In (`Reg Query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /V "Common Programs"`) Do Set V=%%I
Reg Add "HKCU\Environment" /V COMMONPROGRAMSLNK /T REG_EXPAND_SZ /D "%V%" /F >nul
ChCP 866 >nul
 
Exit

3) батник:
Код:

@Echo Off
Reg Add "HKCU\Environment" /V COMMONPROGRAMSLNK /T REG_EXPAND_SZ /D "%ALLUSERSPROFILE%\Главное меню\Программы" /F >nul
Exit

4) батник:
Код:

@Echo Off
Reg Add "HKCU\Environment" /V COMMONPROGRAMSLNK /T REG_EXPAND_SZ /D "%%ALLUSERSPROFILE%%\Главное меню\Программы" /F >nul
Exit

5) VBS:
Код:

Dim Sh
Set Sh = WScript.CreateObject("WScript.Shell")
 
Sh.RegWrite "HKCU\Environment\COMMONPROGRAMSLNK", Sh.SpecialFolders("AllUsersPrograms"), "REG_EXPAND_SZ"

6) VBS:
Код:

Dim Sh, Env
Set Sh = WScript.CreateObject("WScript.Shell")
Set Env = Sh.Environment("User")
 
Env("COMMONPROGRAMSLNK") = Sh.SpecialFolders("AllUsersPrograms")

Батники все для русской винды, если английская, то поменять соответственно..

UnDetect 16-12-2005 12:21 383729

Батник не пробовал, а вот по VBS имеем следующее:
Цитата:

Сценарий: C:\$WIN_NT$.~LS\$OEM$\RunOnceEx.vbs
Строка: 26
Символ: 1
Ошибка: Объект не поддерживает это свойство или метод: `oReg.SpecialFolders("AllUsersPrograms")`
Код: 800A01B6
Источник: Ошибка выполнения Microsoft VBScript

Petya V4sechkin 17-12-2005 09:26 384023

UnDetect
Вообще-то варианты номер 3 и 4 должны работать по-любому, даже на T-12.
Если ты так любишь VBS, то вот еще парочка:

Код:

Dim Sh
Set Sh = WScript.CreateObject("WScript.Shell")
 
Sh.RegWrite "HKCU\Environment\COMMONPROGRAMSLNK", "%ALLUSERSPROFILE%\Главное меню\Программы", "REG_EXPAND_SZ"

Код:

Dim Sh, Env
Set Sh = WScript.CreateObject("WScript.Shell")
Set Env = Sh.Environment("User")
 
Env("COMMONPROGRAMSLNK") = "%ALLUSERSPROFILE%\Главное меню\Программы"

Второй вариант более правильный. Можно заменить Environment("User") на Environment("System"), тогда это будет системная переменная (живет по адресу HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment).
Для английской винды заменить "Главное меню\Программы" на "Start Menu\Programs".

UnDetect 18-12-2005 23:33 384461

Цитата:

Вообще-то варианты номер 3 и 4 должны работать по-любому, даже на T-12.
Если ты так любишь VBS, то вот еще парочка:
Цитата:

Код:
Dim Sh
Set Sh = WScript.CreateObject("WScript.Shell")
Sh.RegWrite "HKCU\Environment\COMMONPROGRAMSLNK", "%ALLUSERSPROFILE%\Главное меню\Программы", "REG_EXPAND_SZ"
Цитата:

Код:
Dim Sh, Env
Set Sh = WScript.CreateObject("WScript.Shell")
Set Env = Sh.Environment("User")
Env("COMMONPROGRAMSLNK") = "%ALLUSERSPROFILE%\Главное меню\Программы"
Второй вариант более правильный. Можно заменить Environment("User") на Environment("System"), тогда это будет системная переменная (живет по адресу HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment).
Для английской винды заменить "Главное меню\Программы" на "Start Menu\Programs".
Ну не хочу я привязываться к "%ALLUSERSPROFILE%\Главное меню\Программы". В данном случае произойдет привязка к русской версии винды, а я хочу сделать универсальный скрипт, которому будет глубоко фиолетово, какой локализации система. Потому и спрашиваю, как мне подобрать универсальные команды.

Petya V4sechkin 19-12-2005 09:20 384554

UnDetect
Объясню повторно, для особо непонятливых.
Цитирую себя:
Цитата:

Если на T-12 не пашут, придется после первого логона запускать. Дело в том, что на T-12 Explorer еще не запущен, поэтому многих записей в реестре попросту не существует.
Таким образом, когда ты пытаешься получить ключи из HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders\Common Programs, то на T-12 (CMDLINES.TXT) их еще нет. Со всеми вытекающими..

Petya V4sechkin 19-12-2005 10:31 384578

UnDetect
Воспользуйся вариантом номер 6, только запускай его не на T-12, а после первого логона.

UnDetect 19-12-2005 15:04 384691

Цитата:

Воспользуйся вариантом номер 6, только запускай его не на T-12, а после первого логона
Уже все...

Пример скрипта тем, кому оно надо:
Цитата:

Set Shell = WScript.CreateObject("WScript.Shell")

HKCU_CPL = array ("HKCU\Environment\COMMONPROGRAMSLNK","")
NAME = 0
VALUE = 1

HKCU_CPL(VALUE) = Shell.SpecialFolders("AllUsersPrograms")
Shell.RegWrite HKCU_CPL(NAME),HKCU_CPL(VALUE),REG_EXPAND_SZ
Кстати, логическим продолжением данного подхода является и установка софта через Shell.Run ("my_command",0,true)


Время: 06:00.

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