web-dev-qa-db-fra.com

Comment forcer une application WPF à s'exécuter en mode Administrateur

J'ai une application WPF qui permet d'accéder aux services Windows, aux planificateurs de tâches sur la machine locale. Lorsque je déploie cette application WPF et que je l'exécute sans "Exécuter en tant qu'administrateur", elle échoue car elle ne peut pas accéder aux services Windows ni aux planificateurs de tâches sur l'ordinateur local. Si je l'exécute avec "Exécuter en tant qu'administrateur", cela fonctionne correctement.

Comment faire que mon application soit exécutée par défaut en mode administrateur lorsqu'elle est déployée en production?

43
SVI

Vous devez ajouter un app.manifest. Changez la requestedExecutionLevel de asInvoker à requireAdministrator. Vous pouvez créer un nouveau manifeste à l'aide de la boîte de dialogue Ajouter un fichier. Modifiez-le de manière à nécessiter un administrateur. Assurez-vous que les paramètres de votre projet sont également configurés pour utiliser ce manifeste. Cela vous permettra simplement de cliquer deux fois sur l'application et l'invite automatiquement à demander une élévation si ce n'est pas déjà fait.

Voir ici pour plus de documentation:

http://msdn.Microsoft.com/en-us/library/bb756929.aspx

EDIT: Pour sa valeur, l’article utilise VS 2005 et mt.exe pour intégrer le manifeste. Si vous utilisez Visual studio 2008+, cela est intégré. Ouvrez simplement les propriétés de votre projet et, sous l'onglet "Application", sélectionnez le manifeste.

71
vcsjones
  1. Faites un clic droit sur votre projet WPF pour ajouter un nouvel élément: "Ajouter-> Nouvel élément ..."
  2. Sélectionnez "Fichier du manifeste d'application" et cliquez sur Ajouter.
  3. Double-cliquez sur le fichier manifeste que vous venez de créer et modifiez le 
    <requestedExecutionLevel level="asInvoker" uiAccess="false" />

à

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

Ensuite, l'application WPF serait exécutée en tant qu'administrateur.

1
SLdragon

Si vous ne voulez pas rompre le clic, ce code est la meilleure solution:

using System.Security.Principal;
using System.Management;
using System.Diagnostics;
using System.Reflection;
//Put this code in the main entry point for the application
// Check if user is NOT admin 
if (!IsRunningAsAdministrator())
{
    // Setting up start info of the new process of the same application
    ProcessStartInfo processStartInfo = new ProcessStartInfo(Assembly.GetEntryAssembly().CodeBase);

    // Using operating Shell and setting the ProcessStartInfo.Verb to “runas” will let it run as admin
    processStartInfo.UseShellExecute = true;
    processStartInfo.Verb = "runas";

    // Start the application as new process
    Process.Start(processStartInfo);

    // Shut down the current (old) process
    System.Windows.Forms.Application.Exit();
    }
}

/// <summary>
/// Function that check's if current user is in Aministrator role
/// </summary>
/// <returns></returns>
public static bool IsRunningAsAdministrator()
{
    // Get current Windows user
    WindowsIdentity windowsIdentity = WindowsIdentity.GetCurrent();

    // Get current Windows user principal
    WindowsPrincipal windowsPrincipal = new WindowsPrincipal(windowsIdentity);

    // Return TRUE if user is in role "Administrator"
    return windowsPrincipal.IsInRole(WindowsBuiltInRole.Administrator);
}

Fondée à: http://matijabozicevic.com/blog/wpf-winforms-development/running-a-clickonce-application-as-administrator-also-for-windows-8

0
Mårshåll