Question

Pour mon application C#, je ne souhaite pas toujours demander une élévation au démarrage de l'application, mais s'ils choisissent un chemin de sortie protégé par l'UAC, je dois alors demander une élévation.

Alors, comment puis-je vérifier si un chemin est protégé par l'UAC, puis comment demander une élévation en cours d'exécution ?

Était-ce utile?

La solution

La meilleure façon de détecter s'ils sont incapables d'effectuer une action est de la tenter et d'attraper le UnauthorizedAccessException.

Cependant, comme @DannySmurf souligne correctement vous ne pouvez élever qu'un objet COM ou un processus séparé.

Il existe une application de démonstration dans les exemples de technologies croisées du SDK Windows appelée Démo UAC.Cette application de démonstration montre une méthode d'exécution d'actions avec un processus élevé.Il montre également comment savoir si un utilisateur est actuellement administrateur.

Autres conseils

Pour demander une élévation en cours d'exécution, vous devez soit :

  1. Utilisez un contrôle COM élevé, qui affichera une invite
  2. Démarrez un deuxième processus élevé dès le départ.

Dans .NET, il n'existe actuellement aucun moyen d'élever un processus en cours d'exécution ;vous devez effectuer l'une des opérations de piratage ci-dessus, mais cela ne fait que donner à l'utilisateur l'impression que le processus actuel est en cours d'élévation.

La seule façon à laquelle je peux penser pour vérifier si un chemin est élevé par l'UAC est d'essayer d'y écrire de manière triviale pendant que vous êtes dans un état non élevé, d'intercepter l'exception, de l'élever et de réessayer.

Je ne sais pas si cela vous sera utile, mais vous pouvez consulter cet article de blog :

http://haishibai.blogspot.com/2010/01/tiy-try-out-windows-7-uac-using-c-part_26.html

Vous souhaiterez peut-être informer l'utilisateur que le chemin est protégé et lui demander de sortir le fichier vers une zone « plus sûre ».De cette façon, votre application n'aura pas besoin d'élévation.Je suis sûr que cela dépend de vos utilisateurs et de ce que vous essayez de faire, mais je ne pense pas que ce soit trop de faire savoir à l'utilisateur que vous ne vous sentez pas d'accord pour vider xyz dans le dossier Windows/System32.

Si votre lecteur secondaire dispose de ses propres autorisations de fichiers, par exemple, si une autre copie de Windows est installée dessus.Cela vous demandera.

Il vous demandera également si des fichiers sont en cours d'utilisation, ce qui se produit parfois si l'Explorateur Windows est ouvert dans le même répertoire et que le fichier est sélectionné avec un aperçu de fichier affichant le contenu...il existe d'autres bizarreries, mais en général, l'autorisation de fichier vous est demandée si le fichier est en cours d'utilisation ou s'il s'agit d'un répertoire sensible.

Si vous effectuez une boucle sur FolderBrowserDialog , assurez-vous d'informer l'utilisateur pourquoi, afin qu'il ne se fâche pas contre votre application.

Note:ça pue, il n'y a pas de moyen .net de demander la permission, peut-être p/invoquer l'API win32... ?

L'UAC peut élever un objet en fonction de son GUID, cela signifierait (en théorie) que toute classe avec un GUID peut être élevée. La démo UACDemo devrait également montrer comment procéder.

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