Показать полную графическую версию : [решено] Поиск по значениям реестра
dosperados
26-01-2015, 05:53
Добрый день, всем любителям powershell`a.
Встала задача поиска по значениям реестра.
Если более детально, то известен примерный путь где нужно искать и само значение параметра (т.к. имя параметра может быть разное и лежать в разных подразделах)
З.Ы. ищем в реестре надстройки Excel, т.к. версии excel разные и само имя надстройки (open, open1, open2, open3 и т.д.) может отличатся необходимо искать именно по значению реестра
$SKey = Get-ChildItem HKCU:\Software\Microsoft\Office -recurse -Include excel
данный запрос находит все разделы где находит Excel, а как правильно проводить поиск именно по значениям реестра!?
необходимо найти значение и изменить его.
Поиск именно по значениям реестр »
Получение всех подразделов раздела реестра
Показать все элементы, непосредственно содержащиеся в разделе реестра, можно при помощи командлета Get-ChildItem. Для отображения скрытых и системных элементов добавьте необязательный параметр Force. Например, эта команда отображает элементы, непосредственно расположенные на диске HKCU: Windows PowerShell, который соответствует кусту HKEY_CURRENT_USER:
PS> Get-ChildItem -Path hkcu:\
Hive: Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER
SKC VC Name Property
--- -- ---- --------
2 0 AppEvents {}
7 33 Console {ColorTable00, ColorTable01, ColorTab...
25 1 Control Panel {Opened}
0 5 Environment {APR_ICONV_PATH, INCLUDE, LIB, TEMP...}
1 7 Identities {Last Username, Last User ...
4 0 Keyboard Layout {}
...
Это разделы верхнего уровня, которые можно видеть под разделом HKEY_CURRENT_USER в редакторе реестра (Regedit.exe).
Указать этот путь в реестре можно также, задав имя поставщика реестра с последующей строкой ::. Полное имя поставщика реестра выглядит как Microsoft.PowerShell.Core\Registry, но может быть сокращено до Registry. Любая из следующих команд выведет содержимое элементов, непосредственно расположенных под разделом HKCU:
Get-ChildItem -Path Registry::HKEY_CURRENT_USER
Get-ChildItem -Path Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER
Get-ChildItem -Path Registry::HKCU
Get-ChildItem -Path Microsoft.PowerShell.Core\Registry::HKCU
Get-ChildItem HKCU:
Эти команды выводят только элементы, содержащиеся на диске непосредственно, так же как и команда DIR оболочки Cmd.exe и команда ls оболочки UNIX. Для показа вложенных элементов необходимо указать параметр Recurse. Для вывода всех подразделов раздела HKCU используется следующая команда (эта операция может занять очень продолжительное время):
Get-ChildItem -Path hkcu:\ -Recurse
Командлет Get-ChildItem позволяет выполнять сложные операции фильтрации при помощи параметров Path, Filter, Include и Exclude, но обычно с этими параметрами осуществляется лишь фильтрация по имени. Сложную фильтрацию на основе других свойств элементов можно выполнить при помощи командлета Where-Object. Следующая команда находит все подразделы раздела HKCU:\Software, у которых не более одного подраздела и ровно четыре значения:
Get-ChildItem -Path HKCU:\Software -Recurse | Where-Object -FilterScript {($_.SubKeyCount -le 1) -and ($_.ValueCount -eq 4) }
red.army@vk
26-01-2015, 06:26
Приведите пример, какое значение на что поменять?
dosperados
26-01-2015, 12:00
Конкретно на моем ПК это раздел HKEY_CURRENT_USER\Software\Microsoft\Office\14.0\Excel\Options
а в нем находятся параметры OPEN, OPEN1, OPEN2, OPEN3
в параметре OPEN3 находится значение, которое нужно поменять "c:\gal810\exe\XLS\F_XlsRep\GalRepBuilder.XLA" тип:REG_SZ
на "c:\новый_путь_до_XLA"
Командлет Get-ChildItem позволяет выполнять сложные операции фильтрации при помощи параметров Path »
Спасибо за ответ, но как вы заметили я и пользовался этим командлетом, если бы понимал как поставить фильтр по конкретному значению, то не стал бы писать этот пост..
Foreigner
26-01-2015, 12:27
dosperados,
set-itemproperty "hkcu:\Software\Microsoft\Office\14.0\Excel\Options" "OPEN3" "C:\PATH\TO"
dosperados
26-01-2015, 12:33
Foreigner, прочитай первый пост, я писал что главное найти путь до параметра по значению параметра т.к. путь у всех разный...
Get-ChildItem "HKCU:\Software\Microsoft\Office\" -Recurse | ForEach-Object {
$obj = Get-ItemProperty $_.pspath
$prop = $obj | Get-Member -Type NoteProperty -ErrorAction SilentlyContinue | Foreach {$_.Name}
$prop | Where {$obj.$_ -match "GalRepBuilder.XLA"} | Foreach {
$obj | Set-ItemProperty -Name $_ "C:\PATH"
}
}
dosperados, вам готовый вариант RegReplace (http://oldcomp.potrebitel.ru/cgi-bin/baza/q2.cgi?model=RegReplace&table=util) ни как не подходит?
dosperados
26-01-2015, 13:50
вам готовый вариант RegReplace ни как не подходит? »
использовать "левый" сторонний софт неизвестно кем и для чего написанный, вместо "мощнейшего" инструмента администрирования - powershell... нет, не подходит!!!
использовать "левый" сторонний софт неизвестно кем и для чего написанный, вместо "мощнейшего" инструмента администрирования - powershell... нет, не подходит!!! »А ещё кирпичи на голову с крыш падают. Поэтому лучше дома сидеть. Правда и люстра может упасть.
"левый" сторонний »У вас "левый" подход и видимо паранойя преследования. Укутайтесь матрасом и ляжьте под кровать. Компьютер выкиньте. Мало ли какие вирусы.
dosperados
26-01-2015, 14:03
yurfed, Спасибо за помощь, но привычка пользоваться штатными средствами у меня с детства.
При том лучше один раз разобраться и решать подобные проблемы в дальнейшем маленькими скриптами, которые я могу централизовано запускать.
dosperados, Ваше право. Только хотелось подсказать готовый и удобный вариант. Лет 10 этой прожкой пользуюсь. Проблем небыло.
Ещё раз, право ваше.
ЗЫ Я не думаю что ассемблер тупее чем powershell. Если не ошибаюсь, написано именно на ассемблере + прикрученный GUI.
dosperados
27-01-2015, 05:04
Get-ChildItem "HKCU:\Software\Microsoft\Office\" -Recurse -Include excel | ForEach-Object { # я добавил ограничение -Include excel
$obj = Get-ItemProperty $_.pspath
$prop = $obj | Get-Member -Type NoteProperty -ErrorAction SilentlyContinue | Foreach {$_.Name} # здесь мне совсем не понятно зачем используется Get-Member с подавлением ошибок, ошибки возникают из-за того что не все структуры объекта имеют тип NoteProperty, поставил ограничение -name PSPath
$prop | Where {$obj.$_ -match "GalRepBuilder.XLA"} | Foreach {
$obj | Set-ItemProperty -Name $_ "C:\PATH"
}
} »
Не смог понять полностью суть вашего примера, у меня оригинальный вариант примера не работает, так и мои модификации не заставили его работать...
Оригинальный вариант примера выдает ошибку:
Set-ItemProperty : Не удается привязать объект ввода к любым параметрам команды, так как команда не принимает входные данные конвейера, либо входные данные
и их свойства не совпадают с любыми из параметров, принимающих входные данные конвейера.
строка:5 знак:10
+ $obj | Set-ItemProperty -Name $_ "C:\PATH"
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (@{LastUILang=10....Core\Registry}:PSObject) [Set-ItemProperty], ParameterBindingException
+ FullyQualifiedErrorId : InputObjectNotBound,Microsoft.PowerShell.Commands.SetItemPropertyCommand
dosperados
27-01-2015, 06:10
Нашел замечательную статью тык (http://dereknewton.com/2010/12/searching-the-registry-using-powershell/)
готовый пример:
Get-ChildItem "HKCU:\Software\Microsoft\Office\" -rec -ea SilentlyContinue | foreach {
$CurrentKey = (Get-ItemProperty -Path $_.PsPath)
select-string "GalRepBuilder.XLA" -input $CurrentKey -AllMatches | foreach {($_.matches)|select-object Value}
}
dosperados
27-01-2015, 07:09
Get-ChildItem "HKCU:\Software\Microsoft\Office\" -rec -ea SilentlyContinue | foreach {
$CurrentKey = (Get-ItemProperty -Path $_.PsPath)
if ($CurrentKey -match "GalRepBuilder.XLA") {
$a = $CurrentKey
$a.Description
$a.PSPath
}
}
Как выбрать конкретный параметр чтобы в нем изменить значение?
Foreigner
27-01-2015, 07:41
dosperados,
[array] $keys = gci 'HKCU:\Software\Microsoft\Office' -recurse -include 'Excel'
foreach ($key in $keys) {
$key.property | ? { (gp $key.pspath).$($_) -eq 'c:\gal810\exe\XLS\F_XlsRep\GalRepBuilder.XLA' } | % {
sp $key.pspath $_ 'C:\New\Path\GalRepBuilder.XLA'
}
}
dosperados
27-01-2015, 12:13
[array] $keys = gci 'HKCU:\Software\Microsoft\Office' -recurse -include 'Excel'
foreach ($key in $keys) {
$key.property | ? { (gp $key.pspath).$($_) -eq 'c:\gal810\exe\XLS\F_XlsRep\GalRepBuilder.XLA' } | % {
sp $key.pspath $_ 'C:\New\Path\GalRepBuilder.XLA'
}
} »
Данный код не отрабатывает, по факту значения в реестре не меняются.
Foreigner
27-01-2015, 14:54
dosperados, У меня нет офиса за ненадобностью, тестировал на 7-ZIP, все отрабатывало..
dosperados
28-01-2015, 04:36
Foreigner, Пробовал запускать ваш пример без изменений, ни каких ошибок нет, но и результата нет. В реестре параметр не меняется.
dosperados
18-03-2015, 10:06
если в PoSh использовать поиск reg query
REG.EXE QUERY "HKEY_CURRENT_USER\Software\Microsoft\Office" /s /d /f "c:\gal910\exe\XLS\F_XlsRep\GalRepBuilder.XLA"
результат запроса:
HKEY_CURRENT_USER\Software\Microsoft\Office\14.0\Excel\Options
OPEN3 REG_SZ "c:\gal910\exe\XLS\F_XlsRep\GalRepBuilder.XLA"
Поиск завершен: найдено совпадений: 1.
как с помощью PoSh парсить эту строку чтобы получить 2 переменные
1. путь до значения "HKEY_CURRENT_USER\Software\Microsoft\Office\14.0\Excel\Options"
2. наименование значения "OPEN3"
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.