2009-08-31 4 views
7

Ho scoperto che un'applicazione che ho scritto non funziona correttamente in Windows Vista/7 se UAC è abilitato a qualsiasi livello, perché scrive i file nella directory di installazione del programma, il valore predefinito è "C: \ Programmi \ MyProgram". Se UAC è disabilitato (o su qualsiasi altra versione di Windows) funziona correttamente - Ho letto che l'UAC nega alle applicazioni l'accesso in scrittura alla directory Programmi per impostazione predefinita.Modo corretto di progettare attorno ai limiti di UAC di Windows?

La mia domanda è, bene, come dovrei scrivere la mia applicazione in modo che possa essere utilizzata senza alcun "diritto" necessario a tutti. Non voglio che gli utenti debbano eseguirlo con privilegi elevati o come amministratore. Voglio solo che funzioni. Ci sono certe directory in cui ogni app ha accesso in scrittura sotto UAC dove potrebbe essere meglio scrivere i miei file? Sono per lo più file di configurazione che vengono creati/distrutti/aggiornati in modo dinamico.

Grazie per il vostro aiuto!

+3

Non chiamerei restrizioni UAC "limitazioni" sull'applicazione. Tecnicamente lo sono, ma più o meno semplicemente ti guida a non fare qualcosa che non dovresti mai fare in primo luogo –

+0

"non dovrebbe mai fare" - perché no? – JimDaniel

+3

Perché mai vorresti mai scrivere i dati di configurazione su Program Files? Questa è la directory di installazione. Ecco dove vanno eseguiti i file eseguibili e le librerie. I dati non vanno lì ... –

risposta

12

I dati specifici dell'applicazione per utente devono essere scritti nella cartella AppData.

È necessario utilizzare SHGetKnownFolderPath con FOLDERID_LocalAppData.

Nel codice gestito, è necessario utilizzare System.Environment.GetFolderPath con System.Environment.SpecialFolder.LocalApplicationData.

+2

Se si utilizzano le capacità di configurazione .NET (spazio dei nomi 'System.Configuration', questi sono i file .settings in un progetto C#), i dati saranno collocati nella posizione corretta e si avranno modi molto eleganti per accedere e aggiornare esso. –

4

Sì, ci sono posizioni specifiche. Considerare this msdn article come primo riferimento. Esso menziona le posizioni:

  • CSIDL_APPDATA
  • CSIDL_LOCAL_APPDATA
  • CSIDL_COMMON_APPDATA

Nel codice nativo, il metodo SHGetKnownFolderPath dovrebbe rivelarsi utile.

Nel codice gestito è possibile utilizzare Environment.GetFolderPath(). Se ci si trova in una specifica infrastruttura applicativa, come i moduli di Windows, è possibile ottenere un accesso ancora più semplice tramite proprietà dirette, come ad esempio Application.LocalUserAppDataPath (che è la mia tecnica preferita personale). Il percorso del framework includerà qualificatori specifici delle app sul percorso che restituisce per distinguere tra (ad esempio) versioni diverse della tua app.