为所有用户设置registry值

什么是为机器上的所有用户设置registry值的最佳方法。 枚举HKEY_USERS并更改ntuser.dat是一个解决scheme。

任何其他的解决scheme,可以在XP,VISTA以及Windows 7中使用?

实际上安装程序需要将一个密钥写入registry。 而这个关键需要被所有的用户使用。 一旦使用过的密钥应该重置。

如果我们只保留HKLM的一个密钥副本,这是不能做到的。 因为如果第一个用户使用它并重置它,然后其他用户将无法使用它。

唯一我能想到的解决scheme是在所有用户中写入密钥,但在Windows 7中不起作用。

所有需要此功能的软件所使用的模式是,HKLM是安装时设置的默认只读存储器。

在运行时,软件必须首先尝试从HKCU读取数据,如果HKCU数据不存在或者陈旧,则回退到HKLM。 普通用户总是写信给HKCU,确保他们自己的设置跟踪他们自己的喜好。

管理工具可以写入HKLM来改变用户的默认值。 这是一个工作,但你可以使用明确的时间戳条目,保存上一次在蜂巢中的值改变,并使用这个从HKLM刷新HKCU,每当HKLM有一个更新的时间戳,以迎合“系统管理员”可能需要能够将某些设置重置为不同的默认值。

除非拥有管理员权限,否则不能写入其他用户拥有的注册表部分。 如果你可以获得管理员权限,使用HKLM会更好。 即使你可以迭代HKEY_USERS这也是一个脆弱的解决方案。

你可能不想要求管理员权限。 在这种情况下,注册管理机构没有一个非管理员用户可以存储要在所有用户之间共享的数据的地方。 因此,您应该将其保存到CSIDL_COMMON_APPDATA的文件中。

另一方面,也许你想要实现的是在安装时设置一个值,用户可以选择。 如果他们然后修改您的应用程序中的设置,您希望它保存在HKCU下。 您可以通过将默认设置写入HKLM来轻松完成此操作。 然后当你的应用程序读取设置它首先在HKCU看起来。 如果该设置不存在,则将其从HKLM读出。 应用程序始终将值写入HKCU 。 另一种方法是在程序中建立默认设置,而不是简化安装程序的HKLM

底线是HKEY_USERS迭代不是一个好的解决任何问题,我可以设想。

HKEY_LOCAL_MACHINE\Software\YourPath 。 它可以在安装时使用或通过管理员权限使用。 你想每个用户和每次都编辑你的密钥吗?

在这种情况下:在安装时在HKEY_LOCAL_MACHINE\Software\YourPath 创建您的密钥,并指定SECURITY_ATTRIBUTES为MSDN库显示。

它是你的注册表值? 在这种情况下,将其保存在HKEY_LOCAL_MACHINE中,以便只有一个副本。

否则,通过HKEY_USERS迭代听起来不错,并且可以在XP和Vista上工作,只要你有适当的权限来更改其他用户的注册表。

解决方案:您将钥匙保存在安装程序中的HKLM中。 当用户读取它时,它会向HKCU写一个单独的密钥,注意它已经使用了共享密钥,所以下次不会读取它。 问题解决了。

如果您在注册表的HKCU部分安装了一些等待注册表值的应用程序,则不能选择任何其他注册表位置。 因此,要定制已安装的应用程序,必须将HKCU部分设置为将在计算机上工作的所有用户。 这是软件部署中的标准问题。

我发现问题的最佳解决方案使用如此命名的“主动安装”,您可以在这里或这里阅读。 该方法的优点是不仅可以与本地用户配置文件一起工作 ,而且可以与漫游用户配置文件一起工作 。

也许你可以尝试使用Active Setup。

我已经找到一种方法将.reg文件推送到reg中的所有用户配置文件。 您需要管理员权限和Powershell。

我在sccm中使用它,所以我希望它从一个.bat开始,它使用.reg来导入current_user设置和一个powershell脚本。

Powershellscript文件名WriteToHkcuFromSystem.ps1

参数(

 [Parameter(Mandatory=$true)] [ValidatePattern('\.reg$')] [string]$RegFile, [switch]$CurrentUser, [switch]$AllUsers, [switch]$DefaultProfile ) 

函数Write-Registry {PARAM($ RegFileContents)$ tempFile ='{0} {1:yyyyMMddHHmmssff} .reg'-f [IO.Path] :: GetTempPath(),(Get-Date)$ RegFileContents | 文件-FilePath $ tempFile Write-Host('从文件{0}'写入注册表-f $ tempFile)try {$ p =启动进程-FilePath C:\ Windows \ regedit.exe -ArgumentList“/ s $ tempFile如果($ p -ne $ null){$ exitCode = $ p.ExitCode} else {$ exitCode = 0} if($ exitCode -ne 0){Write-Warning'错误合并注册文件'}其他{删除项目路径$ tempFile -Force -ErrorAction SilentlyContinue}}

if(-not(Test-Path -Path $ RegFile)){Write-Warning“RegFile $ RegFile does not exist。Operation aborted”} else {

 if($CurrentUser -or $AllUsers -or $DefaultProfile) { Write-Host ('Reading the registry file {0}' -f $RegFile) $registryData = Get-Content -Path $RegFile -ReadCount 0 if($CurrentUser) { Write-Host "Writing to the currenlty loggoed on user's registry" $explorers = Get-WmiObject -Namespace root\cimv2 -Class Win32_Process -Filter "Name='explorer.exe'" $explorers | ForEach-Object { $owner = $_.GetOwner() if($owner.ReturnValue -eq 0) { $user = '{0}\{1}' -f $owner.Domain, $owner.User $ntAccount = New-Object -TypeName System.Security.Principal.NTAccount($user) $sid = $ntAccount.Translate([System.Security.Principal.SecurityIdentifier]).Value $RegFileContents = $registryData -replace 'HKEY_CURRENT_USER', "HKEY_USERS\$sid" Write-Registry -RegFileContents $RegFileContents } } } if($AllUsers) { Write-Host "Writing to every user's registry" $res = C:\Windows\system32\reg.exe query HKEY_USERS $res -notmatch 'S-1-5-18|S-1-5-19|S-1-5-20|DEFAULT|Classes' | ForEach-Object { if($_ -ne '') { $sid = $_ -replace 'HKEY_USERS\\' $RegFileContents = $registryData -replace 'HKEY_CURRENT_USER', "HKEY_USERS\$sid" Write-Registry -RegFileContents $RegFileContents } } } if($DefaultProfile) { Write-Host "Writing to the default profile's registry (for future users)" C:\Windows\System32\reg.exe load 'HKU\DefaultUser' C:\Users\Default\NTUSER.DAT | Out-Null $RegFileContents = $registryData -replace 'HKEY_CURRENT_USER', 'HKEY_USERS\DefaultUser' Write-Registry -RegFileContents $RegFileContents C:\Windows\System32\reg.exe unload 'HKU\DefaultUser' | Out-Null } } else { Write-Warning 'No mode was selected. Operation aborted' } } 

蝙蝠文件名addreg.bat

PowerShell.exe Set-ExecutionPolicy -ExecutionPolicy不受限制

PowerShell.exe -File“%〜dp0WriteToHkcuFromsystem.ps1”-RegFile“%〜dp0Example.reg” – CurrentUser -AllUsers -DefaultProfile

PowerShell.exe Set-ExecutionPolicy -ExecutionPolicy受限

和.reg文件Example.reg

Windows注册表编辑器版本5.00

[HKEY_CURRENT_USER \ Software \ blabla] value = 1等等