Учетные данные OpenRemoteBaseKey ()

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

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

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

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

Or

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

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


person sgibbons    schedule 15.07.2009    source источник
comment
Как бы то ни было, я ищу точно такое же решение.   -  person The KZA    schedule 07.08.2009


Ответы (7)


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

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

person Ben Taylor    schedule 17.06.2013

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

person ravikanth    schedule 01.04.2011

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

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

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

$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
person ddncn    schedule 16.08.2013

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

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

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

person Wolfgang K    schedule 05.05.2017

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

person Hansel    schedule 11.09.2014

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

$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}
person pmorrisonfl    schedule 01.04.2011

Сначала я хотел поблагодарить всех за очень полезные ответы, приведенные выше, хотел добавить, что вы можете использовать команду 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

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

person user5790768    schedule 14.01.2016