Démander automatiquement les droits administrateur pour votre application

Soyez le premier à donner votre avis sur cette source.

Vue 9 424 fois - Téléchargée 1 230 fois

Description

Sous XP ou Vista, si le contrôle de compte est actif ou si vous êtes en mode non-administrateur,
vous devez d'abord avoir les droits pour modifier ou placer des fichiers dans le repertoire racinne, etc
ainsi que des permissions pour écrire dans le registre à partir de HKEY_LOCAL_MACHINE entre autres,
ainsi que les droits pour enregistrer vos OCX ou DLL dans des programmes d'installation.
Comme Visual Basic ne peut pas créer un éxecutable qui demandera automatiquement ces droits à l'utilisateur,
la function suivante peut corriger cela.
Note: Il faut faire appel à cette function de préférence à l'initialisation du programme.
ça marche dès que le projet est compilé (logiquement)

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
2075
Date d'inscription
mercredi 21 août 2002
Statut
Contributeur
Dernière intervention
16 mars 2020
2
<déterrage=on>
Pour :

sFile = "C:\tmptest123test123.tmp"

En plus de la remarque (pertinente) concernant la présence où non du lecteur C, quand on a l'UAC au maximum, il est interdit de créer des fichier à la racine du disque système ; Donc même si il existe, y aura plantage.

Utilises le dossier temporaire. 2 Solution :

Soit tu met ça dans un module :

Option Explicit
Private Declare Function GetTempPath Lib "kernel32" Alias "GetTempPathA" (ByVal nBufferLength As Long, ByVal lpBuffer As String) As Long
Private Const MAX_PATH = 260
Public Function RepTemp() As String
Dim BuffRep As String
Dim ResltatLng As Long
BuffRep = String(MAX_PATH, 0)
RepTemp = IIf(GetTempPath(MAX_PATH, BuffRep) <> 0, Left(BuffRep, InStr(BuffRep, Chr(0)) - 1), "")
End Function

Soit tu utilise :

RepTemp = Environ("TEMP")

RepTemp renverra le dossier TEMP système.
<déterrage=off/>
Messages postés
178
Date d'inscription
lundi 5 juin 2006
Statut
Membre
Dernière intervention
30 novembre 2011

Exacte, sous Vista, on peut écrire sur le repertoire C:\Users\(utilisateur actuel)\AppData\Local\Temp et autres à partir de C:\Users\(utilisateur actuel) sans aucun droit administrateur, ce que ne permet pas de tester si on a tous les droits administrateur. Par contre, sur c:\Program Files ou sur C:\ on peut faire le teste.
Comme il peut avoir du monde qui a installé Windows sur un autre lecteur (D:\, E:\, jamais vu) je crois que j'aurais mieux temps d'employer l'Api GetSystemDirectory et d'éssayer d'y écrire un fichier temporaire pour le test.
Sinon:
A$="Test" & Rnd * 6666
sKey$ = "SOFTWARE\Microsoft\Windows\CurrentVersion\Run"
Call RegSetString(HKEY_LOCAL_MACHINE, sKey, A$, "ok")
Doevents
If RegGetString(HKEY_LOCAL_MACHINE, sKey, A$) = "ok" then
'on a tous les droits administrateur disponibles
End If
Call RegDelValue(HKEY_LOCAL_MACHINE, sKey, A$)
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
35
exact pour le 3e lien, donc il vaudrait mieux passer par le %TEMP%\blabla.tmp (2e lien) qui nous indiquera si on a le droit "d'écriture" tout court (et non tester sur un drive qui peut ne pas exister)

à savoir que dans tous les cas on peut avoir des droits dans certains dossiers et pas dans d'autres malgré une application démarrée en mode administrateur

bonne continuation
Messages postés
178
Date d'inscription
lundi 5 juin 2006
Statut
Membre
Dernière intervention
30 novembre 2011

@PCPT La function peut accepter son propre programme compilé, ou n'importe quel autre application, un install.exe par exemple. Pour lancer une autre application, ce n'est pas nécessaire de vérifier de si on est sur IDE ou pas.
La création d'un fichier TEMP dont le nom est donné par l'API GetTempFileName, ne permet pas de vérifier si on a le droit d'écrire sur la racinne de C:\. Par contre, on sait à l'avance qu'on a le droit d'écrire sur le fichier dont le nom a été donné par cette API. Ce n'est pas le but.
A la place d'écrire sur un fichier pour faire des testes, on pouvait écrire quelque part sur HKEY_LOCAL_MACHINE, et tester la valeur.

T'as bien raison quant à IF THEN ELSE, j'ai du supprimer deux lignes de code superflues après THEN pour simplifier la fonction. J'ai au moins laissé le comentaire.

En tout cas, merci pour les comentaires,
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
35
salut,

pas testé mais il y a au moins 2 choses à modifier :

* ne pas exécuter la fonction (quitter) si le programme n'est pas compilé. pour çà tu peux tester le mode de l'application :
http://www.codyx.org/snippet_savoir-si-on-est-dans-ide_44.aspx#194
plus approprié que de tester len(dir(chemin))

* tu testes l'écriture de "C:\tmptest123test123.tmp". rien ne dit que la partition C existe. passe plutôt par la création d'un fichier dans TEMP, soit de la même manière avec un nom de fichier fixe :
http://www.codyx.org/snippet_recuperer-chemin-temp_772.aspx#2291
soit par un fichier TMP :
http://www.codyx.org/snippet_generer-nom-fichier-temporaire-unique_619.aspx#1876

ps :
if instr(...) then 'SI VRAI => RIEN
else 'SINON => ACTION
TON_CODE

pas besoin de tester de cette manière et de ne rien faire
if intr(...) = 0 then
TON_CODE

++

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.