Domanda

compagni antropoidi e ninfee e ruote a pale!

Sto sviluppando un'app desktop Windows in C#/.NET/WPF, utilizzando VS 2008.L'app è necessaria per l'installazione e l'esecuzione su macchine Vista e XP.Sto lavorando a un progetto di installazione/Windows Installer per installare l'app.

La mia app richiede l'accesso in lettura/modifica/scrittura a un file di database SQLCE (.sdf) e ad altri file di tipo database correlati a un controllo di terze parti che sto utilizzando.Questi file devono essere condivisi tra tutti gli utenti/login sul PC, a nessuno dei quali può essere richiesto di essere un amministratore.Ciò significa, ovviamente, che i file non possono andare nella directory di installazione del programma (come spesso accadeva prima dell'arrivo di Vista, sì, sì!).

Mi aspettavo che la soluzione fosse semplice. Vista e XP dispongono entrambi di cartelle di dati delle applicazioni condivise destinate a questo scopo. ("\ProgramData" in Vista, "\Documents and Settings\All Users\Application Data" in XP.) La chiamata .NET Environment.GetFolderPath(SpecialFolder.CommonApplicationData) esiste per trovare i percorsi di queste cartelle su un determinato PC, sì , SÌ!

Ma non riesco a capire come specificare la cartella dei dati dell'applicazione condivisa come destinazione nel progetto di installazione.

Il progetto di installazione offre una cartella "File comuni", ma è destinata ai componenti di programma condivisi (non ai file di dati), si trova solitamente in "\Programmi" e presenta le stesse restrizioni di sicurezza di qualsiasi altra cosa in "\Programmi", si si!

Il progetto Setup offre una cartella "Dati applicazioni utente", ma è una cartella per utente, che è esattamente ciò che sto cercando di evitare, sì, sì!

È possibile aggiungere file alla cartella shared-app-data in modo affidabile e multi-versione Windows da un progetto di installazione VS 2008?Qualcuno può dirmi come?

È stato utile?

Soluzione

Ho imparato la risposta alla mia domanda attraverso altre fonti, sì, sì!Purtroppo non ha risolto il mio problema!Cosa mi rende... un riparatore di tomaie?Si si!

Per inserire elementi in una sottodirectory della cartella Common Application Data da un progetto di installazione VS2008, ecco cosa fare:

  1. Fare clic con il pulsante destro del mouse sul progetto di installazione in Esplora soluzioni e selezionare "Visualizza -> File system".

  2. Fare clic con il tasto destro su "File system sul computer di destinazione" e selezionare "Aggiungi cartella speciale -> Cartella personalizzata".

  3. Rinomina la cartella personalizzata in "Cartella di dati delle applicazioni comuni". (Questo non è il nome che verrà utilizzato per la cartella risultante, è solo per aiutarti a mantenerlo dritto.)

  4. Modificare la proprietà DefaultLocation della cartella in "[CommonAppDataFolder][Produttore]\[NomeProdotto]".Notare la somiglianza con la proprietà DefaultLocation della cartella dell'applicazione, incluso l'uso strano di una singola barra rovesciata.

  5. Lasciati stupire per un momento dal fatto ridicolo (ma innegabile) che esista una proprietà della cartella denominata "Proprietà".

  6. Modificare la proprietà Proprietà della cartella in "COMMONAPPDATAFOLDER".

I file di dati inseriti nella cartella "Dati applicazioni comuni" verranno copiati in "\ProgramData\Manufacturer\ProductName" (su Vista) o "\Documents and Settings\All Users\Application Data\Manufacturer\ProductName" (su XP) quando viene eseguito il programma di installazione.

Ora risulta che sotto Vista, i non amministratori non hanno accesso in modifica/scrittura ai file qui.Quindi tutti gli utenti possono leggere i file, ma li ottengono anche in "\Programmi".Allora, mi chiedo, qual è lo scopo della cartella Common Application Data?

Altri suggerimenti

