DÉMANDER AUTOMATIQUEMENT LES DROITS ADMINISTRATEUR POUR VOTRE APPLICATION

PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 - 19 sept. 2009 à 12:57
cs_PaTaTe Messages postés 2126 Date d'inscription mercredi 21 août 2002 Statut Contributeur Dernière intervention 19 février 2021 - 24 août 2012 à 03:07
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/50585-demander-automatiquement-les-droits-administrateur-pour-votre-application

cs_PaTaTe Messages postés 2126 Date d'inscription mercredi 21 août 2002 Statut Contributeur Dernière intervention 19 février 2021 2
24 août 2012 à 03:07
<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/>
vicosta Messages postés 178 Date d'inscription lundi 5 juin 2006 Statut Membre Dernière intervention 30 novembre 2011
19 sept. 2009 à 22:57
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$)
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
19 sept. 2009 à 16:14
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
vicosta Messages postés 178 Date d'inscription lundi 5 juin 2006 Statut Membre Dernière intervention 30 novembre 2011
19 sept. 2009 à 14:56
@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,
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
19 sept. 2009 à 12:57
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

++
Rejoignez-nous