2009-11-05 14 views
5

Ho diverse app di vecchia data scritte in Delphi che mantengono le loro impostazioni nel registro. Ho usato HKEY_LOCAL_MACHINE per le impostazioni 'hard' come le preferenze di configurazione e HKEY_CURRENT_USER per informazioni 'soft' come posizioni delle finestre, liste MRU, ecc.Accesso al registro in modalità non amministratore

Ora i miei utenti mi dicono che in modalità non amministratore (utente standard) le app non funzionano. Guardando, vedo che non sono in grado di leggere un'impostazione inserita in HKEY_LOCAL_MACHINE quando l'app era in modalità amministratore.

Quali sono le opzioni per questo? Conosco poco sulla modalità standard e su come questo influenzi l'accesso al registro. Qualsiasi informazione apprezzata.

+3

Suggerimento: Si potrebbe desiderare di provare a sviluppare con un account non-power-user. Sì, a volte può essere un po 'fastidioso, ma in questo modo ti assicuri che le "sorprese" come quelle che hai appena incontrato non ti colpiscano in faccia. La politica aziendale è in molti negozi di sviluppo per una buona ragione. –

+0

Come si comporterebbe la tua applicazione con Windows 2000 o Windows XP come utente standard? Questo ti guiderà su come dovrebbe comportarsi in Windows Vista o Windows 7 come utente standard. –

risposta

14

È possibile leggere da HKLM come utente non amministratore; non puoi semplicemente scriverci sopra.

Utilizzare TRegistry.Create (KEY_READ) durante la costruzione e impostare RootKey su HKLM.

var 
    Reg: TRegistry; 
begin 
    Reg := TRegistry.Create(KEY_READ) 
    try 
    Reg.RootKey := HKLM; 
    // Read value here 
    finally 
    Reg.Free; 
    end; 
end; 

È inoltre possibile utilizzare TRegistry.OpenKeyReadOnly() quando si apre una chiave di registro specifico; questo aiuta anche l'accesso non amministratore alle aree del registro.

+0

Probabilmente non stai usando la sola lettura con il tuo codice esistente, motivo per cui fallisce. L'uso della soluzione di Ken dovrebbe risolverlo per te con le modifiche minime. –

+0

È fantastico Ken, proprio quello che stavo cercando. –

+1

@Brian: Felice di poter aiutare. Potresti anche considerare il commento di Paul-Jan alla tua domanda; probabilmente dovresti almeno provare sotto un account non amministratore per catturare questo tipo di cose. MS ha iniziato a stringere le cose (volontariamente) con XP, e ha applicato più restrizioni dal rilascio di Vista. –

0

Le opzioni includono (a) utilizzare un file di configurazione INI/XML in un percorso che non richiede diritti di amministratore o (b) modificare la sicurezza della sottochiave in HKLM utilizzando uno strumento come SetACL (pubblico dominio).

Il problema con l'opzione a è la modifica delle disposizioni delle cartelle tra XP e Vista/W7. Credo che Vista abbia stretto l'accesso a CSIDL COMMON APPDATA: gli utenti standard non hanno accesso in scrittura se la memoria serve. Potrebbe essere necessario memorizzarli nella propria cartella e disporre autonomamente i diritti di accesso. Fastidioso.

Un problema interessante con l'opzione b è che ora ci sono pochi piccoli strumenti in uso negli ambienti aziendali che eseguono la scansione del registro e "correggono" i diritti di accesso che ritengono sbagliati. Non abbiamo ancora riscontrato problemi con i clienti che li utilizzano, ma siamo consapevoli che esistono. Date le prestazioni del registro, preferiamo ancora l'approccio HKLM modificato e continueremo a farlo nel prossimo futuro.

+2

Il problema con l'opzione B è che viola le basi della sicurezza di Windows che MS e le applicazioni hanno cercato di implementare dall'introduzione di XP, e impone dal rilascio di Vista. Evitarli modificando la sicurezza nel registro è solo una cattiva pratica di programmazione. L'installer deve essere eseguito come amministratore e, se necessario, scrivere in HKLM in quel momento. La tua app dovrebbe funzionare come un non amministratore e leggere da (non scrivere su) HKLM nel modo appropriato, se necessario. Soluzioni alternative come quella di cambiare la sicurezza sono proprio queste - hack - che dovrebbero essere evitate. La sicurezza di Corp lo odia anche. –

+1

