OpenRemoteBaseKey () учетные данные - PullRequest
6 голосов
/ 15 июля 2009

Я пытаюсь использовать powershell для доступа к удаленному реестру, например так:

$reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey("LocalMachine", $server)
$key = $reg.OpenSubkey($subkeyPath)

В зависимости от некоторых факторов, которые я пока не могу определить, я либо получаю

Исключение, вызывающее "OpenSubKey" с аргументом (ами) "1": "Запрошенный доступ к реестру не разрешен."

Или

System.UnauthorizedAccessException: Попытка выполнить несанкционированную операцию. в Microsoft.Win32.RegistryKey.Win32ErrorStatic (Int32 errorCode, String str) в Microsoft.Win32.RegistryKey.OpenRemoteBaseKey (RegistryHive hKey, String machineName)

Кажется, довольно ясно, что это потому, что пользователь, которого я запускаю скрипт powershell, не имеет соответствующих учетных данных для доступа к удаленному реестру. Я хотел бы иметь возможность предоставить набор учетных данных для использования для удаленного доступа к реестру, но я не могу найти документацию где-либо способ сделать это. Мне также неясно, где конкретно указать , которым пользователям разрешен удаленный доступ к реестру.

Ответы [ 7 ]

5 голосов
/ 17 июня 2013

Просто подумал, что добавлю свой ответ любому, кто тоже столкнулся с этой проблемой. Кажется, нет способа добавить учетные данные с помощью RemoteRegistry. Однако вы можете использовать WMI для запроса удаленного реестра, используя альтернативные учетные данные следующим образом:

$reg = Get-WmiObject -List -Namespace root\default -ComputerName RemotePC -Credential "Domain\User" | Where-Object {$_.Name -eq "StdRegProv"}

Отсюда вы можете вызывать стандартные методы реестра. Приведенный ниже пример вернет операционную систему.

$HKLM = 2147483650
$reg.GetStringValue($HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion","ProductName").sValue

Надеюсь, это кому-нибудь поможет:)

2 голосов
/ 16 августа 2013

Я не могу прокомментировать непосредственно приведенную выше запись бентайлра, но я взял то, что он сделал, и добавил создание PSCredentials (вычислено из здесь ), чтобы позволить вам жестко кодировать учетные данные в сценарии.1003 *

Отказ от ответственности за спокойствие: будьте осторожны при использовании в сценарии учетных данных в виде открытого текста.В моем случае я использую общие учетные данные на машинах, которые запускаю.В зависимости от вашего случая вы можете создать зашифрованный файл учетных данных для хранения пароля (см. Ссылку выше).

Используемые учетные данные должны иметь доступ к реестру, если вы вошли в систему от этого пользователя.на машине, на которую вы нацеливаетесь.

$user = "Domain\Username"
$pass = ConvertTo-SecureString "Password" -AsPlainText -Force
$cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $user,$pass

$reg = Get-WmiObject -List -Namespace root\default -ComputerName $server -Credential $cred | Where-Object {$_.Name -eq "StdRegProv"}
$HKLM = 2147483650
$value = $reg.GetStringValue($HKLM,"Software\Microsoft\.NetFramework","InstallRoot").sValue
2 голосов
/ 01 апреля 2011

Вы используете удаленную службу реестра? По умолчанию он отключен, и это должно быть причиной проблемы. Проверьте состояние этой службы на всех удаленных компьютерах, к которым вы пытаетесь получить доступ.

1 голос
/ 05 мая 2017

$ key.OpenSubKey ($ subkeyName) открывает подраздел в режиме защиты от записи, $ key.OpenSubKey ($ subkeyName, $ true) открывает его в режиме записи

Следовательно, после $ key.OpenSubKey ($ subkeyName, $ true) вы сможете создать новый подраздел или значение

Если вы попытаетесь сделать то же самое после $ key.OpenSubKey ($ subkeyName), вы получите «UnauthorizedAccessException»

1 голос
/ 11 сентября 2014
PS C:\>$regKey.OpenSubKey

OverloadDefinitions

Microsoft.Win32.RegistryKey OpenSubKey(string name, **bool Writable**)

попробовать

PS C:\>$key.OpenSubKey($subkeyName,**$true**)

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

0 голосов
/ 14 января 2016

Сначала я хотел бы поблагодарить всех за действительно полезные ответы, хотел добавить, что вы можете использовать команду Get-Credential для сбора учетных данных без необходимости жесткого кодирования в вашем скрипте. С помощью приведенных выше предложений я написал в свой скрипт следующий код и запрос:

$userCredentials = Get-Credential -Credential <domain\username>
$objReg = Get-WmiObject -List -Namespace root\default -ComputerName $server -Credential $userCredentials | Where-Object{$_.Name -eq "StdRegProv"}
$subKeyNames = $objReg.EnumKey($HKLM,"SOFTWARE\Microsoft\Updates\Microsoft .Net Framework 4.5.1").sNames

Приведенный выше код возвращает все имена вложенных ключей в указанном ключе, чтобы я мог определить установленные обновления, кроме ОС, которые были применены к серверу. Если вы хотите определить все возможности сбора с помощью переменной $ objReg, выполните:

$objReg | Get-Member

Вы увидите список всех возможных запросов к реестру. Надеюсь, это поможет!

0 голосов
/ 01 апреля 2011

Пришел в поисках ответа на ваш вопрос, но, немного погуглив сегодня утром, я заметил, что первый параметр - это тип, а не строка ... надеюсь, это поможет:

$machine = "<Machine Name Goes Here>"
$type = [Microsoft.Win32.RegistryHive]::LocalMachine
$regkey = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey($type,$machine)
$subkey = $regKey.OpenSubKey($key)
foreach ($sub in $regKey.GetSubKeyNames()){$sub}
...