如何使用Powershell从注册表中获取数据

时间:2011-08-11 18:20:13

标签: powershell get registry

我有以下要通过Powershell检查的注册表项值:

“SERVER_NAME”

HK_CLASSES_ROOT \的AppID \ {54C92AE1-77C3-11D1-9B6C-00A024BF0B6D}

值为“RemoteServerName”,该值的数据是我需要检查的服务器。

注册表视图:

VALUE DATA


(默认)WFM Tally Server RemoteServerName DNVR-WFMTAL10

到目前为止,我尝试了以下代码,但我得到的只是Valuename(RemoteServerName)或默认值(WFM Tally Server)中的数据

他们是:

foreach ($server in $server_list){
$hklm = 2147483648
$sSubKeyName = "AppID\\{54C92AE1-77C3-11D1-9B6C-00A024BF0B6D}"
$sValueName = "WFM Tally Server"
$wmi = [wmiclass]"Root\default:stdRegProv" 
($wmi.GetStringValue($hklm,$sSubKeyName)).sValue

这是另一个代码:

foreach ($server in $server_list){
$hklm = 2147483648
$sSubKeyName = "AppID\\{54C92AE1-77C3-11D1-9B6C-00A024BF0B6D}"
$sValueName = "WFM Tally Server"
$wmi = [wmiclass]"Root\default:stdRegProv" 
($wmi.GetStringValue($hklm,$sSubKeyName)).sValue

我错过了什么?

3 个答案:

答案 0 :(得分:3)

如果您尝试从远程计算机“Server”上的注册表项获取值,那么您的主要问题是这段代码:

  

$ wmi = [wmiclass]“Root \ default:stdRegProv”

要浏览远程计算机上的密钥,您需要连接到远程主机上的注册表作为UNC路径。

[WmiClass]"\\$Server\ROOT\DEFAULT:StdRegProv"

有关WMI StdRegProv的详细信息,请参阅http://msdn.microsoft.com/en-us/library/aa393664(v=vs.85).aspx

快速参考,此类下的不同注册表配置单元是:

 HKEY_CLASSES_ROOT (2147483648 (0x80000000))
 HKEY_CURRENT_USER (2147483649 (0x80000001))
 HKEY_LOCAL_MACHINE (2147483650 (0x80000002))
 HKEY_USERS (2147483651 (0x80000003))
 HKEY_CURRENT_CONFIG (2147483653 (0x80000005))

所以你的代码的正确版本是:

foreach ($server in $server_list){
    $HKCR = [uint32]"0x80000000"
    $sSubKeyName = "AppID\{54C92AE1-77C3-11D1-9B6C-00A024BF0B6D}"
    $sValueName = "RemoteServerName"
    $wmi = [wmiclass]"\\$server\ROOT\DEFAULT:StdRegProv" 
    $wmi.GetStringValue($HKCR, $sSubKeyName, $sValueName)
}

仅供参考,注册表项的(默认)值的名称实际上是空字符串。在显示键的值时,Regedit只是将此空字符串替换为(Default)。因此,如果您需要读取您将使用的密钥的默认值:

$wmi.GetStringValue($HKCR, $sSubKeyName, "")

希望遇到这种情况的人发现它很有用。 O7

答案 1 :(得分:2)

Powershell具有非常好的注册表导航功能。您不必使用wmi:

New-PSDrive -Name HKCR -PSProvider Registry -Root HKEY_CLASSES_ROOT
cd "HKCR:\AppID\{54C92AE1-77C3-11D1-9B6C-00A024BF0B6D}"
(get-itemproperty -path . -name RemoteServerName).RemoteServerName

http://msdn.microsoft.com/en-us/library/bb648598%28v=vs.85%29.aspx

答案 2 :(得分:0)

我们有一个可以执行此操作的cmdlet(如果您只是在短期内完成免费试用) - http://www.vexasoft.com/cmdletlibrary/support/getregistrykey.html。然后你可以在一行中完成它(它支持远程计算机,32位到64位访问,凭证等):

foreach ($server in $server_list)
{
    Get-RegistryKey -Key "HKCR:\AppID\{54C92AE1-77C3-11D1-9B6C-00A024BF0B6D}" -ValueName RemoteServerName -Computer $server
}

如果你不能使用第三方cmdlet,框架中有OpenRemoteBaseKey:

    foreach ($server in $server_list)
    {
$reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('ClassesRoot', $Server)
$regkey = $reg.OpenSubkey("AppID\\{54C92AE1-77C3-11D1-9B6C-00A024BF0B6D}")
$regkey.GetValue("RemoteServerName")
    }