web-dev-qa-db-fra.com

Comment forcer mon application .NET à s'exécuter en tant qu'administrateur?

Une fois mon programme installé sur un ordinateur client, comment forcer l’exécution de mon programme en tant qu’administrateur sur Windows 7?

823
Gold

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.

1073
Hans Passant

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).

150
Anders

Les étapes détaillées sont les suivantes.

  1. Ajouter le fichier manifeste d'application à la solution
  2. Changer le paramètre de l'application en "app.manifest"
  3. Mettre à jour la balise de "supportedExecutionLevel" vers requireAdministrator.

Adding file in Solution

Select Application Manifest File

Select Manifest option

Update Manifest file

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

60
Hassan Rahman

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;
}
57
NG.

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).

42
David

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.

19
Rashad Maqsood

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.

  • Ensuite, clic droit sur le projet
  • Ajoute un nouvel objet
  • Enfin, recherchez et cliquez sur le fichier manifeste d'application
13
Justin Mcconnell

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.

12
Evolved

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);
}
10
TheLethalCoder

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.

8
Yochai Timmer

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;
    }
}
8
Hakan Fıstık