Question

J'ai une application qui vérifierait les mises à jour au démarrage et, si les mises à jour se trouvent, il copie des fichiers sur le réseau dans le dossier des fichiers de programme. Il est évident que cette tâche ne peut être effectuée par Standard Users dans les scénarios normaux.

J'essayé de créer un service pour faire le processus de mise à jour mais j'ai eu quelques problèmes de sécurité et je a posé cette question à ce sujet dans superutilisateurs.

Maintenant, compte tenu du fait que la plupart des applications nécessitent des privilèges élevés pour exécuter cette tâche, je pense que cela pourrait être la bonne approche. Mais comment puis-je demander l'élévation de la sous updater toutes les versions de Windows à partir de XP, inclus. Je l'ai trouvé beaucoup de sujets sur un fichier manifeste, mais depuis que je besoin de ce à travailler avec XP, je ne peut pas créer une solution spécifiquement pour contrôle de compte.

Était-ce utile?

La solution

Privilèges ne peuvent être élevés au démarrage d'un processus; un des privilèges de processus en cours d'exécution ne peuvent pas être élevés. Afin d'élever une application existante, une nouvelle instance du processus d'application doit être créé, avec le verbe « runas »:

private static string ElevatedExecute(NameValueCollection parameters)
{
    string tempFile = Path.GetTempFileName();
    File.WriteAllText(tempFile, ConstructQueryString(parameters));

    try
    {
        ProcessStartInfo startInfo = new ProcessStartInfo();
        startInfo.UseShellExecute = true;
        startInfo.WorkingDirectory = Environment.CurrentDirectory;
        Uri uri = new Uri(Assembly.GetExecutingAssembly().GetName().CodeBase);
        startInfo.FileName = uri.LocalPath;
        startInfo.Arguments = "\"" + tempFile + "\"";
        startInfo.Verb = "runas";
        Process p = Process.Start(startInfo);
        p.WaitForExit();
        return File.ReadAllText(tempFile);
    }
    catch (Win32Exception exception)
    {
        return exception.Message;
    }
    finally
    {
        File.Delete(tempFile);
    }
}

Après que l'utilisateur confirme l'exécution du programme en tant qu'administrateur, une autre instance de la même application est exécutée sans une interface utilisateur; on peut afficher une interface utilisateur en cours d'exécution sans privilèges élevés, et un autre en cours d'exécution en arrière-plan avec des privilèges élevés. Le premier processus attend jusqu'à ce que le second se termine son exécution. Pour plus d'informations et un exemple de travail, vous pouvez consulter le MSDN archives .

Pour éviter toutes ces manigances de dialogue au milieu d'un long processus, vous devez exécuter l'ensemble de votre processus hôte avec des autorisations élevées par

scroll top