Frage

Mitanthropoide und Seerosenblätter und Schaufelräder!

Ich entwickle eine Windows-Desktop-App in C#/.NET/WPF unter Verwendung von VS 2008.Die App ist für die Installation und Ausführung auf Vista- und XP-Rechnern erforderlich.Ich arbeite an einem Setup/Windows Installer-Projekt, um die App zu installieren.

Meine App erfordert Lese-/Änderungs-/Schreibzugriff auf eine SQLCE-Datenbankdatei (.sdf) und einige andere datenbankartige Dateien, die sich auf ein von mir verwendetes Steuerelement eines Drittanbieters beziehen.Diese Dateien sollten von allen Benutzern/Anmeldungen auf dem PC gemeinsam genutzt werden, von denen keiner als Administrator erforderlich sein kann.Das bedeutet natürlich, dass die Dateien nicht im eigenen Installationsverzeichnis des Programms abgelegt werden können (was vor der Einführung von Vista oft der Fall war, ja, ja!).

Ich hatte erwartet, dass die Lösung einfach wäre. Vista und XP verfügen beide über freigegebene Anwendungsdatenordner, die für diesen Zweck vorgesehen sind. („\ProgramData“ in Vista, „\Documents and Settings\All Users\Application Data“ in XP.) Der .NET Environment.GetFolderPath(SpecialFolder.CommonApplicationData)-Aufruf existiert, um die Pfade zu diesen Ordnern auf einem bestimmten PC zu finden, ja , Ja!

Ich kann jedoch nicht herausfinden, wie ich den Ordner „shared-application-data“ als Ziel im Setup-Projekt angeben kann.

Das Setup-Projekt bietet einen Ordner „Gemeinsame Dateien“, der jedoch für gemeinsam genutzte Programmkomponenten (keine Datendateien) gedacht ist, sich normalerweise unter „\Programme“ befindet und die gleichen Sicherheitsbeschränkungen für alle anderen Ordner in „\Programme“ hat. Ja ja!

Das Setup-Projekt bietet einen Ordner „Anwendungsdaten des Benutzers“, aber das ist ein Ordner pro Benutzer, und genau das versuche ich zu vermeiden, ja, ja!

Ist es möglich, Dateien aus einem VS 2008-Setup-Projekt auf robuste, Windows-versionsübergreifende Weise zum Ordner „shared-app-data“ hinzuzufügen?Kann mir jemand sagen, wie?

War es hilfreich?

Lösung

Ich habe die Antwort auf meine Frage durch andere Quellen gelernt, ja, ja! Leider hat es nicht mein Problem beheben! Was ist das mir machen - ein fixer-upper? Ja, ja!

Um Sachen in einem Unterverzeichnis des gemeinsamen Ordner Anwendungsdaten aus einem VS2008-Setup-Projekt zu setzen, hier ist was Sie tun:

  1. Rechtsklick auf Ihr Setup-Projekt im Solution Explorer und wählen. "Ansicht -> Dateisystem"

  2. Rechtsklick auf "Dateisystem auf Zielcomputer" und wählen Sie "Hinzufügen spezieller Ordner -> Custom Folder".

  3. Benennen Sie den benutzerdefinierten Ordner "Common Application Data Ordner." (Dies ist nicht der Name, der für die resultierenden Ordner verwendet werden, es ist nur Sie ihm, um zu helfen gerade.)

  4. Ändern Sie die Default Eigenschaft Ordner "[CommonAppDataFolder] [Hersteller] \ [Productname]". Man beachte die Ähnlichkeit mit der Default Eigenschaft des Application-Ordners, einschließlich der ungeraden Verwendung eines einzigen Backslash.

  5. Marvel einen Moment lang an der lächerlichen (noch nicht zu leugnen) Tatsache, dass es eine Ordner-Eigenschaft namens „Eigentum.“

  6. Ändern Sie die Eigenschaft Ordner-Eigenschaft auf "CommonAppDataFolder".

Datendateien in der "Common Application Data" Ordner abgelegt werden kopiert nach "\ Programdata \ Hersteller \ Product" (unter Vista) oder "\ Dokumente und Einstellungen \ All Users \ Anwendungsdaten \ Hersteller \ Product" (auf XP ), wenn das Installationsprogramm ausgeführt wird.

Jetzt stellt sich heraus, dass unter Vista nicht-Administratoren erhalte / Schreib nicht ändern Zugriff auf die Dateien hier. So erhalten alle Benutzer die Dateien zu lesen, aber sie bekommen, dass in „\ Program Files“ als auch. Also, was, frage ich mich, ist der Punkt, der Common Application Data-Ordner?

Andere Tipps

Statt „Enable Clickonce Security Settings“ zu prüfen und die Auswahl von „Dies ist eine voll Vertrauen Anwendung“ ist es möglich, die Berechtigungen der App CommonAppDataDirectory mit einer benutzerdefinierten Aktion unter dem „install“ Abschnitt eines Setup-Projekt zu ändern. Hier ist, was ich getan habe:

  1. eine benutzerdefinierte Aktion Hinzugefügt wurde die App aufrufen installiert werden (abwechselnd ein separates Programm / dll erstellen könnte und rufen, dass statt)
  2. Stellen Sie die Argumente Eigenschaft auf "Install"
  3. Modifizierte Haupt in Program.cs für die arg zu überprüfen:

    static void Main(string[] args) { if (args != null && args.Length > 0 && args[0] == "Install") { ApplicationData.SetPermissions(); } else { // Execute app "normally" } }
  4. Schrieb die SetPermissions funktionieren programmatisch Berechtigungen ändern

    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); } }

