1 (изменено: wisgest, 2013-01-17 02:33:24)

Тема: VBS: Запуск REGEDIT.EXE на заданном разделе реестра

Предлагаю скрипт, которым часто пользуюсь сам: простой (никакого высшего и даже среднего пилотажа), но полезный, являющийся воплощением идеи:

Если вспомнить, что regedit открывается всегда на том же ключе, на котором мы его спозиционировали в предыдущем сеансе работы, и найти ключик, в котором он сохраняет это местоположение, то задачу открытия regedit на любом заданном ключе можно очень сильно упростить.
Вся процедура открытия будет сводится к 2 этапам:
1. Загоняем в ключ HKCU\Software\Microsoft\Windows\CurrentVersion\Applets\Regedit\Lastkey значение ветки, которую нам необходимо открыть.
2. Запускаем regedit.
Работает это исключительно быстро.

Однако, этот совет не сработает, если REGEDIT.EXE уже запущен (в том числе от имени другого пользователя). Поэтому, запускаем его с ключом  /m:

Ключи и параметры запуска стандартных приложений

__________
Редактор реестра regedit.exe.
regedit.exe [параметр] [имя файла]

/m - Запускает новый экземпляр Редактора реестра  в отдельном процессе (начиная с Windows XP и выше)

и эта казавшаяся вынужденной мера оказывается исключительным удобством, позволяющим, например, в двух окнах REGEDIT.EXE просматривать взаимосвязаные ProgId и ClassId или сравнивать одинаковые разделы реестра у разных пользователей.


Путь к открываемому разделу реестра можно передавать скрипту как аргумент командной строки или вводить в диалоговом окне InputBox(). Если путь начинается непосредственно с имени корневогого раздела реестра (без указания перед ним компьютера), то имя корневого раздела можно сокращать (HKCR, HKCU, HKLM, HKU, HKCC), но при этом обязательно после сокращенного имени ставить «\», даже если после него ничего больше не идёт.

Скрипт позволяет запускать редактор реестра от имени другого пользователя: для этого перед путём к разделу реестра надо поставить знак «+», после чего будет показан стандартный диалог запуска приложения от имени другого пользователя. Если после «+» не указать путь к разделу реестра, то скрипт просто будет перезапущен от имени другого пользователя (чтобы не заблудиться, имя пользователя показывается в заголовке окна).

' RegJump.vbs
LastKeyPath = "HKEY_CURRENT_USER\" & _
  "Software\Microsoft\Windows\CurrentVersion\Applets\Regedit\LastKey"
Set WshShell = CreateObject("WScript.Shell")
On Error Resume Next
LastKey = WshShell.RegRead(LastKeyPath)
On Error GoTo 0
If WScript.Arguments.Count <> 0 Then RegPath = Trim(WScript.Arguments.Item(0))
If RegPath = "" Then
  RegPath = InputBox( _
    "Открыть REGEDIT.EXE (новое окно) на указанном разделе реестра" & _
      vbNewLine & vbNewLine & _
      "(для запуска этого сценария от имени другого пользователя " & _
      "введите или добавте в начале пути к разделу ""+"" ):", _
    WScript.ScriptName & _
      " [" & CreateObject("WScript.Network").UserName & "]", _
    LastKey)
