从远程注册表项获取(Default)字符串值失败,求原因及解决办法
注册表Default值读取异常问题
注册表项HKLM\SOFTWARE\Classes\TypeLib\{2DF8D04C-5BFA-101B-BDE5-00AA0044DE52}\2.8\0\Win32存在一个*(Default)*字符串值,指向MS Office的MSO.dll路径(示例:C:\Program Files (x86)\Common Files\Microsoft Shared\OFFICE16\MSO.DLL)。
失败的读取尝试
尝试用以下PowerShell代码读取该默认值到$KEY_VAL变量,但未成功:
$Reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey("LocalMachine", $COMPUTER) $RegKey = $Registry.OpenSubKey("SOFTWARE\Classes\TypeLib\{2DF8D04C-5BFA-101B-BDE5-00AA0044DE52}\2.8\0\Win32") $KEY_VAL = $RegKey.getvalue("(Default)") "$KEY_VAL"
自定义值读取正常
在同一位置创建名为TEST的自定义字符串值后,可正常读取:
$Reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('LocalMachine', $COMPUTER) $RegKey = $Reg.OpenSubKey("SOFTWARE\\Classes\\TypeLib\\{2DF8D04C-5BFA-101B-BDE5-00AA0044DE52}\\2.8\\0\\Win32") $KEY_VAL = $RegKey.GetValue("TEST") "$KEY_VAL"
输出结果:
C:\My\fake\path
异常现象
- 尝试多种引号、转义符写法均无效
- 使用
$RegKey.GetValueNames()遍历值名称时,仅显示TEST,不显示*(Default)*
临时解决办法
通过遍历值名称的方法可读取/修改*(Default)*值:
读取代码
foreach ($rVALUE in $RegKey.GetValueNames()){ $KEY_VAL = $RegKey.getvalue($rVALUE) "$KEY_VAL" }
修改代码
$RegKey = $Registry.OpenSubKey("$REG_KEY",$TRUE) foreach ($rVALUE in $RegKey.GetValueNames()){ $ValueData = "C:\Program Files\Microsoft Office\Root\VFS\ProgramFilesCommonX86\Microsoft Shared\OFFICE16\MSO.DLL" $RegKey.SetValue($rVALUE,$ValueData, [Microsoft.Win32.RegistryValueKind]::String) }
疑问
- 是否是未正确转义含大括号的键名导致失败?
- 还是*(Default)*值本身难以操作?
- 或是微软的特殊存储机制导致显示与实际存储不同?
内容的提问来源于stack exchange,提问作者Doofus
相关产品推荐
相关产品推荐

