113 votes

Comment démarrer un processus en mode administrateur en C#

J'ai un projet d'application Visual Studio Windows. J'ai ajouté du code pour télécharger un fichier de mise à jour de l'installateur. Une fois le téléchargement terminé, l'installateur doit disposer des privilèges d'administrateur pour s'exécuter. J'ai ajouté un fichier manifeste.

Lorsque l'utilisateur clique sur le DownloadUpdate.exe, l'UAC lui demande des autorisations d'administrateur. J'ai donc supposé que tous les processus créés et appelés dans DownloadUpdate.exe s'exécuteront en tant qu'administrateur. J'ai donc fait en sorte que l'installation appelle mon fichier téléchargé avec le code suivant :

Process p = new Process();
p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
p.StartInfo.FileName = strFile;
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;

1 votes

Non, vous ne pouvez pas supposer que tous les processus exécutés par DownloadUpdater.exe le sont en mode administrateur. En fait, ce serait une terrible violation de la sécurité. Si vous exécutez un autre processus qui nécessite des droits d'administrateur, l'utilisateur sera à nouveau invité.

6voto

Hassan Nazeer Points 309

Voici un exemple d'exécution de processus en tant qu'administrateur sans Windows Prompt.

  Process p = new Process();
  p.StartInfo.FileName = Server.MapPath("process.exe");
  p.StartInfo.Arguments = "";
  p.StartInfo.UseShellExecute = false;
  p.StartInfo.CreateNoWindow = true;
  p.StartInfo.RedirectStandardOutput = true;
  p.StartInfo.Verb = "runas";
  p.Start();
  p.WaitForExit();

0 votes

Cela a résolu mon problème ! L'invite apparaissait dans les réponses des autres. La combinaison de UseShellExecute, CreateNoWindow et RedirectStandardOutput a mis fin à ce problème pour moi.

4 votes

Ça ne fonctionne pas en tant qu'administrateur. Si vous ajoutez un manifeste et demandez des autorisations élevées, cela ne fonctionnera toujours pas.

0 votes

Il ne fonctionne pas non plus, il m'a demandé d'entrer le mot de passe admin lors de la désinstallation du service de fenêtre de l'application.

3voto

chirag pathak Points 111
 Process proc = new Process();                                                              
                   ProcessStartInfo info = 
                   new ProcessStartInfo("Your Process name".exe, "Arguments");
                   info.WindowStyle = ProcessWindowStyle.Hidden;
                   info.UseShellExecute =true;
                   info.Verb ="runas";
                   proc.StartInfo = info;
                   proc.Start();

0 votes

Les "Arguments" ne sont pas obligatoires dans ProcessStartInfo, seul le nom du processus est suffisant pour démarrer le processus.

2voto

eg16 Points 1447

Utilisez cette méthode :

public static int RunProcessAsAdmin(string exeName, string parameters)
    {
        try {
            System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
            startInfo.UseShellExecute = true;
            startInfo.WorkingDirectory = CurrentDirectory;
            startInfo.FileName = Path.Combine(CurrentDirectory, exeName);
            startInfo.Verb = "runas";
            //MLHIDE
            startInfo.Arguments = parameters;
            startInfo.ErrorDialog = true;

            Process process = System.Diagnostics.Process.Start(startInfo);
            process.WaitForExit();
            return process.ExitCode;
        } catch (Win32Exception ex) {
            WriteLog(ex);
            switch (ex.NativeErrorCode) {
                case 1223:
                    return ex.NativeErrorCode;
                default:
                    return ErrorReturnInteger;
            }

        } catch (Exception ex) {
            WriteLog(ex);
            return ErrorReturnInteger;
        }
    }

J'espère que cela vous aidera.

0 votes

Valable pour l'appel BAT ou CMD script ?

0voto

Sharique Abdullah Points 496

Vous devez probablement définir votre application comme une application x64.

Le Snap In d'IIS ne fonctionne qu'en 64 bits et ne fonctionne pas en 32 bits, et un processus créé à partir d'une application 32 bits semble fonctionner comme un processus 32 bits et il en va de même pour les applications 64 bits.

Regardez : Démarrer le processus en tant que 64 bits

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X