c ++ - Indstilling af registreringsværdi for alle brugere

Indlæg af Hanne Mølgaard Plasc

Problem



Hvad er den bedste måde at angive registreringsværdi for alle brugere på en maskine.
Opregning af HKEY\_USERS og ændring af ntuser.dat er en løsning.


Enhver anden løsning, der kan bruges i XP, VISTA samt Windows 7?


Faktisk installatør skal skrive en nøgle i registreringsdatabasen. Og den nøgle skal bruges af alle brugere. Når den brugte nøgle skal nulstilles.


Dette kan ikke gøres, hvis vi kun holder en kopi af nøglen i HKLM. Da hvis den første bruger bruger det og nulstiller det, og så vil andre brugere ikke kunne bruge det.


Kun løsning, jeg kan tænke på, skriver den nøgle i alle brugere, men det virker ikke i tilfælde af Windows 7.

Bedste reference


Mønsteret, der bruges af alle de programmer, der har brug for denne facilitet, er, HKLM er en skrivebeskyttet butik af standardindstillinger, der er indstillet på installationstidspunktet.


I løbet af tiden skal softwaren altid forsøge at læse fra HKCU først og tilbagekalde til HKLM, hvis HKCU data ikke er til stede eller forældet. Regelmæssige brugere skriver altid til HKCU og sikrer, at deres egne indstillinger sporer deres egne præferencer.


Administrative værktøjer kan skrive til HKLM for at ændre brugerens standardindstillinger. Det er lidt arbejde, men du kan bruge eksplicitte tidsstempel poster, gemmer den sidste gang en værdi i bikuperen blev ændret, og brug denne til at opdatere HKCU fra HKLM, når HKLM har en friskere tidsstempel til at tage højde for 'systemadministratorer' måske behov for at kunne nulstille visse indstillinger til forskellige standardindstillinger.

Andre referencer 1


Du kan ikke skrive til dele af registret ejet af andre brugere, medmindre du har administratorrettigheder. Hvis du kan få administratorrettigheder, ville du være meget bedre ved at bruge HKLM. Selvom man kunne gentage sig over HKEY\_USERS, er det i bedste fald en sprød løsning.


Du vil sandsynligvis ikke kræve administratorrettigheder. I så fald har registreringsdatabasen ikke et sted, hvor ikke-admin-brugere kan gemme data, der skal deles mellem alle brugere. Derfor skal du gemme til en fil i CSIDL\_COMMON\_APPDATA. [16]


På den anden side er det måske, hvad du forsøger at opnå, at fastsætte en værdi på installationstid, som brugerne vil afhente. Hvis de derefter ændrer indstillingen i din app, skal du gemme den under HKCU. Du kan gøre det ganske let ved at skrive dine standardindstillinger til HKLM. Så når din app læser indstillingerne, ser den først ud i HKCU. Hvis indstillingen ikke er til stede, læser den den ud af HKLM. Appen skriver altid værdierne til HKCU. En anden variant er at opbygge standardindstillingerne i programmet i stedet for HKLM, hvilket forenkler installationsprogrammet.


Grunden er, at iterering af HKEY\_USERS ikke er en god løsning på ethvert problem, som jeg kan forestille mig.

Andre referencer 2


HKEY\_LOCAL\_MACHINESoftwareYourPath. Det kan bruges på installationstid eller ved administratorrettigheder. Vil du redigere din nøgle af hver bruger og hver gang?


I dette tilfælde: Opret din nøgle i HKEY\_LOCAL\_MACHINESoftwareYourPath og angiv en SECURITY\_ATTRIBUTES som MSDN-bibliotek viser. [17] [18] [19]

Andre referencer 3


Er det din registreringsværdi? I så fald skal du gemme det i HKEY\_LOCAL\_MACHINE, så du kun har en kopi.


Ellers lyder iterating over HKEY\_USERS godt og vil også fungere på XP og Vista, så længe du har rette rettigheder til at ændre registreringsdatabasen til andre brugere.


LØSNING: Du gemmer nøglen i HKLM i installationsprogrammet. Når en bruger læser det, skriver den en separat nøgle til HKCU, idet man bemærker, at den har brugt den delte nøgle, så den vil ikke læse den næste gang. Problemet løst.

Andre referencer 4


Hvis du installerer noget program, der venter på registreringsværdien i HKCU-delen af ​​registreringsdatabasen, kan du ikke vælge et andet registreringssted. Så for at tilpasse det installerede program skal man indstille HKCU del af alle brugere, som vil arbejde på computeren. Det er standardproblemet i softwareudbredelsen.


Jeg finder den bedste løsning på problemet at bruge så navngivet 'Active Setup', som du kan læse her eller her. Fordelen ved metoden er, at den ikke kun fungerer med de lokale brugerprofiler, men også med roaming brugerprofiler. [21] [22] [23]

Andre referencer 5


Måske kan du prøve at bruge Active Setup.

Andre referencer 6


Jeg har fundet en måde at skubbe en .reg-fil til alle brugerkorvninger i reg. Du har brug for admin adgang og Powershell.


Jeg bruger dette i sccm, så jeg ønskede at starte fra en .bat det bruger en .reg til at importere current\_user indstillinger og et powershell script.


Powershellscript filnavn WriteToHkcuFromSystem.ps1



  PARAM (


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

  
  funktion skrive-register {
      PARAM ($ RegFileContents)
      $ tempFile='{0} {1: yyyyMMddHHmmssff} .reg' -f [[IO.Path]] :: GetTempPath (), (Get-Date)
      $ RegFileContents | Out-File -FilePath $ tempFile
      Skriv-vært ('Skrivning af registreringsdatabasen fra fil {0}' -f $ tempFile)
      Prøv {$ p=Start-Process -FilePath C: \ Windows \ regedit.exe -ArgumentList '/s $ tempFile' -PassThru -Wait} fange {}
      hvis ($ p -ne $ null) {$ exitCode=$ p.ExitCode} ellers {$ exitCode=0}
      hvis ($ exitCode -ne 0) {
          Skriv-advarsel 'Der opstod en fejl sammenlægning af regfilen'
      } ellers {
          Fjern-Item -Path $ tempFile -Force -ErrorAction SilentlyContinue
      }}

  
  hvis (-not (Test-Path-Path $ RegFile)) {
      Skriv-advarsel 'RegFile $ RegFile eksisterer ikke. Operation afbrudt '} ellers {


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 rootcimv2 -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:Windowssystem32
eg.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:WindowsSystem32
eg.exe load 'HKUDefaultUser' C:UsersDefaultNTUSER.DAT | Out-Null
        $RegFileContents = $registryData -replace 'HKEY\_CURRENT\_USER', 'HKEY\_USERSDefaultUser'
        Write-Registry -RegFileContents $RegFileContents
        C:WindowsSystem32
eg.exe unload 'HKUDefaultUser' | Out-Null
    }

} else {
    Write-Warning 'No mode was selected. Operation aborted'
} }



bat filnavn addreg.bat



  PowerShell.exe Set-ExecutionPolicy -ExecutionPolicy Ubegrænset

  
  PowerShell.exe -File '\% ~ dp0WriteToHkcuFromsystem.ps1' -RegFile
  '\% ~ dp0Example.reg' -CurrentUser -AllUsers -DefaultProfile

  
  PowerShell.exe Set-ExecutionPolicy -ExecutionPolicy Begrænset



og .reg fil Example.reg



  Windows Registry Editor Version 5.00

  
  [[HKEY\_CURRENT\_USER \ Software \ blabla]] værdi=1 osv. Osv