2009-09-02 8 views
0

J'ai un ancien programme de mise à jour écrit en vb6, qui fonctionne en tant qu'administrateur. Cependant, comme il fonctionne en tant qu'admin, tous les fichiers qu'il télécharge et enregistre sont en lecture seule pour les autres utilisateurs. Même les fichiers dans les endroits publics comme le dossier de données de l'application partagée (où je sauvegarde les fichiers en question).Comment définir les autorisations de fichiers pour les utilisateurs non-administrateurs dans VB6?

J'ai eu de la chance d'avoir trouvé ça avant la version "compatible avec vista". Vista cache le problème en redirigeant les écritures non-admin et les futures lectures vers un dossier «virtuel» sortof. Mais la prochaine mise à jour peut remplacer le fichier, et le programme non-administrateur ira toujours dans le dossier virtuel et utilisera l'ancien fichier.

En tant qu'administrateur, comment autoriser les autres utilisateurs à contrôler totalement les fichiers que j'écris en vb6?

Répondre

2

La façon dont je fais ceci est d'en faire une responsabilité de l'installateur.

Utilisez VSI 1.1 pour créer un fichier MSI d'installation pour votre application. Créez un dossier de données d'application sous CommonAppDataFolder.

Comme une étape de post-construction exécuter un script pour effectuer les opérations suivantes:

  1. Définir la base de données MSI pour une installation par machine: table de propriété, rangée avec ALLUSERS mis à 1.
  2. Dans le Table de répertoire, recherchez l'entrée pour CommonAppDataFolder et obtenez son répertoire Index. Utilisez cet index pour interroger la table Directory pour une entrée où CommonAppDataFolder est le parent et obtenir son index (il s'agit de votre sous-dossier de données d'application).
  3. Regardez dans la table de fichier pour obtenir le composant Index de votre programme.
  4. Créez la table CreateFolder dans la base de données si elle n'est pas présente. Ajoutez une ligne à CreateFolder pour le sous-répertoire d'application souhaité par son index, en l'attachant à l'index de composant de votre programme.
  5. Créez la table LockPermissions si elle n'est pas présente. Insérez une nouvelle ligne LockPermissions pour votre sous-répertoire de données d'application, en lui donnant FILE_ALL_ACCESS pour tout le monde.

C'est à peu près tout.Vous pouvez le faire de cette façon, ou utiliser VSI 1.1 puis éditer le MSI en utilisant Orca, ou probablement en utilisant un outil de création MSI tiers. Ces entrées seront paramétrables via son interface graphique et peuvent être sauvegardées dans le projet Installer. Je viens d'utiliser un petit script WSH que je lance après chaque build VSI 1.1. Je pense que c'est la manière recommandée d'accomplir de telles choses selon les directives d'application de Windows. Si vos besoins sont fantaisistes, vous pouvez utiliser plusieurs sous-répertoires ou sous-sous-répertoires autorisant un accès complet, certains en lecture seule, etc.

Votre programme peut localiser le dossier à l'aide d'objets Shell Automation ou en appelant Shell32 en tant que DLL standard (en utilisant Déclarez la fonction ou un TLB).

+0

Je vois, donc si je configure le dossier de données de mon programme pour permettre un accès normal alors le problème devrait être résolu? –

+0

Voilà à peu près ce que je pense. Je ne suis pas sûr qu'il y ait un bon code court flottant pour faire cela à partir de votre programme VB6 si. – Bob77

1

Ce n'est pas forcément qui écrit le fichier, mais où il l'écrit. Le dossier des fichiers programme et ses sous-dossiers sont en lecture seule pour tous les utilisateurs standard par défaut. Essayez d'utiliser le dossier All Users Application Data à la place.

Ceci est un peu difficile pour VB6, car il n'a pas du tout été conçu pour Vista. Certains des dossiers pertinents ont été renommés et il n'y a aucun moyen que je connaisse pour obtenir vb6 pour vous donner le dossier exact que vous voulez à court d'utiliser un alias "Declare Function" pour appeler directement dans l'API Windows.

Donc la façon la plus simple et la plus fiable de trouver un emplacement approprié est d'utiliser la variable d'environnement %ALLUSERSPROFILE%. Cela renvoie "C:\Documents and Settings\All Users" par défaut sur XP et "C:\ProgramData" par défaut sur Vista. De là, vous pouvez rechercher un dossier "Application Data". Il ne sera pas là et vous n'en aurez pas besoin sur Vista, mais en créer un s'il n'existe pas ne fera pas de mal à quoi que ce soit. Cela vous donne une structure de dossier cohérente sur les deux systèmes à partir de laquelle vous pouvez créer un sous-dossier pour votre application à utiliser comme espace de travail.

Et une note finale: ce n'est pas un nouveau changement pour Vista. Les dossiers Program Files ont toujours été accessibles en lecture seule aux utilisateurs standard. XP a travaillé de la même manière. C'est juste que tant de gens courent comme administrateurs dans XP, vous pourriez être en mesure de s'en tirer avec.

+0

Les fichiers en question se trouvent dans le dossier de données de l'application pour tous les utilisateurs (C: \ AppData sur Vista). Le programme de mise à jour modifie et enregistre également les fichiers du programme, qui doivent être exécutés en tant qu'administrateur. –

+0

Les mises à jour de programmes partagés par plusieurs utilisateurs doivent nécessiter des droits d'administrateur. C'est juste le bon sens d'un point de vue sysadmin. Il est étrange, cependant, que les fichiers non-programme ne fonctionnent pas pour vous à partir du dossier App Data. Avez-vous vérifié les options de sécurité pour voir qui a des droits? –

+0

Tout fichier créé/remplacé par le programme de mise à jour est en lecture seule pour les utilisateurs standard. Mais je veux que les utilisateurs normaux aient des autorisations complètes pour les fichiers de données d'application afin que le programme puisse fonctionner. –

Questions connexes