这件事我已经抓了好几个小时了。我猜想这可能与我运行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。
到目前为止,命令尝试过
所有这些都会导致抛出相同的错误,但它仍然创建密钥的副本,而不是重命名它。我还尝试了使用-Path和-LiteralPath标志来处理上述所有命令,但结果是相同的。
为什么powershell会告诉我密钥不存在,而它显然不存在?更奇怪的是,它为什么要创建一个与旧注册表项内容相同的新注册表项,实质上是复制它,而不是重命名它呢?
任何帮助都是非常感谢的。
发布于 2020-04-19 21:06:38
好的,我找到了解决方案:在尝试重新打开Powershell会话、重新登录到机器、执行ipconfig /flushdns以及/release和/renew之后,我意识到我在环境中运行了几个服务器,所有服务器都使用相同的软件,所有服务器都彼此连接。在重新启动所有服务器并停止所有正在运行的服务器上的软件服务之后,我能够正确地使用重命名项和移动项。
其他服务器上的软件正在使用我服务器上的注册表项,这阻止了我重新命名它们。但是,由于父密钥没有被软件使用或锁定,所以允许我创建与我试图重命名的密钥并行的新密钥。这就是为什么它允许旧键与当前名称保持在一起,但同时也使用新名称创建了一个新键。就我个人而言,我认为Powershell应该已经在重命名项中失败了,而不是创建一个副本,但是如果正如我所怀疑的那样,重命名项实际上是一个复制项,后面是一个删除项(在这种情况下,复制工作,但随后的删除失败)。
https://stackoverflow.com/questions/61259161
复制相似问题