Per quanto possa sembrare strano, in realtà sono d'accordo con te. Vorrei che non dovessimo farlo. Avevamo tutti l'intenzione di passare all'utilizzo di un file system cfg tramite Common Appdata quando MS ha modificato le regole di accesso per quello in Vista. Fino a quando MS non riconoscerà che esistono classi di sistemi che necessitano di un'app di contesto non amministratore per modificare le impostazioni che interessano altri utenti, siamo bloccati. –

+0

@Bob: Possono riconoscerlo, ma la scelta non è facile. È lo stesso con la posizione dei file di dati comuni. Non avere una posizione che sia scrivibile in tutto il mondo in un'installazione predefinita sembra davvero una buona idea quando si considera la sicurezza. Un'installazione standard di un sistema simile a Unix non ha nemmeno una posizione simile. root/Administrator può creare manualmente tale posizione ed eventualmente impostare una quota per impedire a un utente malintenzionato di riempire tutto lo spazio vuoto sulla partizione/unità. – mghie

1

Un'opzione, che non favorisco ma che menzionerò, è quella di dare a tutti (o un gruppo definito ecc.) Il permesso di accedere alla propria chiave. Ci sono vari modi per farlo, e c'è del codice nel JCL che lo farà, oppure puoi usare Regedit. Ma se dai il permesso (a quel ramo specifico di HKLM) allora funzionerà come volevi.

+1

Questa è una pessima idea. Ci sono ragioni per cui HKLM non è scrivibile da non amministratori; essendo in grado di scrivere c'è un vettore di attacco per virus e malware. Evitarlo perché sei troppo pigro per fare le cose nel modo giusto e metterle alla prova nel modo giusto non è una buona idea. –

+0

Sono d'accordo - quindi non lo favorisco. Ma se questa è un'applicazione interna utilizzata da tre persone, potrebbe essere accettabile. E interesserebbe solo quella applicazione. Certamente non è qualcosa da fare per una nuova applicazione o per qualsiasi app distribuita in massa. Per loro, fallo correttamente. – mj2008

2

L'altra cosa che nessuno ha menzionato qui è il problema della virtualizzazione del registro su Vista & Win7 (almeno). Potrebbe non essere un problema nel tuo scenario particolare, ma ho pensato di parlarne comunque nel caso in cui sia rilevante.
Anche se il tuo utente ha diritti di amministratore, se la tua applicazione NON è in esecuzione "elevata" su Vista/Win7, la tua app non sarà ancora in grado di scrivere sulla chiave "reale" HKLM che pensi sia. Sarà letto e scritto su una copia virtualizzata della chiave HKLM appropriata che vede solo quel particolare utente.
Per "elevato", voglio dire che ti sarà stato richiesto con un prompt UAC su Vista/Win7. Esegui Regedit.exe ad esempio su Vista/Win7, e ti verrà richiesto un prompt UAC.
Se sei su Vista/Win7, è possibile che questo sia il problema che descrivi quando dici che non è possibile leggere una chiave/valore che è stato scritto in modalità amministratore. In tal caso, ciò avverrebbe perché la tua app ha in un certo momento scritto ciò che ora è una chiave/valore virtualizzato; la tua app ora vedrà sempre quella chiave/valore, anche se un amministratore modifica il valore "reale".
Come altri hanno già detto, la tua app non dovrebbe provare a scrivere su HKLM. Se si sente che ha bisogno di scrivere a HKLM, poi su Vista/Win7 le opzioni sono (e queste opzioni possono essere fatte funzionare bene su XP troppo):

  • aggiunge un manifesto per la vostra applicazione richiede diritti di amministratore elevati come da questo example.
  • Dividere le funzionalità che richiedono l'accesso HKLM in una libreria COM separata e istanziarlo come un oggetto COM elevato come e quando è necessario. Questo è più complicato, ma è un modo ragionevole per refactoring funzionalità esistenti.

Here Un'altra domanda SO che affronta alcuni di questi problemi.

+0

La domanda riguardava * la lettura * da HKLM, non la scrittura, quindi la virtualizzazione del registro non si applica. –

+0

BTW, non downvoting perché, anche se non ha nulla a che fare con la domanda in questione, è comunque una buona informazione. –

+0

@Ken: leggendo tra le righe della domanda originale, la mia ragionevole interpretazione era che l'app dell'OP utilizza HKLM per memorizzare le "preferenze" di configurazione, il che implica leggere e scrivere. –

1

