Rename-Item для ключа реестра выдает ошибку и создает копию вместо переименования - PullRequest
1 голос
/ 16 апреля 2020

Я почесал голову от этого уже несколько часов. Я предполагаю, что это может быть связано либо с разрешениями для учетной записи, с которой я запускаю Powershell (маловероятно, поскольку я вошел на сервер с учетной записью, которая является как локальным администратором, так и администратором домена), или что ключ каким-то образом используется другим процессом. Я посмотрел этот пост в стеке , а также эту ветку Reddit , но по какой-то причине это работает только для пустых ключей, которые я создаю для целей тестирования, а не для существующих. Похоже, что другие тоже сталкиваются с подобными проблемами , но безуспешно.

Тест, который работает

Я создал раздел реестра с именем HKLM: \ Software \ MyTestKey, а затем я запускаю:

Get-Item 'HKLM:\Software\MyTestKey'

Это возвращает:

    Hive: HKEY_LOCAL_MACHINE\SOFTWARE

Name                           Property
----                           --------
MyTestKey

Итак, я запускаю:

Rename-Item 'HKLM:\Software\MyTestKey' -NewName "MyNewTestKey"

Это работает правильно, и я могу проверить что ключ MyTestKey был переименован в MyNewTestKey. Это также работает, если в разделе реестра есть пробелы.

Тест, который не работает

Затем я обращаюсь к существующему ключу для программного обеспечения, которое я установил. Служба для этого программного обеспечения остановлена. Я запускаю

Get-Item 'HKLM:\Software\MySoftware\KeyToChangeName'

Это возвращает правильно:

    Hive: HKEY_LOCAL_MACHINE\SOFTWARE\MySoftware

Name                           Property
----                           --------
KeyToChangeName

Однако, когда я запускаю

Rename-Item 'HKLM:\Software\MySoftware\KeyToChangeName' -NewName "MyNewKeyname"

Это выдает ошибку:

Rename-Item : The registry key at the specified path does not exist.
At line:1 char:1
+ Rename-Item 'HKLM:\SOFTWARE\MySoftware\KeyToChangeName...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (HKEY_LOCAL_MACH...ame|MyDomainName:String) [Rename-Item], ArgumentException
    + FullyQualifiedErrorId : System.ArgumentException,Microsoft.PowerShell.Commands.RenameItemCommand

Самое странное в этом то, что вместо переименования ключа Powershell фактически создает копию ключа, поэтому теперь у меня есть и KeyToChangeName, и MyNewKeyname.

Команды, которые до сих пор пробовали

  • Переименовать-элемент 'HKLM: \ Software \ MySoftware \ KeyToChangeName' -NewName "MyNewKeyname"
  • Переименовать-Item 'HKLM: \ Software \ MySoftware \ KeyToChangeName' -NewName MyNewName MyNewName MyNewName
  • Переименовать-элемент "HKLM: \ Software \ MySoftware \ KeyToChangeName" -NewName "MyNewKeyname"
  • Переименовать-элемент "HKLM: \ Software \ MySoftware \ KeyToChangeName" -NewName MyNewKeyname

Все это приводит к одной и той же ошибке, но все равно создает копию ключа, а не переименовывает его. Я также попробовал Move-Item с флагами -Path и -LiteralPath для всех вышеперечисленных команд, но с одинаковыми результатами.

Почему PowerShell сказал мне, что ключ не существует, когда он явно не существует? т? И даже более странно, зачем ему создавать новый раздел реестра с тем же содержимым, что и у старого, дублируя его, а не переименовывать?

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 20 апреля 2020

Хорошо, я нашел решение: после попытки открыть сеанс Powershell, войти в систему на компьютере, выполнить ipconfig / flushdns, а также / release и / renew, я понял, что в среде запущено несколько серверов, все из которых используют то же самое программное обеспечение, и все серверы имели это программное обеспечение, соединенное друг с другом. После перезапуска всех серверов и остановки службы программного обеспечения на всех работающих серверах я смог правильно использовать как Rename-Item, так и Move-Item.

Программное обеспечение на других серверах использовало ключи реестра на моем сервере, что не позволило мне переименовать их. Однако, поскольку родительский ключ не использовался или не блокировался программным обеспечением, мне было разрешено создавать новые ключи в параллель с тем, который я пытался переименовать. Вот почему он позволил старому ключу остаться с текущим именем, но он также создавал новый ключ с новым именем. Лично я думаю, что Powershell должен завершиться с ошибкой уже с Rename-Item и не создавать дубликат, но если это так, как я подозреваю, Rename-Item на самом деле является Copy-Item, за которым следует Remove-Item (в этом случае Copy работает но последующее удаление не удается).

...