Как получить данные из значения из реестра с помощью Powershell - PullRequest
1 голос
/ 11 августа 2011

У меня есть следующее значение ключа реестра, которое я хочу проверить с помощью Powershell:

"SERVER_NAME"

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

значение - «RemoteServerName», а данные из этого значения - сервер, который мне нужно проверить.

Просмотр реестра:

ЗНАЧЕНИЕ ДАННЫХ


(По умолчанию) 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 ]

3 голосов
/ 12 сентября 2013

Если вы пытаетесь получить значение из раздела реестра на удаленном компьютере «Сервер», то ваша основная проблема заключается в следующем фрагменте кода:

$ 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 просто заменяет эту пустую строку на (По умолчанию) при отображении значений ключа.Поэтому, если вам нужно прочитать значение ключа по умолчанию, которое вы используете:

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

Надеюсь, любой, кто сталкивается с этим, находит это полезным.o7

2 голосов
/ 11 августа 2011

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 голосов
/ 12 августа 2011

У нас есть командлет, который сделает это (поставляется с бесплатной пробной версией, если вы только что через некоторое время) - 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
}

Если вы не можете использовать сторонние командлеты, есть 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")
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...