Redémarrer le programme sans élévation

Pour une raison quelconque, mon programme C # doit redémarrer avec des privilèges élevés. J’utilise le code suivant pour y parvenir:

private static void RestartForPermissionsFix() { ProcessStartInfo processInfo = new ProcessStartInfo(); processInfo.Verb = "runas"; processInfo.FileName = Assembly.GetExecutingAssembly().Location; Process.Start(processInfo); } 

Cela fonctionne très bien.

Après avoir “réparé mes privilèges”, je souhaite redémarrer le programme sans aucune égalisation . J’ai essayé la même chose que ci-dessus sans les “runas”, mais cela ne fonctionne pas. Je suppose que le processus démarrant à partir d’un processus élevé est automatiquement élevé. Une idée?

Afin de lancer un processus à intégrité moyenne à partir d’un processus d’intégrité élevée, je pense que vous devez obtenir le jeton de processus actuel à l’aide d’ OpenProcessToken , le dupliquer, supprimer le SID d’intégrité élevée du jeton à l’aide de SetTokenInformation , puis utiliser ce jeton pour créer. le nouveau processus utilisant CreateProcessAsUser . Ce serait similaire à cet exemple , sauf que, plutôt que d’append le SID à faible intégrité, vous devrez supprimer celui à haute intégrité. Remarque: je n’ai pas testé cela, donc je ne suis pas sûr à 100% que cela fonctionnerait.

Je vous suggère de laisser le processus original non-exécuté en cours d’exécution et de le laisser attendre que son équivalent élevé soit terminé (par exemple, en utilisant Process.WaitForExit ). Une fois que cela est terminé, il peut continuer comme auparavant. Ce serait beaucoup plus facile et plus infaillible.

J’ai eu le même problème avec une application que je voulais mettre à jour automatiquement (le programme de mise à jour nécessite des privilèges élevés).

Ce que j’ai fait a été de créer un fichier .exe externe qui lancerait mon programme de mise à jour avec des privilèges élevés, attendrais qu’il se ferme, puis redémarrait mon application avec des privilèges normaux.

J’ai ensuite intégré ce fichier .exe dans mon application principale et le lance juste avant de quitter mon application lorsque je le mets à jour.