5 votes

Comment sauvegarder un paramètre pour tous les utilisateurs sous Vista ?

J'ai besoin d'enregistrer un paramètre qui est ensuite disponible pour tous les utilisateurs de l'application sur la machine donnée. Cela doit fonctionner sur Vista/Win 7, et l'application ne sera pas lancée en tant qu'administrateur.

  • Impossible d'enregistrer dans le répertoire du programme en tant que le dossier Program Files est protégé sur Vista
  • Impossible d'enregistrer dans HKEY_LOCAL_MACHINE car car il est également protégé
  • Impossible d'enregistrer sur un serveur ou un service web

Où puis-je enregistrer des données ? Même si les droits de l'application ont été élevés d'une manière ou d'une autre au cours de l'exécution, je crains que le registre soit désormais virtualisé dans Vista - et que je me retrouve donc avec un HKEY_LOCAL_MACHINE spécial qui n'est en fait réservé qu'à l'utilisateur actuel.

J'utilise .NET

9voto

Quintin Robinson Points 41988

Données relatives à la candidature commune

System.Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData)

Il s'agit d'un chemin d'accès au système de fichiers que vous pouvez utiliser pour sauvegarder des données entre plusieurs utilisateurs et plusieurs versions du système d'exploitation. Le chemin peut être différent selon la version, mais comme vous utilisez des variables d'environnement, la ligne ci-dessus se résoudra en un chemin utilisable.

Editer :
Il n'est pas nécessaire d'avoir des permissions élevées pour écrire dans ce répertoire, il est destiné exactement à cet usage.

8voto

mdb Points 20629

Comme Quintin l'a correctement répondu, le chemin %ALLUSERSPROFILE% (Environment.SpecialFolder.CommonApplicationData dans .NET) est ce que vous recherchez.

Il convient toutefois de garder à l'esprit deux éléments importants :

  • Il est conseillé de créer un sous-dossier pour votre entreprise et votre application à l'aide du programme d'installation de l'application. Par exemple

    Dim DataPath = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData)
    DataPath = IO.Path.Combine(DataPath, "ACME Corp.")
    DataPath = IO.Path.Combine(DataPath, "Widget App")
    DataPath = IO.Path.Combine(DataPath, "1.0") '//Optional, but possibly handy to easily migrate configuration files across major app versions
  • Bien que tous les utilisateurs aient un accès en lecture au dossier que vous créez, l'accès en écriture est par défaut limité au compte qui a créé le dossier, ainsi qu'aux membres du groupe Administrateurs et à LocalSystem. Si tous les utilisateurs doivent pouvoir modifier un fichier de configuration commun (créé par un utilisateur, mais réécrit par un autre utilisateur qui n'est pas administrateur), vous devrez prévoir cet accès de manière explicite. Là encore, il est préférable de le faire à partir de l'installateur de l'application, mais cela peut aussi se faire à partir du code, par exemple lors de la première exécution de l'application :

    Dim di As New IO.DirectoryInfo(DataPath)
    Dim ds = di.GetAccessControl
    ds.AddAccessRule(New Security.AccessControl.FileSystemAccessRule(...))
    di.SetAccessControl(ds)

-1voto

Neva Points 1

Voici une solution de contournement qui vous permet de conserver les paramètres pour tous les utilisateurs :

  1. Placez un fichier de configuration dans les fichiers du programme pour qu'il soit lu par votre application.
  2. Pour modifier ce fichier de paramètres, créez une nouvelle application conçue pour écrire dans le fichier de paramètres.
  3. Lancez cette application de modification des paramètres à partir de votre application principale avec le verbe "exécuter en tant que".

    Process p = new Process();
    p.StartInfo = new ProcessStartInfo("changeXMLSettings.exe");
    p.StartInfo.Verb = "runas";
    p.Start();

Cette opération demande une élévation et donne à l'application de modification des paramètres l'autorisation d'écrire dans le répertoire des fichiers du programme.

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