End If
If Not IsEmpty(RegPath) Then
  RegPath = Trim(RegPath)
  If Left(RegPath, 1) = "+" Then
    CreateObject("Shell.Application").ShellExecute _
      WScript.FullName, _
      """" & WScript.ScriptFullName & """ " & _
        """" & Right(RegPath, Len(RegPath) - 1) & """",, _
      "RunAs"
  Else
    If UCase(Left(RegPath, 5)) = "HKCR\" Then
      RegPath = "HKEY_CLASSES_ROOT\" & Right(RegPath, Len(RegPath) - 5)
    ElseIf UCase(Left(RegPath, 5)) = "HKCU\" Then
      RegPath = "HKEY_CURRENT_USER\" & Right(RegPath, Len(RegPath) - 5)
    ElseIf UCase(Left(RegPath, 5)) = "HKLM\" Then
      RegPath = "HKEY_LOCAL_MACHINE\" & Right(RegPath, Len(RegPath) - 5)
    ElseIf UCase(Left(RegPath, 4)) = "HKU\" Then
      RegPath = "HKEY_USERS\" & Right(RegPath, Len(RegPath) - 4)
    ElseIf UCase(Left(RegPath, 5)) = "HKCC\" Then
      RegPath = "HKEY_CURRENT_CONFIG\" & Right(RegPath, Len(RegPath) - 5)
    End If
    If Right(RegPath, 1) = "\" Then RegPath = Left(RegPath, Len(RegPath) - 1)
    If RegPath <> LastKey Then
      WshShell.RegWrite LastKeyPath, RegPath, "REG_SZ"
    End If
    WshShell.Run "%windir%\regedit.exe /m" '/m - start new process
  End If
End If

Скрипт особенно удобно использовать, если создать на него ярлык и назначить ему сочетание клавиш по своему вкусу (например, Ctrl+Alt+R), сам ярлык можно запрятать в меню «Пуск» в папку второго-третьего уровня, чтобы не мешался перед глазами (можно для подобных ярлыков выделить отдельную папку).

Известная проблема: Из-за невозможности в WSH передачи кавычек в аргументах командной строки не получится в пакетном режиме или от имени другого пользователя открыть раздел, содержащий в пути кавычки, что, к счастью, встречается крайне нечасто.

2

Re: VBS: Запуск REGEDIT.EXE на заданном разделе реестра

wisgest пишет:

Скрипт позволяет запускать редактор реестра от имени другого пользователя: для этого перед путём к разделу реестра надо поставить знак «+», после чего будет показан стандартный диалог запуска приложения от имени другого пользователя.

Делаю батник со строкой

wscript regJump.vbs +

, но почему-то не получается получить диалог ввода логина. Пробовал и с указанием пути перед "плюсом" и без, но после подтверждения открываемого пути - редактор запускается  от текущего пользователя.
Win7. UAC и включал и выключал.

WBR. Roman

3

Re: VBS: Запуск REGEDIT.EXE на заданном разделе реестра

А в Windows7 в контекстном меню исполняемых файлов присутствует ли такой пункт «Запуск по имени...» (в предложенном скрипте всё основывается на нём)? Я его не увидел, есть только «Запуск от имени Администратора». Получается, что программу от имени любого другого пользователя запустить нельзя?

4

Re: VBS: Запуск REGEDIT.EXE на заданном разделе реестра

С Shift'ом посмотреть. А может и убрали.

5

Re: VBS: Запуск REGEDIT.EXE на заданном разделе реестра

Нет, в меню с шифтом присутствует пункт "Запуск от имени другого пользователя".

6 (изменено: Kiber, 2015-04-03 15:54:27)

Re: VBS: Запуск REGEDIT.EXE на заданном разделе реестра

Хотел было опубликовать в коллекцию, но вовремя нашел эту тему.

VBScript: открытие редактора реестра на заданном ключе, RegJump

' Поставляемая часть {

Class classObjects
    Public WSShell
    Public RegExp

    Private Sub Class_Initialize
        Set WSShell = WScript.CreateObject("Wscript.Shell")
        Set RegExp = CreateObject("VBScript.RegExp")
    End Sub

End Class

