Powershell OpenRemoteBaseKey()凭据

Powershell OpenRemoteBaseKey()凭据,powershell,registry,.net,permissions,Powershell,Registry,.net,Permissions,我正在尝试使用powershell访问远程注册表,如下所示: $reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey("LocalMachine", $server) $key = $reg.OpenSubkey($subkeyPath) 取决于一些我还不能确定的因素,我得到 使用“1”参数调用“OpenSubKey”时出现异常:“不允许请求的注册表访问。” 或 System.UnauthorizedAccessException:试图执

我正在尝试使用powershell访问远程注册表,如下所示:

$reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey("LocalMachine", $server)
$key = $reg.OpenSubkey($subkeyPath)
取决于一些我还不能确定的因素,我得到

使用“1”参数调用“OpenSubKey”时出现异常:“不允许请求的注册表访问。”

System.UnauthorizedAccessException:试图执行未经授权的操作。 位于Microsoft.Win32.RegistryKey.Win32 ErrorStatic(Int32 errorCode,字符串str) 位于Microsoft.Win32.RegistryKey.OpenRemoteBaseKey(RegistryHive-hKey,字符串machineName)


很明显,这是因为我运行powershell脚本的用户没有访问远程注册表的相应凭据。我希望能够提供一组用于远程注册表访问的凭据,但我在任何地方都找不到实现这一点的文档。我也不清楚在何处指定允许哪些用户远程访问注册表。

是来寻找你问题的答案的,但今天早上我在谷歌上搜索了一下,发现第一个参数是类型而不是字符串。。。希望这有助于:

$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}
$machine=“”
$type=[Microsoft.Win32.RegistryHive]::LocalMachine
$regkey=[Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey($type,$machine)
$subkey=$regKey.OpenSubKey($key)
foreach($regKey.GetSubKeyNames()中的sub){$sub}

您正在运行远程注册表服务吗?默认情况下,它处于禁用状态,这一定是导致问题的原因。检查您试图访问的所有远程计算机上此服务的状态。

我想我也应该向任何有此问题的人添加我的答案。似乎无法使用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

希望这对某人有所帮助:)

我无法直接评论上面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
重载定义 试一试


我想首先感谢所有人提供了上述非常有用的答案,我想补充一点,您可以使用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
您将看到可以对注册表执行的所有可能查询的列表。希望这有帮助

$key.OpenSubKey($subkeyName)以写保护模式打开子键, $key.OpenSubKey($subkeyName,$true)以可写模式打开它

因此,在$key.OpenSubKey($subkeyName,$true)之后,您应该能够创建一个新的子键或值


如果您在$key.OpenSubKey($subkeyName)之后尝试相同的操作,您将得到“UnauthorizedAccessException”

因为它的价值,我追求的是完全相同的解决方案。
Microsoft.Win32.RegistryKey OpenSubKey(string name, **bool Writable**)
PS C:\>$key.OpenSubKey($subkeyName,**$true**)
$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 | Get-Member