Powershell 注册表项的重命名项引发错误,并创建副本而不是重命名

Powershell 注册表项的重命名项引发错误,并创建副本而不是重命名,powershell,registry,windows-server-2016,Powershell,Registry,Windows Server 2016,我已经为这件事挠头好几个小时了。我猜这可能与我运行Powershell时使用的帐户的权限有关(不太可能,因为我使用的帐户既是本地管理员又是域管理员),也可能与密钥被另一个进程使用有关。我也看了,但出于某种原因,这只适用于我为测试目的创建的空键,而不是现有的。没有任何成功 有效的测试 我创建了一个名为HKLM:\Software\MyTestKey的注册表项,然后运行: Get-Item 'HKLM:\Software\MyTestKey' Rename-Item 'HKLM:\Software

我已经为这件事挠头好几个小时了。我猜这可能与我运行Powershell时使用的帐户的权限有关(不太可能,因为我使用的帐户既是本地管理员又是域管理员),也可能与密钥被另一个进程使用有关。我也看了,但出于某种原因,这只适用于我为测试目的创建的空键,而不是现有的。没有任何成功

有效的测试 我创建了一个名为HKLM:\Software\MyTestKey的注册表项,然后运行:

Get-Item 'HKLM:\Software\MyTestKey'
Rename-Item 'HKLM:\Software\MyTestKey' -NewName "MyNewTestKey"
这将返回:

    Hive: HKEY_LOCAL_MACHINE\SOFTWARE

Name                           Property
----                           --------
MyTestKey
然后我跑:

Get-Item 'HKLM:\Software\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”
  • 重命名项目“HKLM:\Software\MySoftware\KeyToChangeName'-NewName MyNewKeyname”
  • 重命名项目“HKLM:\Software\MySoftware\KeyToChangeName”-NewName“MyNewKeyname”
  • 重命名项目“HKLM:\Software\MySoftware\KeyToChangeName”-NewName MyNewKeyname
所有这些都会引发相同的错误,但它仍然会创建密钥的副本,而不是重命名密钥。我还尝试为上述所有命令使用-Path和-LiteralPath标志移动项,但结果相同

为什么powershell会告诉我密钥不存在,而它显然不存在?更奇怪的是,为什么它要创建一个与旧注册表项内容相同的新注册表项,本质上是复制它,而不是重命名它


非常感谢您的帮助。

好的,我找到了解决方案:在尝试重新打开Powershell会话、重新登录到机器、执行ipconfig/flushdns以及/release和/renew之后,我意识到我有几个服务器在环境中运行,都使用相同的软件,所有的服务器都有相互连接的软件。在重新启动所有服务器并停止所有正在运行的服务器上的软件服务后,我能够正确地使用Rename Item和Move Item


其他服务器上的软件正在使用我服务器上的注册表项,这使我无法重命名它们。但是,由于父密钥未被软件使用或锁定,因此允许我创建与我试图重命名的密钥并行的新密钥。这就是为什么它允许旧密钥保留当前名称,但它也使用新名称创建了一个新密钥。就我个人而言,我认为Powershell应该已经在重命名项时失败,而不是创建一个副本,但如果如我所怀疑的那样,重命名项实际上是一个复制项,后跟一个删除项(在本例中,复制工作正常,但随后的删除失败)。

好的,我找到了解决方案:在尝试重新打开Powershell会话之后,重新登录到机器,执行ipconfig/flushdns以及/release和/renew,我意识到我有几个服务器在环境中运行,所有服务器都使用相同的软件,并且所有服务器都将该软件相互连接。在重新启动所有服务器并停止所有正在运行的服务器上的软件服务后,我能够正确地使用Rename Item和Move Item


其他服务器上的软件正在使用我服务器上的注册表项,这使我无法重命名它们。但是,由于父密钥未被软件使用或锁定,因此允许我创建与我试图重命名的密钥并行的新密钥。这就是为什么它允许旧密钥保留当前名称,但它也使用新名称创建了一个新密钥。就我个人而言,我认为Powershell应该已经在重命名项时失败,而不是创建一个副本,但如果我怀疑是这样的话,重命名项实际上是一个复制项,后跟一个删除项(在这种情况下,复制工作正常,但随后的删除失败).

尝试以下操作:重命名ItemProperty-路径'HKLM:\Software\MySoftware'-Name KeyToChangeName-NewName MyNewKeyname编辑:我忘记了:以管理员身份运行遗憾的是,重命名ItemProperty会给出相同的结果。我认为所有的-ItemProperty命令都是针对注册表项中的值,而不是注册表项本身?或者更确切地说,是为了澄清:Rename Item抛出“key not exist error”并创建原始项的副本,但使用新名称。Rename ItemProperty会引发相同的错误,但不会创建密钥的副本,我假设这是因为Rename Item用于密钥,Rename ItemProperty用于密钥中的单个值。
Get Item'HKLM:\Software\MySoftware\KeyToChangeName'| Rename Item-NewName“MyNewKeyname”
应该可以工作……不幸的是,这也给了我与“指定路径上的注册表项不存在”相同的结果。请尝试以下操作:重命名ItemProperty-路径'HKLM:\Software\MySoftware'-Name KeyToChangeName-NewName MyNewKeyname编辑:我忘了:以管理员身份运行不幸的是,重命名ItemProperty会给出相同的结果。我认为所有的-ItemProperty命令都是针对注册表项中的值,而不是注册表项本身?或者更确切地说,是为了澄清:Rename Item抛出“key not exist error”并创建原始项的副本,但使用新名称。Rename ItemProperty会引发相同的错误,但不会创建键的副本,我假设这是因为Rename Item用于键,Rename ItemProperty用于键内的单个值。
Get Item'HKLM: