Question

collègues anthropoïdes et nénuphars et roues à aubes!

Je développe une application de bureau Windows en C # / .NET / WPF, à l’aide de VS 2008. L’application est requise pour l’installation et l’exécution sur des machines Vista et XP. Je travaille sur un projet d'installation / Windows Installer pour installer l'application.

Mon application nécessite un accès en lecture / modification / écriture à un fichier de base de données SQLCE (.sdf) et à d'autres fichiers de type base de données liés à un contrôle tiers que j'utilise. Ces fichiers doivent être partagés par tous les utilisateurs / connexions sur le PC, aucun d'entre eux ne pouvant être requis pour être un administrateur. Cela signifie, bien sûr, que les fichiers ne peuvent pas aller dans le propre répertoire d'installation du programme (comme ce fut souvent le cas avant l'arrivée de Vista, oui, oui!).

Je m'attendais à ce que la solution soit simple. Vista et XP ont tous les deux des dossiers de données d'application partagées destinés à cet usage. ("\ ProgramData" dans Vista, "\ Documents et paramètres \ Tous les utilisateurs \ Données de l'application" dans XP.) Un appel .NET Environment.GetFolderPath (SpecialFolder.CommonApplicationData) existe pour rechercher les chemins d'accès à ces dossiers sur un PC donné. Oui, oui!

Toutefois, je ne vois pas comment spécifier le dossier de données d'application partagée en tant que cible dans le projet d'installation.

Le projet d'installation propose un " fichiers communs " Ce dossier, mais destiné aux composants de programme partagés (et non aux fichiers de données), est généralement situé sous "\ Program Files". et a les mêmes restrictions de sécurité que tout autre élément de " \ Program files " oui, oui!

Le projet d'installation propose une "donnée d'application de l'utilisateur". dossier, mais c'est un dossier par utilisateur, qui est exactement ce que j'essaie d'éviter, oui, oui!

Est-il possible d'ajouter des fichiers au dossier shared-app-data de manière robuste et inter-version Windows à partir d'un projet d'installation de VS 2008? Quelqu'un peut-il me dire comment?

Était-ce utile?

La solution

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

Pour placer des éléments dans un sous-répertoire du dossier Common Application Data d'un projet d'installation VS2008, procédez comme suit:

  1. Cliquez avec le bouton droit de la souris sur votre projet de configuration dans l'Explorateur de solutions, puis choisissez "Afficher - > Système de fichiers ".

  2. Cliquez avec le bouton droit de la souris sur " Système de fichiers sur la machine cible " et choisissez "Ajouter un dossier spécial - > Dossier personnalisé ".

  3. Renommez le dossier personnalisé en "Dossier de données d'application commun". (Ce n'est pas le nom qui sera utilisé pour le dossier résultant, c'est juste pour vous aider à le garder droit.)

  4. Modifiez la propriété DefaultLocation du dossier en "[CommonAppDataFolder] [Fabricant] \ [NomProduit]". Notez la similitude avec la propriété DefaultLocation du dossier de l'application, y compris l'utilisation inhabituelle d'une seule barre oblique inversée.

  5. Laissez-vous émerveiller un instant par le fait ridicule (et pourtant indéniable) qu’il existe une propriété de dossier nommée "Propriété".

  6. Modifiez la propriété Property du dossier en "COMMONAPPDATAFOLDER".

Fichiers de données placés dans la liste " Données communes à une application " Le dossier sera copié dans " \ ProgramData \ Manufacturer \ ProductName " (sous Vista) ou "\ Documents et paramètres \ Tous les utilisateurs \ Données de l'application \ Fabricant \ Nom du produit " (sous XP) lorsque le programme d'installation est exécuté.

Maintenant, il s'avère que sous Vista, les non-administrateurs ne disposent pas d'un accès en modification / écriture aux fichiers ici. Tous les utilisateurs ont donc la possibilité de lire les fichiers, mais ils l’obtiennent dans "\ Program Files". ainsi que. Je me demande donc quel est l’intérêt du dossier Common Application Data?

Autres conseils

Au lieu de cocher la case "Activer les paramètres de sécurité ClickOnce" " et en sélectionnant " Ceci est une application de confiance totale " ;, il est possible de modifier les autorisations de CommonAppDataDirectory de votre application avec une action personnalisée sous le " installation " 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 (vous pouvez également créer un programme / dll distinct et l'appeler à la place)
  2. Définissez la propriété Arguments sur "Installer"
  3. .
  4. Modified Main dans Program.cs pour vérifier cet argument:

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

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

Etant donné que le programme d'installation fonctionne avec des droits d'administrateur, le programme pourra modifier les autorisations. J'ai lu quelque part que l'option "Activer la sécurité ClickOnce". peut amener l'utilisateur à voir une invite non souhaitée au démarrage de l'application. Le faire comme décrit ci-dessus empêchera que cela se produise. J'espère que ça aidera quelqu'un. Je sais que j'aurais pu bénéficier de voir quelque chose comme ça il y a quelques jours!

Je l'ai résolu de cette façon. J'ai conservé le fichier de base de données (.sdf) dans le même dossier que celui où l'application est installée (Dossier de l'application). Dans l'onglet Sécurité de la fenêtre des propriétés du projet principal, j'ai coché la case "Activer les paramètres de sécurité ClickOnce". et sélectionné "Ceci est une application de confiance totale", reconstruit et exécute la configuration. Après cela, pas de problème de sécurité

J'utilise Visual Studio 2008 et Windows Vista

Cela a fonctionné pour moi avec VS2005 mais je devais changer le nom de l'emplacement par défaut, j'ai ajouté un '\' pour séparer le CommonAppDataFolder.

[CommonAppDataFolder] [Fabricant] [Nom du produit]

Je ne sais pas s’il s’agissait d’une faute de frappe, mais Lyman a fait référence à l’usage étrange d’une simple barre oblique inversée, mais cela ne semble pas correct.

J'ai eu le même problème. Le projet de configuration donne à l'utilisateur la possibilité d'installer l'application "pour l'utilisateur actuel uniquement". ou "pour tous les utilisateurs :. Par conséquent, le fichier de base de données se retrouverait dans le dossier de données de l'application de l'utilisateur actuel ou de tous les utilisateurs. Le programme d'installation devrait écrire ces informations quelque part pour que l'application puisse les récupérer ultérieurement, lorsqu'il s'agira d'accéder à la base de données. Sinon, comment pourrait-il savoir dans quel dossier de données d’application regarder?

Pour éviter ce problème, je souhaite simplement installer la base de données dans le dossier Tous les utilisateurs / Données d'application, que l'application ait été installée pour un utilisateur ou pour tous les utilisateurs. Bien entendu, je me rends compte que deux utilisateurs ne pourraient pas installer l'application sur le même ordinateur sans écraser leurs données. C’est une possibilité tellement lointaine que je ne veux pas l’envisager.

La première pièce du puzzle que j'ai 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 nous assurer que la source de données contient l’espace réservé DataDirectory. Cet article provient de ici . Dans le concepteur DataSet, recherchez les propriétés du DataSet, ouvrez le nœud Connexion et modifiez la propriété ConnectionString pour qu'elle se présente comme suit:

Data Source=|DataDirectory|\YourDatabase.sdf

Ensuite, j'ai suivi les instructions de Lyman Enders Knowles présentées ci-dessus pour savoir comment ajouter le dossier de données d'application communes au projet d'installation et placer le fichier de base de données dans ce dossier.

J'ai ensuite suivi la suggestion d'Ove présentée ci-dessus, c'est-à-dire que j'ai coché la case "Activer les paramètres de sécurité ClickOnce". et sélectionné "Ceci est une application de confiance totale.

Après cela, l'application a été correctement déployée sous Vista et le fichier de base de données était accessible à la fois en lecture et en écriture.

J'aime le concept ci-dessous, des éléments pris ci-dessus

  1. Cliquez avec le bouton droit de la souris sur votre projet de configuration dans l'Explorateur de solutions, puis choisissez "Afficher - > Système de fichiers ".

  2. Cliquez avec le bouton droit de la souris sur " Système de fichiers sur la machine cible " et choisissez "Ajouter un dossier spécial - > Dossier personnalisé ".

  3. Renommez le dossier personnalisé en "Dossier de données d'application commun". (Ce n'est pas le nom qui sera utilisé pour le dossier résultant, c'est juste pour vous aider à le garder droit.)

  4. Modifiez la propriété DefaultLocation du dossier en "[CommonAppDataFolder] [Fabricant] [NomProduit]". Notez la similitude avec la propriété DefaultLocation du dossier de l'application, y compris l'utilisation inhabituelle d'une seule barre oblique inversée.

  5. Laissez-vous émerveiller un instant par le fait ridicule (et pourtant indéniable) qu’il existe une propriété de dossier nommée "Propriété". Bébés plein de rage, qui vient avec cette merde?

  6. Modifiez la propriété Property du dossier en "COMMONAPPDATAFOLDER".

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

Je ne sais pas si cela vous aidera ou non.

Mais si vous ajoutez une section privée au fichier de configuration de votre application

                   

Vous pouvez spécifier des dossiers supplémentaires à vérifier dans votre application.

Si ce que vous dites, c'est que vous voulez pouvoir installer dans d’autres dossiers de la machine, c’est un problème. Essentiellement, toute la raison pour laquelle MS a restreint ce genre de choses est de garder le code malveillant hors des machines où l'utilisateur n'est pas au courant de ce qu'ils installent.

Donc, cela ne fonctionnera pas si vous avez besoin d'un autre répertoire. Ce correctif vous permet de spécifier où dans votre application pour rechercher des fichiers ......

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top