IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Delphi Discussion :

Ouvrir un programme avec les droits administrateur sans avoir de notification


Sujet :

Langage Delphi

  1. #1
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 036
    Points : 40 941
    Points
    40 941
    Billets dans le blog
    62
    Par défaut Ouvrir un programme avec les droits administrateur sans avoir de notification
    Bonjour,

    Malgré le tutoriel de Pascal Fonteneau je me bats encore avec les manifestes.
    Objectif : Savoir si mon programme est connecté à Internet et s'il est en relation avec mon serveur de base de données en local (wifi ou RJ45) ou pas

    En utilisant Indy et plus particulièrement TidICMPClient j'arrive bien à obtenir les résultats mais pour cela le programme doit être lancé en mode administrateur et, hélas, cela s'affiche (bien sur selon le niveau de l'UAC mais je n'aurais pas toujours la main dessus).
    Après avoir lu le tutoriel, j'ai fait une application console dans le but d'y faire appel via la fonction RunasAdmin

    environnement de travail : XE8, Programme appelant FMX, WINDOWS 8 , UAC activée (et devant le rester) au niveau "toujours m'avertir" ou "m'avertir quand des applications tentent ..."

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    function RunAsAdmin(hWnd : HWND; aFile : String; aParameters : String) : DWORD;
    Var
     Sei : TShellExecuteInfoW;
    begin
     Fillchar(sei,SizeOf(sei),0);
     sei.cbSize := SizeOf(sei);
     sei.Wnd    := hWnd;
     sei.fMask  := SEE_MASK_FLAG_DDEWAIT or SEE_MASK_FLAG_NO_UI;
     sei.lpfile := PChar(aFile);
     sei.lpVerb := 'runas';
     sei.lpParameters := PChar(aParameters);
     sei.nShow := SW_HIDE;
     if not ShellExecuteExW(@sei)
       then RaiseLastOSError
       else GetExitCodeProcess(Sei.hProcess,result); // en fait je récupère ainsi le résultat
    end;
    le programme console très simple, est appelé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    program TestConnexion;
     
    {$APPTYPE CONSOLE}
     
    {$R *.res}
     
    uses
      System.SysUtils,
      IdIcmpClient,
      IdBaseComponent,
      IdComponent,
      IdRawBase,
      IdRawClient;
     
    function ExecuteProgram : integer;
     var ICMP : TIdIcmpClient;
         RC : integer;
     begin
       RC:=0;
       // Program does something
       ICMP:=TIdIcmpClient.Create(nil);
       try
         ICMP.Host:='www.google.com';
         ICMP.Ping();
         RC:=1; //RC OR 1;
         ICMP.Host:='xxx.xxx.xxx.xxx'; // je vous cache cette adresse ;)
         ICMP.Ping();
         RC:=RC OR 2;
         ICMP.Host:='192.168.1.60'; // 1.16
         ICMP.Ping();
         RC:=RC OR 4; // local
       finally
         ICMP.Free;
         Result:=RC;
       end;
     end;
     
    begin
      try
        ExitCode:=ExecuteProgram;
      except
        ExitCode:=-1
      end;
    end.
    cependant c'est toujours pareil à l'exécution j'ai toujours l'affichage d'attention indiquant que le programme va faire "des modifications dans la base de registre"
    Comment puis-je m'en passer ! j'ai tenté plusieurs manifestes, celui ci me paraissait le bon , mais pourtant non ! je commence à voir
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <dependency>
    <dependentAssembly>
    <assemblyIdentity
    type="win32"
    name="Microsoft.Windows.Common-Controls"
    version="6.0.0.0"
    publicKeyToken="6595b64144ccf1df"
    language="*"
    processorArchitecture="*"/>
    </dependentAssembly>
    </dependency>
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
    <requestedPrivileges>
    <requestedExecutionLevel
    level="higestAvailable"
    />
    </requestedPrivileges>
    </security>
    </trustInfo>
    </assembly>
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 688
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 688
    Points : 13 117
    Points
    13 117
    Par défaut
    Je ne vois pas la raison d'une élévation de privilèges juste pour faire un ping

    Sinon, quelques remarques :

    • Il faut requireAdministrator pour assurer des droits admin. Avec higestAvailable, ces droits ne seront effectifs que si l'utilisateur a un compte administrateur. En fait, higestAvailable est comme si l'UAC était désactivé.
    • Avec RunAs et l'UAC, il y aura toujours la demande de confirmation même si le programme cible n'en a pas besoin. Inutile donc si la demande est faite par manifest.
    • Si tu veux utiliser hProcess, il faut spécifier SEE_MASK_NOCLOSEPROCESS (sans oublier de libérer ce handle par la suite).
    • Enfin, remplacer SEE_MASK_FLAG_DDEWAIT par SEE_MASK_NOASYNC.

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 036
    Points : 40 941
    Points
    40 941
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Je ne vois pas la raison d'une élévation de privilèges juste pour faire un ping
    C'est nécessaire avec Indy
    Citation Envoyé par FAQ INDY
    In Windows NT and Windows 2000, Indy's TIdICMPClient requires administrative privileges to use raw sockets.
    la FAQ est un peu obsolète écrite à l'époque de Windows Me et donc ne fait aucune référence aux nouveaux systèmes incluant l'UAC

    finalement, comme du coup j'utilise un programme console, je me suis rabattu sur ICS VCL et plus besoin de privilège
    et qui plus est c'est plus rapide

    Cependant je laisse le post ouvert, vais tester requireAdministrator, et pose la question qui va remuer les méninges : Quid avec les autres OS (OSX,iOS et Androïd) qui eux n'accepte pas ICS ? ....
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

Discussions similaires

  1. Réponses: 4
    Dernier message: 23/03/2015, 20h43
  2. Réponses: 0
    Dernier message: 08/04/2011, 11h56
  3. Réponses: 0
    Dernier message: 12/11/2009, 16h16
  4. Ouvrir un fichier avec les droits d'administration
    Par ram-0000 dans le forum Windows 7
    Réponses: 2
    Dernier message: 03/09/2009, 21h40
  5. Exécuter avec les droits administrateur
    Par Pandala dans le forum VBScript
    Réponses: 6
    Dernier message: 23/05/2007, 13h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo