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

C# Discussion :

Explications sur le fonctionnement d'une application avec droits Admin


Sujet :

C#

  1. #1
    Membre habitué
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2007
    Messages
    344
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2007
    Messages : 344
    Points : 127
    Points
    127
    Par défaut Explications sur le fonctionnement d'une application avec droits Admin
    Bonjour,

    Je cherche à savoir comment fonctionne le système d'admin pour les applications Windows (je sais pas si j0utilise les bons termes).

    Je dois faire une application simple avec doit arrêter ou démarrer un service précis, j'ai fait ça en C#, si je lance mon .exe en admin ça fonctionne, par contre si je lance normalement ça ne fonctionne pas, vu que l'.exe n'est pas en mode admin.

    Alors comment faire pour que n'importe quel user puisse lancer cette exe et qu'il fonctionne? Comment font les autres applications que nous installons?

    Merci d'avance

  2. #2
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Il faut utiliser un fichier .manifest. Tu trouveras plus d'info ici : Application Manifests.

    En très gros cela permet de demander une élévation de privilèges au lancement du processus (de l'application). On peut l'utiliser pour une application complète, ou juste pour une DLL...
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  3. #3
    Membre habitué
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2007
    Messages
    344
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2007
    Messages : 344
    Points : 127
    Points
    127
    Par défaut
    Bonjour,

    Merci pour votre réponse, avec ce fichier manifest, il demandera toujours une élévation de privilège quand on lancera l'application? C'est la fenêtre UAC qui demande le mdp admin?

    Merci

  4. #4
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Oui tout à fait. D'ailleurs j'en profite pour apporter une précision. Si tu n'as pas le contrôle sur le(s) poste(s) utilisateur(s), il faut savoir que l'UAC peut être désactivé. Auquel cas ce fichier app.manifest peut ne pas être suffisant. Pour être sûr que ton utilisateur soit administrateur, tu peux utiliser cet exemple de code :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    bool isAdmin = new WindowsPrincipal(WindowsIdentity.GetCurrent()).IsInRole(WindowsBuiltInRole.Administrator) ? true : false;
     
    if(isAdmin)
    {
        MessageBox.Show("you are an administrator");
    }
    else
    {
        MessageBox.Show("You are not an administrator");
    }
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  5. #5
    Membre habitué
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2007
    Messages
    344
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2007
    Messages : 344
    Points : 127
    Points
    127
    Par défaut
    Bonjour,

    Merci pour votre réponse.

    Alors justement, il faut pas que le mdp admin soit demandé.

    Je crois qu'on s'est mal compris, je vais essayer de mieux expliquer:

    - Les users ne sont pas admin sur les postes clients
    - Certains de ces users doivent utiliser un programme fournit par un éditeur qui "bug", pour l'instant ile ne veulent pas corriger ce problème, on doit donc se débrouiller seul...
    - Pour "corriger" temporairement ce bug, il faut redémarrer le service du programme en question si il y eu une perte de réseau (ex: on passe du câble rj45 en wifi)
    - J'ai fait un script Powershell qui fait tout ça, fonctionne, mais il faut être admin de la machine pour restart ce service => Pas possible de mettre un user en admin local pour cause de sécurité...

    C'est pour ça que je recherche une autre solution, genre faire un programme qui va s'installer en admin (comme n'importe quel autre programme) ou alors faire un service ou je sais pas quoi d'autre, sauf que je ne connais pas bien le mode de fonctionnement pour faire ça.

    - Peut-on configurer un.exe pour qu’il s’exécute en user admin local, ou alors le compte local système comme pour les services?
    - Ou alors faire un service qui puisse redémarrer un autre service suivant des conditions?

    Merci

  6. #6
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Avec l'UAC il y a pas mal de contraintes. L'autre solution c'est de créer un compte de service dans l'AD. Ce compte de service sera membre du groupe admin par exemple. Ensuite dans ton application il faudra utiliser l'impersonation, qui consiste à exécuter du code dans le contexte d'un autre utilisateur que celui en cours.

    Voici un exemple de code :
    Code C# : 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
    46
    47
    [PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
    public class Impersonation : IDisposable
    {
        private readonly SafeTokenHandle _handle;
        private readonly WindowsImpersonationContext _context;
     
        const int LOGON32_LOGON_NEW_CREDENTIALS = 9;
     
        public Impersonation(string domain, string username, string password)
        {
            var ok = LogonUser(username, domain, password,
                           LOGON32_LOGON_NEW_CREDENTIALS, 0, out this._handle);
            if (!ok)
            {
                var errorCode = Marshal.GetLastWin32Error();
                throw new ApplicationException(string.Format("Could not impersonate the elevated user.  LogonUser returned error code {0}.", errorCode));
            }
     
            this._context = WindowsIdentity.Impersonate(this._handle.DangerousGetHandle());
        }
     
        public void Dispose()
        {
            this._context.Dispose();
            this._handle.Dispose();
        }
     
        [DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
        private static extern bool LogonUser(String lpszUsername, String lpszDomain, String lpszPassword, int dwLogonType, int dwLogonProvider, out SafeTokenHandle phToken);
     
        public sealed class SafeTokenHandle : SafeHandleZeroOrMinusOneIsInvalid
        {
            private SafeTokenHandle()
                : base(true) { }
     
            [DllImport("kernel32.dll")]
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
            [SuppressUnmanagedCodeSecurity]
            [return: MarshalAs(UnmanagedType.Bool)]
            private static extern bool CloseHandle(IntPtr handle);
     
            protected override bool ReleaseHandle()
            {
                return CloseHandle(handle);
            }
        }
    }
    Pour l'utiliser :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    using (new Impersonation(domain, username, password))    // Ici les identifiants du compte de service
    {
        // ici le code qui doit s'exécuter avec des privilèges élevés
    }
    (source)
    Il est recommandé de ne mettre dans le bloc using que le code qui a besoin de droits plus larges. Bien sur tu peux aussi faire en sorte que toute ton application en bénéficie, mais attention aux impacts potentiels en terme de sécurité...
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

Discussions similaires

  1. Réponses: 2
    Dernier message: 30/03/2010, 02h26
  2. Réponses: 6
    Dernier message: 02/09/2009, 09h31
  3. Aide: une application avec base de donner sur le web
    Par maverick_lp28 dans le forum Web & réseau
    Réponses: 2
    Dernier message: 16/04/2009, 13h21
  4. [A-07] Déployer une application avec Access2007 sur Windows98
    Par nicolas2603 dans le forum Modélisation
    Réponses: 12
    Dernier message: 05/11/2008, 20h06

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