31 votes

Projet d'installation VS2008: Fichiers de données d'application partagés (par tous les utilisateurs)?

fellow anthropoïdes et des nénuphars et des aérateurs rotatifs!

Je suis l'élaboration d'un bureau Windows application en C#/.NET/WPF, à l'aide de VS 2008. L'application est nécessaire pour installer et exécuter sur Vista et XP machines. Je suis en train de travailler sur un programme de Configuration/Windows Installer l'installation de l'application.

Mon application a besoin de lire/modifier/accès en écriture à un SQLCE fichier de base de données (.sdf) et de certaines autres bases de données de type fichiers liés à une tierce partie de contrôle que j'utilise. Ces fichiers doivent être partagés entre tous les utilisateurs/log-ins sur le PC, rien de ce qui peut être nécessaire pour être un Administrateur. Cela signifie, bien sûr, que les fichiers ne peuvent pas aller dans le programme de son propre répertoire d'installation (que de telles choses n'ont souvent avant l'arrivée de Vista, oui, oui!).

J'avais prévu de la solution d'être simple. Vista et XP les deux ont en commun-application-données des dossiers prévus à cet effet. ("\ProgramData" dans Vista, "\Documents and Settings\All Users\Application Data" dans XP). L' .NET de l'Environnement.GetFolderPath(SpecialFolder.CommonApplicationData) appel n'existe pas à trouver les chemins d'accès à ces dossiers sur un PC, oui, oui!

Mais je ne peux pas comprendre comment spécifier la commune-demande-dossier de données comme une cible dans le projet d'Installation.

Le projet d'Installation propose un "Fichiers Communs" le dossier, mais c'est prévu pour partagé les composantes du programme (pas de fichiers de données), est généralement situé sous "\Program Files", et a les mêmes restrictions de sécurité d'autre chose dans "\Program files" n', oui, oui!

Le projet d'Installation propose une "la Demande de l'Utilisateur des Données de ce dossier, mais c'est un par-dossier de l'utilisateur, ce qui est exactement ce que j'essaie d'éviter, oui, oui!

Est-il possible d'ajouter des fichiers à la commune-app-dossier de données dans un solide, la croix-Windows-version d'un VS 2008 projet d'installation? Quelqu'un peut-il me dire comment?

20voto

J'ai appris la réponse à ma question par d'autres sources, oui, oui! Malheureusement, il n'a pas de résoudre mon problème! Qu'est-ce que faire de moi, un fixateur-dessus? Oui, oui!

Pour mettre des choses dans un sous-répertoire de la Commune dossier de Données d'Application à partir d'un VS2008 projet d'Installation, voici ce que vous devez faire:

  1. Cliquez-droit sur votre projet d'installation dans l'Explorateur de solutions et choisissez "Affichage -> Système de Fichiers".

  2. Droit-cliquez sur "système de Fichiers sur l'ordinateur cible" et choisissez "Ajouter un Dossier Spécial -> Dossier Personnalisé".

  3. Renommer le dossier personnalisé "Common Dossier de Données d'Application." (Ce n'est pas le nom qui sera utilisé pour la suite du dossier, c'est juste pour vous aider à le maintenir droit.)

  4. Changer le dossier de la propriété DefaultLocation "[CommonAppDataFolder][Constructeur]\[ProductName]". Notez la similitude avec la propriété DefaultLocation du Dossier de l'Application, y compris l'étrange utilisation d'une seule barre oblique inverse.

  5. Marvel pour un instant à la ridicule (encore indéniable) fait qu'il y est une propriété de dossier nommé "Propriété". Bébés plein de rage, qui arrive avec cette merde?

  6. Changer le dossier de la Propriété à la propriété "COMMONAPPDATAFOLDER".

Fichiers de données placés dans le "Commun des Données d'Application" dossier sera copié dans "\ProgramData\Fabricant\ProductName" (sur Vista) ou "\Documents and Settings\All Users\Application Data\Fabricant\ProductName" (sur XP) lorsque le programme d'installation est exécuté.

