c ++ - Registreringsværdier for hver enkelt bruger

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har et program, der læser og skriver registerfiler for at huske vinduets position osv. Dette er meget enkelt, når det kommer til at være administrator, men ikke så meget, når du bare er bruger på systemet.


Jeg bruger avanceret installationsprogram, hvis du har nogle seje forslag til den ende.



  1. Hvor skal registreringsparametre placeres for at hver bruger skal bruge min ansøgning med deres egne registreringsværdier?

  2. Er den vej generel nok, så programmet kan finde den mappe uden at løbe ind i problemer?



Redigerer/Opdateringer:


Spørgsmål 1: Hvor lægger du ting, hvis ikke i HKEY\_CURRENT\_USER?


Svar: Når jeg lægger filerne under HKEY\_CURRENT\_USER, placeres den kun under den bruger. Så hvis jeg skulle installere programmet som administrator, ville det kun være den bruger, der har filerne. Som jeg bruger avanceret installationsprogram, er jeg ikke sikker på, om det falder under nogle indstillingsværdier.


Erklæring 1 fra Bogdan Mitrache:
Hvis du foretrækker det, kan du også udnytte den selvhelbredende support fra Windows Installer (understøttet af Advanced Installer også) for at få installationsprogrammet til at skrive standardindstillingerne under HKCU for hver bruger, der starter appen, selvom den er installeret af administratoren. Her er et eksempel med filer, men det gælder også for registreringsdatabasen: advancedinstaller.com/user-guide/qa-self-healing.html


Svar: Dette er en god løsning med undtagelse af problemet, at jeg har en betinget installation. Brugeren kan vælge at installere en eller den anden funktion, hvor begge bruger disse registreringsværdier. Det er nok, hvorfor det ikke virker for mig. Jeg vil se over duplikere filerne i en logisk forstand i AI.

Bedste reference


Den korrekte måde at håndtere dette på er at gemme standard -værdier (f.eks. Under installation) i HKEY\_LOCAL\_MACHINE (hvis overhovedet), og gem derefter brugerspecifik værdier i HKEY\_CURRENT\_USER.


Når appen skal læse en værdi, skal du først tjekke ind HKEY\_CURRENT\_USER, og hvis den ikke findes, skal du tjekke ind HKEY\_LOCAL\_MACHINE (eller bruge en hardkodet standard).


Når appen skal gemme en værdi, gem den kun i HKEY\_CURRENT\_USER.


Og ja, det betyder, at hvis din app bliver kørt af en administrator, vil den som standard læse værdien fra administratorens nøgle og gemme værdien i administratorens nøgle. Og det er helt ok, fordi administratoren er brugeren af ​​appen på det tidspunkt. Hvis appen køres af en ikke-administrator, vil værdierne være i forhold til den pågældende bruger i stedet.


I en situation hvor appen kører som en administratorbruger, men skal læse/gemme en værdi i en anden brugers HKEY\_CURRENT\_USER nøgle (for eksempel når en ikke-admin bruger er logget ind i Windows og appen kører med UAC elevation ved hjælp af en anden brugers login), så kan appen åbne HKEY\_CURRENT\_USER -tasten til den anden bruger af enten:



  • efterligner den anden bruger og bruger derefter RegOpenCurrentUser(). [14]

  • Indlæs den anden brugers profil ved hjælp af LoadUserProfile(), som returnerer et håndtag til den indlæste brugeres HKEY\_CURRENT\_KEY nøgle (blandt andet). [15]



Hvis du vil få adgang til en anden brugers HKEY\_CLASSES\_ROOT tast i stedet for HKEY\_CURRENT\_USER, kan du bruge RegOpenUserClassesRoot(). [16]