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?
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.
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
à
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
Ensuite, l'application WPF serait exécutée en tant qu'administrateur.
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);
}