Dal punto di vista dello sviluppatore Il controllo dell'account utente di Windows può essere problematico per alcune parti dell'applicazione Delphi, se l'applicazione non viene eseguita da un amministratore. Una di queste operazioni sta scrivendo nel database del Registro.

devi "richiesta di diritti di amministratore" di creazione di un file manifesto dell'applicazione ....

Windows Vista/7 - Controllo dell'account utente

User Account Control è un componente di sicurezza in Windows Vista . Il controllo dell'account utente consente agli utenti di eseguire attività comuni come non amministratori, denominati utenti standard in Windows Vista e come amministratori senza dover cambiare utente, disconnettersi o utilizzare Esegui come. Per aiutare a prevenire l'installazione invisibile di software dannoso e causare infezioni a livello di computer, Microsoft ha sviluppato la funzionalità UAC.

Dal punto di vista degli sviluppatori le seguenti funzionalità UAC sono importanti:

Tutti i processi vengono avviati come utente standard di default un utente standard non può: file Change in cartelle Programmi file Variazione nelle cartelle di Windows o System32 modifica del registro di sistema in HKLM \ Software Modificare la data e l'ora macchine locali ... l'elenco continua ...

programmazione Modifica del registro di sistema per eseguire l'applicazione su Windows Delphi Sta rtup

Modificando in modo programmatico il registro di Windows, utilizzando l'oggetto TRegistry, è possibile "automagicamente" avviare i programmi ogni volta che viene avviato Windows. La procedura è possibile utilizzare per forza "auto-run-on-Windows-startup" per la vostra applicazione potrebbe essere simile:

procedure RunOnStartup(const sCmdLine: string; bRunOnce: boolean = false; Remove: Boolean = false) ; 
var 
    sKey: string; 
    Section: string; 
const 
    ApplicationTitle = ”Your Application TITLE”; 
begin 
    if (bRunOnce) then 
    sKey := 'Once' 
    else 
    sKey := ''; 

    Section := 'Software\Microsoft\Windows\CurrentVersion\Run' + sKey + #0; 

    with TRegIniFile.Create('') do 
    try 
     RootKey := HKEY_LOCAL_MACHINE; 
     if Remove then 
     DeleteKey(Section, ApplicationTitle) 
     else 
     WriteString(Section, ApplicationTitle, sCmdLine) ; 
    finally 
     Free; 
    end; 
end; 

Su Vista/7, se l'utente che esegue l'applicazione non dispone di diritti di amministratore i il codice sopra sarebbe fallito, a causa di UAC!

Faking UAC Diritti - Come richiedere livello di esecuzione

Anche se l'utente che esegue il codice di cui sopra non è un amministratore, è possibile, come sviluppatore braccio l'applicazione con un particolare tipo di risorsa incorporata: applicazione file manifest. Avere il file manifest assicurerà che l'UAC di Vista consenta l'esecuzione del codice.

Ecco i passaggi:

Creare file XML con seguente contenuto:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0] 
    <assemblyIdentity version="1.1.1.1" 
    processorArchitecture="X86" 
    name="YourApplicationExeName" 
    type="win32"/> 
    <description>elevate execution level</description> 
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2] 
    <security> 
    <requestedPrivileges> 
    <requestedExecutionLevel level="requireAdministrator" uiAccess="false"/> 
    </requestedPrivileges> 
    </security> 
    </trustInfo> 
</assembly> 

Nome questo file XML come YourApplicationName.manifest Creare un file di testo con seguente contenuto: 1 24 "YourApplicationName. manifest "

Nome di questo file di testo come YourApplicationName.RC utilizzando la riga di comando eseguire il seguente comando: brcc 32 YourApplicationName.RC -foYourApplicationName.REC

Questo creerà un nuovo file di risorse chiamato YourApplicationName.REC

Copia questo file nella YourApplicationName.REC al percorso delle risorse della vostra applicazione. Includere questo file di risorse nel DPR di voi applicazione, come come: {$R YourApplicationName.REC}

Infine costruire la vostra applicazione - si è ora pronti per ottenere diritti di amministratore in Windows Vista. Nota 1: nei passaggi precedenti, sostituire "YourApplicationExeName" con il nome effettivo dell'applicazione. Nota 2: i passaggi precedenti creano un file di risorse da memorizzare nel file EXE dell'applicazione. Maggiori informazioni sulle risorse nelle applicazioni Delphi.

saperne di più in http://delphi.about.com/od/delphitips2009/qt/delphi-vista-registry-run-on-startup.htm