Показать полную графическую версию : (solved) RunOnceEx и WHS
UnDetect
14-12-2005, 17:05
Добрай всем день. Возможно то, о чем я спрошу, уже обсуждалось на форуме, однако я этого, к сожалению, не нашел.
Делаю 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 реализовано вот такое сочетание символов: \"
Тупая подстановка ничего не дает кроме ошибок.[hr]Решение (http://forum.oszone.net/showpost.php?p=384691&postcount=14)
UnDetect
Это видимо вы мне задавали вопрос по эл. почте, забыв упомянуть, что тема уже создана...
Непонятен следующий моемнт.Но CMD формат меня не устраивает в силу того, что мне надо взять значение из HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders\Common Programs и подставить его в HKCU\Environment\COMMONPROGRAMSLNK.Что значит надо взять значение? Вы же его можете самостоятельно сформировать импортировав в реестр из cmdlines.txt. Иными словами, вы сами выставляете нужное значение, а раз оно уже известно, то его можно использовать на других этапах. Поясните вопрос.
Если же нужно узнать какое значение находится в определенном ключе реестра, то можно использовать команду FOR в сочетании с REG QUERY. Вот, например, фрагмент из HotFixes Installer (http://unacreator.elitecom.ru/index.php?subaction=showfull&id=1116926500&archive=&start_from=&ucat=&) 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
UnDetect
в RunOnceEx.CMD указать при запуске выполнить VBS скрипт - не прокатит, потому как переопределяются макропеременные, а видны они станут только при следующем логоне.
тут я не совсем понял, если можно - поподробнее.
при следующем логоне - это при втором логоне? или при первом?
UnDetect
15-12-2005, 14:45
Petya V4sechkin:
тут я не совсем понял, если можно - поподробнее.
при следующем логоне - это при втором логоне? или при первом?
То, на что наткнулся я: если мы запускаем VBS или JS скриптик с внесением записей в HKCU\Environment (то есть создаем макропеременные типа того же %Temp% и %Tmp%), то они становятся видны пользователю только при следующем логоне. Почему не в этом же - не знаю и ничего сказать не могу. Вот так вот это сделали мелкомягкие.
UnDetect
15-12-2005, 15:48
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
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
проверяю вариан "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
Надо же..
Кстати, прошу прощения, там же 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
Батник не пробовал, а вот по VBS имеем следующее:
Сценарий: C:\$WIN_NT$.~LS\$OEM$\RunOnceEx.vbs
Строка: 26
Символ: 1
Ошибка: Объект не поддерживает это свойство или метод: `oReg.SpecialFolders("AllUsersPrograms")`
Код: 800A01B6
Источник: Ошибка выполнения Microsoft VBScript
Petya V4sechkin
17-12-2005, 09:26
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
Вообще-то варианты номер 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
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
UnDetect
Воспользуйся вариантом номер 6, только запускай его не на T-12, а после первого логона.
UnDetect
19-12-2005, 15:04
Воспользуйся вариантом номер 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)
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.