Invece di selezionare "Abilita impostazioni di sicurezza ClickOnce" e selezionare "Questa è un'applicazione completamente attendibile", è possibile modificare le autorizzazioni di CommonAppDataDirectory della tua app con un'azione personalizzata nella sezione "Installa" di un progetto di installazione.Ecco cosa ho fatto:

  1. Aggiunta un'azione personalizzata per chiamare l'app in fase di installazione (in alternativa è possibile creare un programma/dll separato e chiamarlo invece)
  2. Imposta la proprietà Argomenti su "Installa"
  3. Modificato Main in Program.cs per verificare quell'argomento:

    static void Main(string[] args) { if (args != null && args.Length > 0 && args[0] == "Install") { ApplicationData.SetPermissions(); } else { // Execute app "normally" } }
  4. Ha scritto la funzione SetPermissions per modificare le autorizzazioni a livello di codice

    public static void SetPermissions() { String path = GetPath(); try { // Create security idenifier for all users (WorldSid) SecurityIdentifier sid = new SecurityIdentifier(WellKnownSidType.WorldSid, null); DirectoryInfo di = new DirectoryInfo(path); DirectorySecurity ds = di.GetAccessControl(); // add a new file access rule w/ write/modify for all users to the directory security object
    ds.AddAccessRule(new FileSystemAccessRule(sid, FileSystemRights.Write | FileSystemRights.Modify, InheritanceFlags.ObjectInherit | InheritanceFlags.ContainerInherit, // all sub-dirs to inherit PropagationFlags.None, AccessControlType.Allow)); // Turn write and modify on // Apply the directory security to the directory di.SetAccessControl(ds); } catch (Exception ex) { MessageBox.Show(ex.Message); } }

Poiché il programma di installazione viene eseguito con diritti di amministratore, il programma sarà in grado di modificare le autorizzazioni.Ho letto da qualche parte che "Abilita sicurezza ClickOnce" può far sì che l'utente visualizzi un messaggio indesiderato all'avvio dell'app.Farlo come descritto sopra eviterà che ciò accada.Spero che questo aiuti qualcuno.So che avrei potuto trarre beneficio dal vedere qualcosa di simile qualche giorno fa!

L'ho risolto in questo modo.Ho mantenuto il file del database (.sdf) nella stessa cartella in cui è installata l'applicazione (Cartella dell'applicazione).Nella scheda Sicurezza nella finestra delle proprietà del progetto principale, ho selezionato "Abilita impostazioni di sicurezza ClickOnce" e selezionato "Questa è un'applicazione completamente attendibile", ho ricostruito ed eseguito la configurazione.Dopodiché nessun problema di sicurezza

Utilizzo Visual Studio 2008 e Windows Vista

Questo ha funzionato per me utilizzando VS2005 ma ho dovuto modificare DefaultLocation, ho aggiunto un "\" per separare CommonAppDataFolder.

[CommonAppDataFolder] [Produttore] [Nome prodotto]

Non so se si sia trattato di un errore di battitura, ma Lyman ha fatto riferimento all'uso strano di una singola barra rovesciata, ma questo non sembra corretto.

Ho avuto lo stesso problema.Il progetto di installazione offre all'utente la possibilità di installare l'app "solo per l'utente corrente" o "per tutti gli utenti:.Di conseguenza, il file del database finirebbe nella cartella dei dati dell'applicazione dell'utente corrente o di Tutti gli utenti.Il setup dovrebbe scrivere queste informazioni da qualche parte in modo che l'applicazione possa successivamente recuperarle, quando si tratta di accedere al database.In quale altro modo potrebbe sapere in quale cartella dei dati dell'applicazione cercare?

Per evitare questo problema, voglio semplicemente installare il database nella cartella Tutti gli utenti/Dati applicazioni, indipendentemente dal fatto che l'applicazione sia stata installata per un utente o per tutti gli utenti.Mi rendo conto, ovviamente, che due utenti non potrebbero installare l'applicazione sullo stesso computer senza sovrascrivere i rispettivi dati.Questa è una possibilità così remota, però, che non voglio prenderla in considerazione.

Il primo pezzo del puzzle che ho ricevuto Qui:

Form_Load(object sender, EventArgs e)
{
  // Set the db directory to the common app data folder
  AppDomain.CurrentDomain.SetData("DataDirectory", 
            System.Environment.GetFolderPath
           (System.Environment.SpecialFolder.CommonApplicationData));
}

Ora dobbiamo assicurarci che l'origine dati contenga il segnaposto DataDirectory.Questo pezzo proviene da Qui.Nella finestra di progettazione DataSet, trova le proprietà del DataSet, apri il nodo Connessione e modifica la proprietà ConnectionString come segue:

Data Source=|DataDirectory|\YourDatabase.sdf

Quindi ho seguito le istruzioni di Lyman Enders Knowles riportate sopra su come aggiungere la cartella dei dati dell'applicazione comune al progetto di installazione e ho inserito il file del database in quella cartella.

Ho quindi seguito il suggerimento di Ove dall'alto, cioèHo selezionato "Abilita impostazioni di sicurezza ClickOnce" e selezionato "Questa è un'applicazione completamente attendibile.

Successivamente, l'applicazione è stata distribuita correttamente su Vista e il file del database era accessibile sia in lettura che in scrittura.

mi piace il concetto di seguito, alcune cose prese dall'alto

  1. Fare clic con il pulsante destro del mouse sul progetto di installazione in Esplora soluzioni e selezionare "Visualizza -> File system".

  2. Fare clic con il tasto destro su "File system sul computer di destinazione" e selezionare "Aggiungi cartella speciale -> Cartella personalizzata".

  3. Rinomina la cartella personalizzata in "Cartella di dati delle applicazioni comuni". (Questo non è il nome che verrà utilizzato per la cartella risultante, è solo per aiutarti a mantenerlo dritto.)

  4. Modificare la proprietà DefaultLocation della cartella in "[CommonAppDataFolder][Produttore][NomeProdotto]".Notare la somiglianza con la proprietà DefaultLocation della cartella dell'applicazione, incluso l'uso strano di una singola barra rovesciata.

  5. Meraviglia per un momento al ridicolo (ma innegabile) fatto che esista una proprietà della cartella chiamata "Proprietà". Bambini pieni di rabbia, chi esce questa merda?

  6. Modificare la proprietà Proprietà della cartella in "COMMONAPPDATAFOLDER".

string userAppData = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
string commonAppData = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData); 

Non sono sicuro che questo possa essere d'aiuto nel tuo caso o meno.

Ma se aggiungi una sezione privata al file di configurazione della tua app

Puoi specificare cartelle aggiuntive da archiviare nella tua app.

Se quello che stai dicendo è che vuoi essere in grado di installare in altre cartelle sulla macchina, allora questo è un problema.Essenzialmente l'intero motivo per cui MS ha limitato questa roba è quello di mantenere il codice dannoso dalle macchine in cui l'utente non è a conoscenza di ciò che sta installando.

Quindi, questo non funzionerà se hai bisogno di un'altra directory.Ciò che fa questa correzione è consentire di specificare dove all'interno dell'app per cercare file ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top