首页 > 解决方案 > 值名称未知时远程注册表项的所有属性的 Get-ItemProperty

问题描述

类似的帖子,例如这篇这篇,解释了如何获取远程注册表项,但它假设您已经知道您感兴趣的值的名称。如果您运行

Get-ItemProperty "HKLM:\Software\MySoftware" 

它将返回所有属性及其对应的值,但 Get-ItemProperty 不适用于远程计算机。如果您想对远程注册表项执行相同操作,可以使用 [Microsoft.Win32.RegistryKey] 方法,但这只是答案的一半。举个例子:

$Reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('LocalMachine', $myServer)
$RegKey= $Reg.OpenSubKey("SOFTWARE\\MySoftware")

$RegKey 将成为 System.MarshalByRefObject。这意味着它不是实际的密钥,而只是打开了继续从该密钥请求更多信息的能力。使用 $RegKey.GetValue() 需要您知道要获取的值,但是如果您想获取键的所有值但不知道有多少值或它们的名称怎么办?你会怎么做呢?

标签: powershellregistryremote-registry

解决方案


打开 $RegKey 后,您可以使用以下内容:

$RegKey.GetValueNames()

这将生成所有项目属性及其值的列表。然后,您可以使用 foreach 遍历该列表以检索所有项目属性的值,例如:

foreach($ItemProperty in $RegKey.GetValueNames()){
    $RegKey.GetValue($ItemProperty)
}

奖励:如果要将其导出到 CSV 文件,您可以创建自定义 PS 对象并将其导出到 CSV 文件,如下所示:

foreach($ItemProperty in $RegKey.GetValueNames()){
    $myObject = [PSCustomObject]@{
        ItemProperty = $ItemProperty
        Value = $RegKey.GetValue($ItemProperty)
    } | Export-Csv "yourpath\yourfile.csv" -Append -Delimiter "|" -NoTypeInformation
}

推荐阅读