注册表项的重命名项抛出错误并创建副本而不是重命名

Rename-Item for registry key throws error and creates a copy instead of rename

我已经为此挠头好几个小时了。我猜这可能与我正在使用 Powershell 运行 的帐户的权限有关(不太可能,因为我使用既是本地管理员又是域管理员的帐户登录服务器),或者密钥以某种方式被另一个进程使用。我查看了 this Stack post as well as this Reddit thread but for some reason this only works for empty keys that I create for testing purposes, not the existing ones. There seems to be others having similar issues too 没有成功。

有效的测试

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

Get-Item 'HKLM:\Software\MyTestKey'

这个returns:

    Hive: HKEY_LOCAL_MACHINE\SOFTWARE

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

那么我运行:

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

这 运行 是正确的,我可以验证密钥 MyTestKey 已重命名为 MyNewTestKey。如果注册表项中有空格,这也有效。

测试无效

然后我转向已安装软件的现有密钥。该软件的服务已停止。我运行

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

这个returns正确:

    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。

到目前为止已尝试的命令

所有这些都会导致抛出相同的错误,但它仍然会创建密钥的副本,而不是重命名它。我还为上述所有命令尝试了同时使用 -Path 和 -LiteralPath 标志的 Move-Item,但结果相同。

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

感谢任何帮助。

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

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