Da das Installationsprogramm mit Administratorrechten ausgeführt wird, wird das Programm in der Lage sein, die Berechtigungen zu ändern. Ich habe irgendwo gelesen, dass die „Enable Clickonce-Sicherheit“ den Benutzer verursachen kann eine unerwünschte Aufforderung an app Start zu sehen. Tun es, wie oben beschrieben wird verhindern, dass dies geschieht. Ich hoffe, das jemand hilft. Ich weiß, ich habe vor nicht sehen so etwas wie dies einige Tage profitierten konnte!

Ich habe es so gelöst.Ich habe die Datenbankdatei (.sdf) im selben Ordner gespeichert, in dem die Anwendung installiert ist (Anwendungsordner).Auf der Registerkarte „Sicherheit“ im Eigenschaftenfenster des Hauptprojekts habe ich „ClickOnce-Sicherheitseinstellungen aktivieren“ aktiviert und „Dies ist eine voll vertrauenswürdige Anwendung“ ausgewählt, das Setup neu erstellt und ausgeführt.Danach kein Sicherheitsproblem mehr

Ich verwende Visual Studio 2008 und Windows Vista

Das ist für mich gearbeitet VS2005 verwenden, aber ich hatte das Default zu ändern, habe ich ein ‚\‘ die CommonAppDataFolder zu trennen.

[CommonAppDataFolder] [Hersteller] [Productname]

Sie wissen nicht, ob dies ein Tippfehler war aber Lyman hat die ungeraden Verwendung eines einzigen Backslash bezieht sie aber nicht richtig zu sein scheint.

Ich hatte das gleiche Problem. Das Setup-Projekt gibt dem Benutzer die Möglichkeit, die App zu installieren „für den aktuellen Benutzer nur“ oder „für alle Benutzer :. Folglich würde die Datenbankdatei entweder in der aktuellen Benutzers oder die Alle Benutzer Anwendungsdatenordner landen. Das Setup würde haben diese Informationen irgendwo zu schreiben, so dass die Anwendung später abgerufen werden kann, wenn es auf die Datenbank zugreifen kommt. Wie wäre es sonst wissen, welche Anwendungsdatenordner in aussehen?

Um dieses Problem zu vermeiden, ich möchte nur die Datenbank im All Users / Anwendungsdaten Ordner installieren, unabhängig davon, ob die Anwendung für einen Benutzer oder für alle Benutzer installiert wurde. Ich weiß natürlich, dass zwei Benutzer die Anwendung nicht auf demselben Computer installieren könnte jeder des anderen Daten ohne zu überschreiben. Dies ist so eine entfernte Möglichkeit aber, dass ich nicht will, es zu betrachten.

Der erste Teil des Puzzles Ich habe hier :

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));
}

Jetzt müssen wir sicherstellen, dass die Datenquelle den Datadirectory-Platzhalter enthält. Dieses Stück kam von hier . In den DataSet-Designern finden Sie die Eigenschaften des DataSet, den Verbindungsknoten öffnen und die Connectionstring-Eigenschaft bearbeiten, um wie folgt aussehen:

Data Source=|DataDirectory|\YourDatabase.sdf

Dann folgte ich Lyman Enders Knowles' Anweisungen von oben, wie Sie den Common Application Data Folder zum Setup-Projekt hinzuzufügen und legte die Datenbank-Datei in diesem Ordner.

Ich folgte dann Vorschlag des Ove von oben, das heißt ich überprüfte die „Enable Clickonce Security Settings“ und ausgewählte „Dies ist eine volles Vertrauen Anwendung.

Danach setzte die Anwendung fein auf Vista und die Datenbankdatei war zugänglich für beide lesen und schreiben.

i unten Konzept mag, genommen ein paar Sachen von oben

  1. Rechtsklick auf Ihr Setup-Projekt im Solution Explorer und wählen. "Ansicht -> Dateisystem"

  2. Rechtsklick auf "Dateisystem auf Zielcomputer" und wählen Sie "Hinzufügen spezieller Ordner -> Custom Folder".

  3. Benennen Sie den benutzerdefinierten Ordner "Common Application Data Ordner." (Dies ist nicht der Name, der für die resultierenden Ordner verwendet werden, es ist nur Sie ihm, um zu helfen gerade.)

  4. der Default Eigenschaft des Ordners ändern zu "[CommonAppDataFolder] [Hersteller] [Productname]". Man beachte die Ähnlichkeit mit der Default Eigenschaft des Application-Ordners, einschließlich der ungeraden Verwendung eines einzigen Backslash.

  5. Marvel einen Moment lang an der lächerlichen (noch nicht zu leugnen) Tatsache, dass es eine Ordner-Eigenschaft namens „Eigentum.“ Babys voller Tollwut, die mit dieser Scheiße kommt?

  6. Ändern Sie die Eigenschaft Ordner-Eigenschaft auf "CommonAppDataFolder".

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

Ich bin mir nicht sicher, ob dies in Ihrem Fall helfen wird oder nicht.

Wenn Sie aber einen eigenen Abschnitt zu Ihrem App-Konfigurationsdatei hinzufügen

                   

Sie können zusätzliche Ordner angeben, in Ihrer Anwendung zu überprüfen.

Wenn das, was Sie sagen, ist, dass Sie in der Lage sein wollen, installieren in andere Ordner auf der Maschine, das ist dann ein Problem. Im Wesentlichen der ganze Grund, dass MS dieses Material beschränkt hat Schadcode aus Maschinen ist zu halten, wo der Benutzer nicht bewusst ist, von dem, was sie installieren.

Also, das wird nicht funktionieren, wenn Sie ein anderes Verzeichnis benötigen. Was dieses Update tut, ist Sie festlegen können, wo in Ihrer App für Dateien ......

suchen
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top