2011-08-11 97 views
1

注册表获取数据我有我想通过PowerShell来检查以下注册表键值:如何从一个值从使用PowerShell

“SERVER_NAME”

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

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

注册表视图:

值数据


(默认)WFM理货服务器 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 

我缺少什么?

回答

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

+0

如果不创建'New-PSDrive'(HKCR :),您可以直接'cd'Registry :: HKEY_CLASSES_ROOT \ AppID \ {54C92AE1-77C3-11D1-9B6C-00A024BF0B6D}“'。 –

0

我们有一个小命令,将做到这一点(带有一个免费试用,如果你只是经过一些短期是) - http://www.vexasoft.com/cmdletlibrary/support/getregistrykey.html。然后,你可以做到这一点的一条线(它支持远程计算机,32位到64位的访问,凭证等):如果你不能使用,虽然第三方的cmdlet

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

,有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") 
    } 
3

如果你试图从远程计算机“服务器”上的注册表键的值,那么你的主要问题是这段代码:

$ 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) 
} 

仅供参考,一个regi(默认值)的名称stry键实际上是一个空字符串。当显示键值时,Regedit简单地用(Default)替换这个空字符串。所以,如果你需要读取一个键的默认值,你可以使用:

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

希望任何人谁碰到这个来发现它是有用的。 o7

相关问题