WARNING: Could not open/create prefs root node Software\JavaSoft\Prefs

206 阅读1分钟

Java的已知问题,完整错误信息通常如:

java.util.prefs.WindowsPreferences <init>
WARNING: Could not open/create prefs root node Software\JavaSoft\Prefs at root 0x80000002. Windows RegCreateKeyEx(...) returned error code 5.

此时你需要尝试在注册表中找到以下三项:

计算机\HKEY_CURRENT_USER\Software\JavaSoft\Prefs
计算机\HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Prefs
计算机\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\JavaSoft\Prefs

如果其中任何一项不存在,创建它,然后设置其权限为对Users完全控制。

可以用以下PowerShell脚本一键设置:

function 设置访问控制([Microsoft.Win32.RegistryKey]$注册表键, [System.Security.AccessControl.RegistryAccessRule]$访问规则) {
	$注册表键.CreateSubKey("Prefs")
	$访问控制 = $注册表键.GetAccessControl()
	$访问控制.AddAccessRule($访问规则)
	$注册表键.SetAccessControl($访问控制)
}
$ScriptPath = (Get-Variable MyInvocation).Value.MyCommand.Path
$ScriptDir = Split-Path -Parent $ScriptPath
if ([Security.Principal.WindowsIdentity]::GetCurrent().Groups.Value -contains "S-1-5-32-544") {
	try {
		$注册表访问规则 = New-Object System.Security.AccessControl.RegistryAccessRule ("Users", [System.Security.AccessControl.RegistryRights]::FullControl, 3, 0, [System.Security.AccessControl.AccessControlType]::Allow)
		设置访问控制 ([Microsoft.Win32.Registry]::CurrentUser.CreateSubKey("Software\JavaSoft")) $注册表访问规则
		设置访问控制 ([Microsoft.Win32.Registry]::LocalMachine.CreateSubKey("SOFTWARE\JavaSoft")) $注册表访问规则
		设置访问控制 ([Microsoft.Win32.Registry]::CurrentUser.CreateSubKey("SOFTWARE\WOW6432Node\JavaSoft")) $注册表访问规则
	}
	catch {
		$Error[0]
		Pause
	}
}
else {
	Start-Process (Get-Process -Id $PID).Path -Verb RunAs -ArgumentList ('-ExecutionPolicy Unrestricted -file "' + $ScriptPath + '"')
}