web-dev-qa-db-fra.com

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

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

Lorsque l'utilisateur clique sur DownloadUpdate.exe, le contrôle de compte d'utilisateur lui demande des autorisations d'administrateur. J'ai donc supposé que tous les processus créés et appelés dans DownloadUpdate.exe fonctionneraient en tant qu'administrateur. J'ai donc lancé le fichier d'installation 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;
76
RPS

Essaye ça:

//Vista or higher check
if (System.Environment.OSVersion.Version.Major >= 6)
{
   p.StartInfo.Verb = "runas";
}

Sinon, choisissez le chemin du manifeste pour votre application .

71
Nick Craver

Tout d'abord, vous devez inclure dans votre projet 

using System.Diagnostics;

Après cela, vous pourrez écrire une méthode générale que vous pourrez utiliser pour différents fichiers .exe que vous souhaitez utiliser. Ce serait comme ci-dessous:

public void ExecuteAsAdmin(string fileName)
{
    Process proc = new Process();
    proc.StartInfo.FileName = fileName;
    proc.StartInfo.UseShellExecute = true;
    proc.StartInfo.Verb = "runas";
    proc.Start();
}

Si vous voulez par exemple exécuter notepad.exe, vous appelez cette méthode:

ExecuteAsAdmin("notepad.exe");
21
drgmak

Voici une réponse claire à votre question: Comment forcer mon application .NET à s'exécuter en tant qu'administrateur?

Résumé:

Clic droit sur le projet -> Ajouter un nouvel élément -> Fichier du manifeste de l'application

Puis dans ce fichier, changez une ligne comme ceci:

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

Compiler et courir!

20
MSajjadi

Cela fonctionne quand je l'essaie. J'ai vérifié deux fois avec deux exemples de programmes:

using System;
using System.Diagnostics;

namespace ConsoleApplication1 {
  class Program {
    static void Main(string[] args) {
      Process.Start("ConsoleApplication2.exe");
    }
  }
}

using System;
using System.IO;

namespace ConsoleApplication2 {
  class Program {
    static void Main(string[] args) {
      try {
        File.WriteAllText(@"c:\program files\test.txt", "hello world");
      }
      catch (Exception ex) {
        Console.WriteLine(ex.ToString());
        Console.ReadLine();
      }
    }
  }
}

D'abord vérifié que je reçois la bombe de l'UAC:

System.UnauthorizedAccessException: Accès au chemin 'c:\programme files\test.txt 'est refusé.
// etc..

Puis ajouté un manifeste à ConsoleApplication1 avec la phrase:

    <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

Pas de bombe. Et un fichier que je ne peux pas supprimer facilement :) Ceci est cohérent avec plusieurs tests précédents sur différentes machines exécutant Vista et Win7. Le programme démarré hérite du jeton de sécurité du programme de démarrage. Si le démarreur a acquis des privilèges d'administrateur, le programme démarré les possède également.

18
Hans Passant
var pass = new SecureString();
pass.AppendChar('s');
pass.AppendChar('e');
pass.AppendChar('c');
pass.AppendChar('r');
pass.AppendChar('e');
pass.AppendChar('t');
Process.Start("notepad", "admin", pass, "");

Fonctionne également avec ProcessStartInfo :

var psi = new ProcessStartInfo
{
    FileName = "notepad",
    UserName = "admin",
    Domain = "",
    Password = pass,
    UseShellExecute = false,
    RedirectStandardOutput = true,
    RedirectStandardError = true
};
Process.Start(psi);
16
Darin Dimitrov

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

  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();
5
Hassan Nazeer

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 ça aide.

0
eg16
 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
chirag pathak

Vous devrez probablement définir votre application en tant qu'application x64.

Le composant logiciel enfichable IIS ne fonctionne qu'en 64 bits et ne fonctionne pas en 32 bits, et un processus généré à 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émarrez le processus en 64 bits

0