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, 2017-02-26 23:08:58)

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

Для выхода на конкретную ветку реестра я пользуюсь сим скриптом:

	On Error Resume Next
	Branch=_
"HKEY_CURRENT_USER\Software\KMPlayer\KMP2.0\LastPosition"

Set WMI=GetObject("winmgmts:")
Set colProcessList=WMI._
ExecQuery("Select * from Win32_Process Where Name='regedit.exe -m'")
For Each objProcess in colProcessList
objProcess.Terminate():Next

Set Rgd=CreateObject("WScript.Shell")
Rgd.regwrite"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Applets\Regedit\Lastkey",Branch,"REG_SZ"
Rgd.run"regedit -m",1,True
Set Rgd=Nothing

и ещё подобным Вашему, но совсем простым:

	On Error Resume Next
Set WMI=GetObject("winmgmts:")
Set colProcessList=WMI.ExecQuery _
("Select * from Win32_Process Where Name='regedit.exe -m'")
For Each objProcess in colProcessList
    objProcess.Terminate():Next
Set Rgd=CreateObject("WScript.Shell")
Dim OpenKey
OpenKey=Inputbox("   ВВЕДИТЕ АДРЕС РАЗДЕЛА РЕЕСТРА"&chr(10)&"   !!! Там будьте предельно осторожны !!!")
If OpenKey=1	Then
Rgd.regwrite"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Applets\Regedit\Lastkey",OpenKey,"REG_SZ"
Rgd.run"regedit -m",1,True
Set Rgd=Nothing
Else
End If

11 (изменено: Yurachb, 2017-02-26 23:05:54)

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

Ошибки mozers в словах: „Чесноговоря” и говорит о малой полезности, равно как и такая орфографическая ошибка в самом рассматриваемом скрипте: „добавте”. То есть тут надо исправить на: „добавьте” и „Честно говоря”, а опцию рассматривать не как практическую, а как идею.

12

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

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

13 (изменено: Yurachb, 2017-02-27 00:09:37)

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

Flasher

Флуд – это ради себя, а скрипт нужен пользователям, вот я и постарался, а вы кусаться. Не все асы, но всем надо то, что я предложил в первом варианте. Скриптов написано много, а практических решений почти не найти. Давно я не был тут, доработал до ума и исправил свою прежнюю тему, и хотел сегодня, имея время и желание, добавить скрипт для области перехода – полезнейшая вещь, но не нашёл для себя нужных прав. Есть практическая схема работы со списком истории Punto Switcher'а, но тут, похоже, из-за бесправия, и этого люди не увидят. Я бы оформил свои темы, но такого права нет, вот и нашёл сегодня свою нишу, и не просто хочу быть на виду, как вы тут с упрёком обвиняете, а просто хочу быть полезным. А если этот форум для избранных снобов, то я удалюсь, вы только скажите, обидно же слушать такой безапелляционный укор. Ведь ошибка, как я знаю, есть свидетельство о пороке, который я обнаружил и в словах коментирующего, и в скрипте, для чего даже вернулся на форум, чтобы указать на них. Ну а то, что скрипт с такой ошибкой тут уже долгое время, то не пора ли её наконец-таки исправить?

14

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

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

15 (изменено: Yurachb, 2017-02-27 00:49:33)

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

Flasher

Кода-то почти нет, чтоб его ещё по чьим-то правилам корёжить. Ненавижу мусор в коде, вроде пробелов и, к примеру, точек с запятой в ява-скрипт, и проповедую такой именно, чистый и компактный код. У меня в программе, над которой я работаю с 2007, и ещё работы на несколько лет, сотни и сотни ява-скриптов. И в компактном их коде я намного лучше ориентируюсь, нежели в коде „правильном”, проверено и испытано и есть чему теперь научить, а не учиться оформлению хлам-кода. Библиотеку JQuery, к примеру, я люблю читать именно компактную... А обвинять в исправлении ошибок, так что, теперь всё будет с ног на голову? Исправление это зло, пусть с ошибкой живёт, порок это то, к чему мы будем стремиться?..

Повторю: порок не в самой орфографии, а неверная орфография это есть всякое свидетельство!.. На посещённую ранее ветку реестра мы выходим из простого ярлыка с параметром -m. Единственное тут полезное практически это псевдонимы, без которых я много лет жил и не испытывал в них нужды. И кому-то может тема слишком сложна, так я предложил свой вариант, для таких же чайников, как и я, им и полезный...

Как легко мы опускаем друг друга, не считая это за зло. Потом узнаем цену такого поведения, и она нам тысячекратно не понравится.

Поругались, и будет. Эта переписка в сердцах касается только нас, и не место ей тут. Удалите свои обвинения, и мои вам ответы, так будет правильно.

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

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

Flasher

В vbs я постольку- поскольку, не люблю его, и тут ради полезных удобняшек, облегчающих нашу компьюторную жизнь – на ПК каменного их века. Не могу я бегло читать ваш код, а свой – пожалуйста, и если хотите, просто исправляйте его, но не требуйте учиться, а тем более не осуждайте. Мне vbs почти не нужен. Если б майкрософт сделали в ОС полезные вещи, да пунто свитчер не прекратил переписываться с пользователями напрямую (30 опций в истории, флаги всегда в полную яркость – мои предложения; хотел было ещё предложить улучшения, но встретил стену...), то я бы вообще тут не показывался, читал бы, но не писал.

19

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

Yurachb пишет:

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

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

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