Une fois mon programme installé sur un ordinateur client, comment forcer l’exécution de mon programme en tant qu’administrateur sur Windows 7?
Vous aurez envie de modifier le manifeste intégré au programme. Cela fonctionne sur Visual Studio 2008 et versions ultérieures: Projet + Ajouter un nouvel élément, sélectionnez "Fichier du manifeste d'application". Changez l'élément <requestedExecutionLevel>
en:
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
L'utilisateur obtient l'invite UAC au démarrage du programme. Utilisez judicieusement leur patience peut s'user rapidement.
Ajouter un élément requestedExecutionLevel
à votre manifeste n’est que la moitié de la bataille; vous devez vous rappeler que UAC peut être désactivé. Si c'est le cas, vous devez effectuer la vérification à l'ancienne et afficher une boîte de dialogue d'erreur si l'utilisateur n'est pas administrateur.
(appelez IsInRole(WindowsBuiltInRole.Administrator)
sur votre thread CurrentPrincipal
).
Les étapes détaillées sont les suivantes.
Notez qu'en utilisant ce code, vous devez désactiver les paramètres de sécurité de ClickOnce. Pour ce faire, allez dans Propriétés -> Sécurité -> Sécurité ClickOnce
J'ai implémenté du code pour le faire manuellement:
using System.Security.Principal;
public bool IsUserAdministrator()
{
bool isAdmin;
try
{
WindowsIdentity user = WindowsIdentity.GetCurrent();
WindowsPrincipal principal = new WindowsPrincipal(user);
isAdmin = principal.IsInRole(WindowsBuiltInRole.Administrator);
}
catch (UnauthorizedAccessException ex)
{
isAdmin = false;
}
catch (Exception ex)
{
isAdmin = false;
}
return isAdmin;
}
Vous pouvez incorporer un fichier manifeste dans le fichier EXE, ce qui obligera Windows (version 7 ou supérieure) à toujours exécuter le programme en tant qu'administrateur.
Vous pouvez trouver plus de détails dans Étape 6: Créer et incorporer un manifeste d'application (UAC) (MSDN).
Lorsque vous travaillez sur Visual Studio 2008, cliquez avec le bouton droit de la souris sur Project -> Add New Item
, puis choisissez Application Manifest File
.
Dans le fichier manifeste, vous trouverez la balise requestedExecutionLevel
et vous pouvez définir le niveau à trois valeurs:
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
OR
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
OR
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
Pour que votre application soit exécutée en tant qu'administrateur, vous devez choisir celle du milieu.
Comme par
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
vous voudrez ajouter un manifeste d'application si vous n'en avez pas déjà un ou si vous ne savez pas comment en ajouter un. Comme certains projets n’ajoutent pas automatiquement un fichier manifeste séparé, allez tout d’abord dans les propriétés du projet, accédez à l’onglet Application et vérifiez que votre projet n’exclut pas le manifeste au bas de l’écran.
Dans Visual Studio 2010, cliquez avec le bouton droit de la souris sur le nom de votre projet. Appuyez sur "Afficher les paramètres Windows", cela génère et ouvre un fichier appelé "app.manifest". Dans ce fichier, remplacez "asInvoker" par "requireAdministrator", comme expliqué dans les sections commentées du fichier.
Une autre façon de faire cela, dans le code uniquement, consiste à détecter si le processus est exécuté en tant qu'administrateur, comme dans la réponse de @NG. . Et puis ouvrez à nouveau l'application et fermez celle en cours.
J'utilise ce code lorsqu'une application nécessite uniquement des privilèges d'administrateur lorsqu'elle est exécutée dans certaines conditions, par exemple lors de l'installation en tant que service. Ainsi, il n’est pas nécessaire de s’exécuter tout le temps en tant qu’administrateur, contrairement aux autres réponses.
Remarque: dans le code ci-dessous, NeedsToRunAsAdmin
est une méthode qui détecte si, dans les conditions actuelles, des privilèges d'administrateur sont requis. Si cela retourne false
, le code ne s’élèvera pas. C'est un avantage majeur de cette approche par rapport aux autres.
Bien que ce code présente les avantages mentionnés ci-dessus, il doit être relancé en tant que nouveau processus qui ne correspond pas toujours à ce que vous souhaitez.
private static void Main(string[] args)
{
if (NeedsToRunAsAdmin() && !IsRunAsAdmin())
{
ProcessStartInfo proc = new ProcessStartInfo();
proc.UseShellExecute = true;
proc.WorkingDirectory = Environment.CurrentDirectory;
proc.FileName = Assembly.GetEntryAssembly().CodeBase;
foreach (string arg in args)
{
proc.Arguments += String.Format("\"{0}\" ", arg);
}
proc.Verb = "runas";
try
{
Process.Start(proc);
}
catch
{
Console.WriteLine("This application requires elevated credentials in order to operate correctly!");
}
}
else
{
//Normal program logic...
}
}
private static bool IsRunAsAdmin()
{
WindowsIdentity id = WindowsIdentity.GetCurrent();
WindowsPrincipal principal = new WindowsPrincipal(id);
return principal.IsInRole(WindowsBuiltInRole.Administrator);
}
Vous pouvez créer le manifeste à l'aide des paramètres de sécurité ClickOnce, puis le désactiver:
Right click on the Project -> Properties -> Security -> Enable ClickOnce Security Settings
Après avoir cliqué dessus, un fichier sera créé dans le dossier de propriétés du projet appelé app.manifest une fois créé, vous pouvez décocher l'option Enable ClickOnce Security Settings
.
Ouvrez ce fichier et changez cette ligne:
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
à:
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
Cela obligera le programme à avoir des privilèges d’administrateur.
Ceci est une version simplifiée du this answer , ci-dessus de @NG
public bool IsUserAdministrator()
{
try
{
WindowsIdentity user = WindowsIdentity.GetCurrent();
WindowsPrincipal principal = new WindowsPrincipal(user);
return principal.IsInRole(WindowsBuiltInRole.Administrator);
}
catch
{
return false;
}
}