Powershell V2 + PSRemoteRegistry从(默认)值获取信息

时间:2014-07-21 18:14:07

标签: powershell registry powershell-v2.0

我目前正在编写一个脚本来扫描服务器列表并检查某个REG_SZ注册表值。我的代码完美无缺,直到我需要读取(默认)值。

实施例

$regValue = (Get-RegString -Hive LocalMachine -Key "SOFTWARE\Microsoft\Windows NT\CurrentVersion\InifileMapping\control.ini" -Value Current).data

这会返回好的数据。

$regValue = (Get-RegString -Hive LocalMachine -Key "SOFTWARE\Microsoft\Windows NT\CurrentVersion\InifileMapping\RegEdt32.ini" -Value Default).data

返回"找不到值[Default],因为它不存在。

$regValue = (Get-RegString -Hive LocalMachine -Key "SOFTWARE\Microsoft\Windows NT\CurrentVersion\InifileMapping\RegEdt32.ini" -Value "(Default)").data

返回"找不到值[(默认值)],因为它不存在。

我可以使用其他方法来获取值。

2 个答案:

答案 0 :(得分:2)

一种方法

PSRemoteRegistry模块实际上包含一个专门用于检索注册表项默认值的命令:Get-RegDefault

使用您的示例,命令和结果输出:

PS C:\WINDOWS\system32> (Get-RegDefault -Hive LocalMachine -Key 'SOFTWARE\Microsoft\Windows NT\CurrentVersion\InifileMapping\RegEdt32.ini').Data
     

USR:软件\微软\ RegEdt32中

使用Get-RegDefault时可能存在问题,这是“(默认)”键值根本没有数据集时引发的错误:

PS C:\WINDOWS\system32> (Get-RegDefault -Hive LocalMachine -Key 'SOFTWARE\Microsoft\Windows NT\CurrentVersion\InifileMapping').Data
     

Get-RegDefault:使用“1”参数调用“GetValueKind”的异常:“指定的注册表项不存在。”

  在行:1 char:2
  +(Get-RegDefault -Hive LocalMachine -Key'SOFTWARE \ Microsoft \ Windows N ...
  + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~
  + CategoryInfo:NotSpecified:(:) [Write-Error],WriteErrorException
  + FullyQualifiedErrorId:Microsoft.PowerShell.Commands.WriteErrorException,Get-RegDefault

一个相当简单的解决方法是简单地使用-ErrorAction SilentlyContinue来抑制错误,因为它是非终止的,但不建议这样做。

更好的方法

“(默认)”注册表项值的名称实际上是空的。原始命令返回有关不存在的值的错误的原因是因为确实没有名称为“(默认)”的键值,除非您可能创建了一个。

因此,检查密钥默认值的最简单,最简洁的方法是使用Get-RegValue命令并传递一个空字符串作为值名称。

此示例显示了找到包含数据的合法“(默认)”值时的结果:

PS C:\WINDOWS\system32> (Get-RegValue -Hive LocalMachine -Key 'SOFTWARE\Microsoft\Windows NT\CurrentVersion\InifileMapping\RegEdt32.ini' -Value '').Data  
     

USR:Software \ Microsoft \ RegEdt32

以下是使用之前产生错误的密钥的示例:

PS C:\WINDOWS\system32> (Get-RegValue -Hive LocalMachine -Key "SOFTWARE\Microsoft\Windows NT\CurrentVersion\InifileMapping" -Value '').Data  
     

您可以看到根本没有返回任何内容,因为该键的“默认”值没有数据。作为奖励,如果密钥本身确实不存在,那么您仍然可以通过不抑制错误来检测它。

答案 1 :(得分:0)

如果您没有专门与Get-RegString绑定,则可以使用来自同一PSRemoteRegistry模块的Get-RegValue。如果需要,您可以使用'-type String'参数将其限制为字符串。

您只需将其指向存在默认值的键即可。要测试的示例工作流程:

#Stage a key to test:
    #Create a 'blah' key under HKLM\Software.
    #Change the default value to some desired value.

#Get the default value (assumes no other values exist under this key)
    (Get-RegValue -Hive LocalMachine -Key SOFTWARE\blah).data

#Get the default value, accounting for other potential values
    Get-Regvalue -Hive LocalMachine -Key SOFTWARE\Blah | Where-Object {$_.value -like "(Default)"} | Select-Object -ExpandProperty data

#Get the default value, limited to string type:
    (get-RegValue -Hive LocalMachine -Key SOFTWARE\blah -Type String).data

干杯!