Comment trouvez-vous de-privilèges pour un élevez processus enfant
Question
Je sais comment lancer un processus avec des privilèges d'administrateur d'un processus en utilisant:
proc.StartInfo.UseShellExecute = true;
proc.StartInfo.Verb = "runas";
où proc est un System.Diagnostics.Process. Mais comment faire le contraire?
Si le processus que vous êtes déjà élevé, comment voulez-vous lancer le nouveau processus sans privilèges d'administrateur? Plus précisément, nous devons lancer le nouveau processus avec le même niveau d'autorisation que l'Explorateur Windows, donc pas de changement si UAC est désactivé, mais si l'UAC est activé, mais notre processus est en cours d'exécution élevée, il faut effectuer une certaine opération non élevée parce que nous nous créons un lecteur virtuel et si elle a créé avec des autorisations élevées et explorateur Windows est en cours d'exécution unelevated il ne sera pas affiché.
Sentez-vous libre de changer le titre à quelque chose de mieux, je ne pouvais pas trouver une bonne description.
La solution 2
Nous avons fini par utiliser l'échantillon de ce Code article du projet: haute altitude peut être mauvais pour votre application: Comment commencer un processus non élevé à la fin de la d'installation
Il semble fonctionner à ce jour, je crois qu'il injecte dans RUNDLL32.EXE, mon C ++ / Win32 est assez faible pour que je ne regarde pas trop dans la mise en œuvre réelle, juste son utilisation. A confirmé que cela fonctionne dans Vista et Win7 x86 et x64 (au moins pour nous, x86 et x64 nécessitent différents pour lors de l'installation de dll qui est vérifié temps et celui approprié est utilisé).
Autres conseils
Vous pouvez utiliser ProcessStartInfo.UserName et ProcessStartInfo.Password pour spécifier la compte que vous voulez que votre processus exécuté sous.
class Program
{
static void Main(string[] args)
{
var psi = new ProcessStartInfo(@"c:\windows\system32\whoami.exe");
var password = new SecureString();
password.AppendChar('s');
password.AppendChar('e');
password.AppendChar('c');
password.AppendChar('r');
password.AppendChar('e');
password.AppendChar('t');
psi.Password = password;
psi.UserName = "username";
psi.UseShellExecute = false;
psi.RedirectStandardOutput = true;
var p = new Process();
p.StartInfo = psi;
p.Start();
p.WaitForExit();
Console.WriteLine(p.StandardOutput.ReadToEnd());
}
}