Maintenant, il s'avère que sous Vista, les non-Administrateurs n'obtenez pas modifier/accès en écriture aux fichiers ici. Donc, tous les utilisateurs peuvent lire les fichiers, mais ils arrivent que dans "\Program Files" ainsi. Alors quoi, je me demande, est le point de la Commune dossier de Données d'Application?

Ce voici un projet de recherche. Des moyens de recherche de "regarder à nouveau," n'est-ce pas? Peut-être que c'était quelque chose que j'ai trouvé, une fois et il s'est enfui à nouveau. Oui, oui!

10voto

ejwipp Points 158

Au lieu de cocher "Activer les Paramètres de Sécurité ClickOnce" et en sélectionnant "C'est une application de confiance", il est possible de modifier les autorisations de votre application CommonAppDataDirectory avec une Action Personnalisée dans le cadre du "installer" section d'un projet d'installation. Voici ce que j'ai fait:

  1. Ajout d'une action personnalisée pour appeler l'application en cours d'installation (alternativement, vous pouvez créer un programme distinct/dll et l'appeler à la place)
  2. Définissez la propriété Arguments pour "Installer"
  3. Modifié Principal dans le Programme.cs pour vérifier que arg:

  4. A écrit la SetPermissions fonction de programmation pour modifier les autorisations
    
    static void Main(string[] args)
    {
       if (args != null && args.Length > 0 && args[0] == "Install")
       {
          ApplicationData.SetPermissions();
       }
       else
       {
          // Execute app "normally"
        }
    }
    

Depuis le programme d'installation s'exécute avec les droits admin, le programme sera en mesure de modifier les autorisations. J'ai lu quelque part que la "Activer ClickOnce de Sécurité" peut causer à l'utilisateur de voir indésirable d'une invite à l'application de démarrage. Comme décrit ci-dessus permettra d'éviter que cela se produise. J'espère que cela aide quelqu'un. Je sais que je pourrais avoir bénéficié de voir quelque chose comme ceci il y a quelques jours!

1voto

cdonner Points 17403

J'ai eu le même problème. Le projet d'installation donne à l'utilisateur la possibilité d'installer l'application "pour l'utilisateur actuel seulement" ou "pour tous les utilisateurs:. Par conséquent, le fichier de base de données de l'utilisateur actuel ou Tous les Utilisateurs dossier de données d'application. L'installation aurait à écrire cette information quelque part afin que l'application peut récupérer plus tard, lorsqu'il s'agit d'accéder à la base de données. Sinon, comment serait-il savoir quel dossier de données d'application pour regarder dans?

Pour éviter ce problème, je veux juste installer la base de données de Tous les Utilisateurs/dossier de Données d'Application, peu importe si la demande a été installé pour un seul utilisateur, ou pour tous les utilisateurs. Je me rends compte, bien sûr, que les deux utilisateurs ne pouvaient pas installer l'application sur le même ordinateur sans s'écraser les uns des autres données. C'est une hypothèse peu probable, cependant, que je ne veux pas l'envisager.

La première pièce du puzzle que je suis ici:

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

Maintenant, nous devons faire en sorte que la source de données contient les DataDirectory espace réservé. Ce morceau est venue à partir d' ici. Dans le concepteur de DataSet, trouver le jeu de données de propriétés, ouvrez le nœud de Connexion et modifier la propriété ConnectionString présente comme suit:

Data Source=|DataDirectory|\YourDatabase.sdf

Ensuite, j'ai suivi Lyman Enders Knowles' instructions venues d'en haut pour savoir comment ajouter de la Commune Dossier de Données d'Application du projet d'installation et placé le fichier de base de données dans ce dossier.

J'ai ensuite suivi Ove la suggestion d'en haut, c'est à dire j'ai coché la case "Activer les Paramètres de Sécurité ClickOnce" et choisis "C'est une application de confiance.

Après cela, l'application déployée à l'amende sur Vista, et le fichier de base de données était accessible pour les lectures et écritures.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X