Function RegJump(Objects, Key, WaitForReturn)
    Objects.RegExp.Pattern = "^HKLM\\"
    Key = Objects.RegExp.Replace(Key, "HKEY_LOCAL_MACHINE\")
    
    Objects.RegExp.Pattern = "^HKCU\\"
    Key = Objects.RegExp.Replace(Key, "HKEY_CURRENT_USER\")
    
    Objects.RegExp.Pattern = "^HKCR\\"
    Key = Objects.RegExp.Replace(Key, "HKEY_CLASSES_ROOT\")
    
    Objects.RegExp.Pattern = "^HKU\\"
    Key = Objects.RegExp.Replace(Key, "HKEY_USERS\")

    Objects.RegExp.Pattern = "^HCC\\"
    Key = Objects.RegExp.Replace(Key, "HKEY_CURRENT_CONFIG\")

    Objects.RegExp.Pattern = "\\\\"
    Key = Objects.RegExp.Replace(Key, "\")
    
    LastKey = "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Applets\Regedit\Lastkey"
    LastValue = Objects.WSShell.RegRead(LastKey)
    
    Objects.RegExp.Pattern = "\\.+"
    HostName = Objects.RegExp.Replace(LastValue, "")
    Key = HostName & "\" & Key
    
    Call Objects.WSShell.RegWrite(LastKey, Key, "REG_SZ")
    RegJump = Objects.WSShell.Run("regedit /m", 1, WaitForReturn)
End Function

' } Поставляемая часть

' Пример {

Sub Main()
    Set Objects = New classObjects
    
    'Чтение первого параметра
    Key = ""
    Set Arguments = WScript.Arguments
    If Arguments.Count > 0 Then
        Key = Arguments(0)
    End If
    If Key = "" Then
        Call MsgBox("Example:" & vbCrLf & WScript.ScriptName & " HKCU\Software\Microsoft", , "Parameter 1 is required")
        Exit Sub
    End If
    
    Call RegJump(Objects, Key, True)
End Sub

Call Main()

' } Пример

За основу был взят скрипт на JS.
Но я решил что убивать процесс - бесчеловечно, поэтому нашел ключ /m.
На w7 без UAC работает.

Todo:
- Проверить как будет работать если в пути к ветке реестра будут пробелы.

См. также:
Аналогичные темы на сером форуме по данной задаче на других языках (найдены поиском по "CurrentVersion\Applets\Regedit\Lastkey", также как и эта):
Коллекция скриптов и идей → WSH: автом. позиционирование в окне Regedit.exe на нужном параметре
Общение → JScript: переход в указанный раздел реестра
Общение → AHK: Навигация в редакторе реестра regedit.exe

7

Re: VBS: Запуск REGEDIT.EXE на заданном разделе реестра

Что касается проблемы кавычек, то решается сопоставлением текущего процесса с данными из WMI. Так, по идентификатору процесса получаем полную командную строку.

8

Re: VBS: Запуск REGEDIT.EXE на заданном разделе реестра

Добавлю до кучи свой вариант.
Принимает ключ и из ком.строки и из буфера обмена. Поэтому он у меня подключен к SciTE чтобы открывать выделенный в редакторе ключ. А если я скопировал (откуда то) ключ в буфер, то просто щелкаю по иконке скрипта.
Чесноговоря смысла запуска под пользователем особо не понимаю. Админ и так видит (и может редактировать, в отличии от зачастую бесправного пользователя) ветки всех пользователей данного ПК.

9

Re: VBS: Запуск REGEDIT.EXE на заданном разделе реестра

mozers пишет:

Чесноговоря смысла запуска под пользователем особо не понимаю.

Почти никогда не вхожу в систему под учётной записью с правами администратора, при необходимости запуская от её имени те или иные программы.

10 (изменено: Yurachb, 2021-10-27 03:42:25)

Re: VBS: Запуск REGEDIT.EXE на заданном разделе реестра

\

11 (изменено: Yurachb, 2021-10-27 03:41:51)

Re: VBS: Запуск REGEDIT.EXE на заданном разделе реестра

\

12

Re: VBS: Запуск REGEDIT.EXE на заданном разделе реестра

Yurachb
Вместо того, чтобы искать ошибки в тексте сообщений двухлетней давности, что в данной ситуации кроме как на флуд ни на что не тянет, лучше бы взяли с местных авторов пример в части оформления VBS-кода.

13 (изменено: Yurachb, 2021-10-27 03:41:26)

Re: VBS: Запуск REGEDIT.EXE на заданном разделе реестра

\

14

Re: VBS: Запуск REGEDIT.EXE на заданном разделе реестра

Yurachb
Как говорится, "с кусаниями придёшь, от кусаний и ...". Никакие "ради себя" тут не нужны.
Чтобы оформить коды как полагается (с пробелами, отступами и переводами строк), асом быть не нужно. Но вам почему-то приспичило показать себя асом в орфографии.

15 (изменено: Yurachb, 2021-10-27 03:41:02)

Re: VBS: Запуск REGEDIT.EXE на заданном разделе реестра

\

16

Re: VBS: Запуск REGEDIT.EXE на заданном разделе реестра

Yurachb
Не путайте js-код, особенно браузерный, с vbs-кодом. Нравится вам или нет, но существует этикет написания публичных кодов для удобочитаемости. Ранее кому-то уже сбрасывал эту страницу. Пробелы не являются мусором ровно как и после пунктуации в русском языке. Компактностью у вас и не пахнет. Вот как можно записать ваши коды:

For Each Pr in GetObject("winmgmts:").ExecQuery("Select * from Win32_Process Where Name='regedit.exe -m'")
	Pr.Terminate
Next
With CreateObject("WScript.Shell")
	.RegWrite "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Applets\Regedit\Lastkey",_
	"HKEY_CURRENT_USER\Software\KMPlayer\KMP2.0\LastPosition","REG_SZ" : .Run "regedit -m"
End With
For Each Pr in GetObject("winmgmts:").ExecQuery("Select * from Win32_Process Where Name='regedit.exe -m'")
	Pr.Terminate
Next
OpenKey = Inputbox("   ВВЕДИТЕ АДРЕС РАЗДЕЛА РЕЕСТРА" & chr(10) & "   !!! Там будьте предельно осторожны !!!")
With CreateObject("WScript.Shell")
	If OpenKey = 1 Then .RegWrite "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Applets\Regedit\Lastkey",_
	OpenKey, "REG_SZ" : .Run "regedit -m"
End With

17

Re: VBS: Запуск REGEDIT.EXE на заданном разделе реестра

Yurachb пишет:

А обвинять в исправлении ошибок, так что, теперь всё будет с ног на голову? Исправление это зло, пусть с ошибкой живёт, порок это то, к чему мы будем стремиться?

Что будет с ног на голову? Какой ещё порок? Человек предложил своё решение на js. Высказал своё мнение. Ошибки смысл никак не исказили. Всё это произошло далеко не вчера, но вы не постеснялись спустя столько времени за такую ерунду тут зацепиться. Это флуд. Он к теме отношения не имеет. Выложили свои коды, всё, на этом нужно было остановиться. А теперь ещё развели бессмысленную демагогию. Всё, на этом стоп. Пишу уже как модератор.

18 (изменено: Yurachb, 2021-10-27 03:40:35)

Re: VBS: Запуск REGEDIT.EXE на заданном разделе реестра

\

19

Re: VBS: Запуск REGEDIT.EXE на заданном разделе реестра

Yurachb пишет:

но не требуйте учиться, а тем более не осуждайте

Я этого и не требовал. А осуждать буду. Подобные коды в разделе "Коллекция скриптов и идей" просто забраковали бы как не подлежащие размещению. Как писать для себя - это ваше личное дело, а для паблика уж лучше постарайтесь выделить пару минут на правку, чтобы не выглядеть белой вороной на фоне других авторов. Это моя к вам просьба на будущее.

Добавлено: Я уже дал понять, что обсуждать вопросы чужой орфографии тут больше не надо.
Сообщение удалено. Не отходите от темы.