为所有用户设置注册表值

时间:2011-04-19 10:33:15

标签: c++ windows winapi registry

为计算机上的所有用户设置注册表值的最佳方法是什么。 枚举HKEY_USERS并更改ntuser.dat是一种解决方案。

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

实际上安装程序需要将一个密钥写入注册表。并且所有用户都需要使用该密钥。一旦其使用的密钥应重置。

如果我们在HKLM中只保留一份密钥,则无法执行此操作。因为如果第一个用户使用它并重置它,那么其他用户将无法使用它。

我能想到的唯一解决办法就是在所有用户中编写该密钥,但在Windows 7的情况下这不起作用。

7 个答案:

答案 0 :(得分:6)

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

您可能不希望要求管理员权限。在这种情况下,注册表没有非管理员用户可以存储要在所有用户之间共享的数据的位置。因此,您应该保存到CSIDL_COMMON_APPDATA

中的文件

另一方面,您可能要实现的目标是在安装时设置一个用户可以选择的值。如果他们随后修改了您应用中的设置,则需要将其保存在HKCU下。您可以通过将默认设置写入HKLM来轻松完成此操作。然后当您的应用程序读取设置时,它首先会在HKCU中查看。如果该设置不存在,则会从HKLM中读取该设置。应用程序始终将值写入HKCU。另一种变体是将默认设置构建到程序中而不是HKLM,这简化了安装程序。

底线是HKEY_USERS的迭代不是我能设想的任何问题的好方法。

答案 1 :(得分:0)

这是您的注册表值吗?在这种情况下,请将其保存在HKEY_LOCAL_MACHINE中,这样您只有一个副本。

否则,迭代HKEY_USERS听起来不错,只要你有适当的权限为其他用户更改注册表,就可以在XP和Vista上运行。

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

答案 2 :(得分:0)

HKEY_LOCAL_MACHINE\Software\YourPath。它可以在安装时使用,也可以通过管理员权限使用。您是否希望每个用户和每次都编辑您的密钥?

在这种情况下:安装时间create将您的密钥放在HKEY_LOCAL_MACHINE\Software\YourPath中,并指定SECURITY_ATTRIBUTES作为MSDN库展示。

答案 3 :(得分:0)

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

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

管理工具可以写入HKLM以更改用户默认值。这有点工作,但您可以使用显式时间戳条目,保存上一次更改配置单元中的值,并使用此选项从HKLM刷新HKCU,只要HKLM有一个更新的时间戳,以满足“系统管理员”可能需要能够将某些设置重置为不同的默认值。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

我找到问题的最佳解决方案,使用名为“Active Setup”的“Active Setup”,您可以阅读herehere。该方法的优点是它不仅可以使用local user profiles,还可以使用roaming user profiles

答案 6 :(得分:0)

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

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

Powershellscript文件名WriteToHkcuFromSystem.ps1

  

PARAM(

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

函数Write-Registry {       参数($ RegFileContents)       $ tempFile ='{0} {1:yyyyMMddHHmmssff} .reg'-f [IO.Path] :: GetTempPath(),(Get-Date)       $ RegFileContents | Out-File -FilePath $ tempFile       Write-Host('从文件{0}写入注册表'-f $ tempFile)       尝试{$ p = Start-Process -FilePath C:\ Windows \ regedit.exe -ArgumentList“/ s $ tempFile”-PassThru -Wait} catch {}       if($ p -ne $ null){$ exitCode = $ p.ExitCode} else {$ exitCode = 0}       if($ exitCode -ne 0){           写警告'合并reg文件时出错“       } else {           Remove-Item -Path $ tempFile -Force -ErrorAction SilentlyContinue       }}

     

if(-not(Test-Path -Path $ RegFile)){       写警告“RegFile $ RegFile不存在。操作中止”}其他{

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'
} }

bat filename addreg.bat

  

PowerShell.exe Set-ExecutionPolicy -ExecutionPolicy Unrestricted

     

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

     

PowerShell.exe Set-ExecutionPolicy -ExecutionPolicy Restricted

和.reg文件Example.reg

  

Windows注册表编辑器版本5.00

     

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

相关问题