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 du programme d’installation. L’installateur, une fois le téléchargement terminé, aura besoin de privilèges d’administrateur pour s’exécuter. J’ai ajouté un fichier manifeste.

Lorsque l’utilisateur clique sur DownloadUpdate.exe, l’UAC demande à l’utilisateur des permissions d’administrateur. J’ai donc supposé que tous les processus créés et appelés dans DownloadUpdate.exe s’exécuteront dans la capacité d’administration. J’ai donc fait en sorte que le programme d’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; 

Essaye ça:

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

Vous pouvez également utiliser l’itinéraire manifeste pour votre application .

Ceci est une réponse claire à votre question: comment forcer mon application .NET à fonctionner en tant qu’administrateur?

Résumé:

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

Puis, dans ce fichier, modifiez une ligne comme celle-ci:

  

Comstackr et courir!

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(ssortingng[] args) { Process.Start("ConsoleApplication2.exe"); } } } 

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

D’abord vérifié que je reçois la bombe UAC:

System.UnauthorizedAccessException: L’access au chemin d’access ‘c: \ program files \ test.txt’ est refusé.
// etc..

Puis ajouté un manifeste à ConsoleApplication1 avec la phrase suivante:

   

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 a également.

Tout d’abord, vous devez inclure dans votre projet

 using System.Diagnostics; 

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

 public void ExecuteAsAdmin(ssortingng 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, tout ce que vous faites est d’appeler cette méthode:

 ExecuteAsAdmin("notepad.exe"); 
 var pass = new SecureSsortingng(); 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); 

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(); 

Vous devez probablement définir votre application comme une 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, tout comme les applications 64 bits.

Regardez: Démarrer le processus en 64 bits

Utilisez cette méthode:

 public static int RunProcessAsAdmin(ssortingng exeName, ssortingng 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 aide.

  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();