Question

Une fois mon programme installé sur une machine client, comment puis-je forcer mon programme à s'exécuter en tant qu'administrateur sur Windows 7?

Était-ce utile?

La solution

Vous voudrez modifier le manifeste qui est intégré dans le programme. Cela fonctionne sur Visual Studio 2008 et supérieur: Project + Ajouter un nouvel élément, sélectionnez "Application Manifest Fichier". Changer la <requestedExecutionLevel> élément à:

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

L'utilisateur obtient le UAC Invite lorsqu'ils commencent le programme. Utiliser sagement; Leur patience peut s'use rapidement.

Autres conseils

Ajoutant un requestedExecutionLevel L'élément de votre manifeste n'est que la moitié de la bataille; tu dois te souvrer UAC peut être éteint. Si c'est le cas, vous devez effectuer la vérification de l'ancienne et mettre en place une boîte de dialogue d'erreur si l'utilisateur n'est pas administrateur
(appel IsInRole(WindowsBuiltInRole.Administrator) sur votre fil CurrentPrincipal).

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

  1. Ajouter un fichier manifeste d'application à la solution
  2. Modifier le paramètre de l'application sur "app.manifest"
  3. Mettez à jour la balise de "DevicedExEcutionLevel" pour exiger le lingeur.

Adding file in Solution

Select Application Manifest File

Select Manifest option

Update Manifest file

Notez qu'à l'aide de ce code, vous devez désactiver les paramètres de sécurité de Clickonce, pour ce faire, entrez dans les propriétés -> Sécurité -> ClickOce Security

J'ai implémenté un 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 intégrer un fichier manifeste dans le fichier EXE, ce qui entraînera toujours que Windows (7 ou supérieur) exécutera toujours le programme en tant qu'administrateur.

Vous pouvez trouver plus de détails dans Étape 6: Créer et intégrer un manifeste d'application (UAC) (MSDN).

Tout en travaillant sur Visual Studio 2008, cliquez avec le bouton droit sur Project -> Add New Item puis a choisi Application Manifest File.

Dans le fichier manifeste, vous trouverez la balise requestedExecutionLevel, et vous pouvez définir le niveau sur trois valeurs:

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

OU

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

OU

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

Pour définir votre application pour s'exécuter en tant qu'administrateur, vous devez choisir celui du milieu.

Selon

<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 distinct, accédez d'abord aux propriétés du projet, accédez à la Application Onglez et vérifiez que votre projet n'exclut pas le manifeste en bas du robinet.

  • Ensuite, projet de clic droit
  • Ajoute un nouvel objet
  • Dernier fichier de manifeste d'application et cliquez

Dans Visual Studio 2010, cliquez avec le bouton droit sur le nom de votre projet. Appuyez sur "Affichage des 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 dans le fichier.

Une autre façon de le faire, dans le code uniquement, est de détecter si le processus est en cours d'exécution comme administrateur La réponse de @ng.. Puis ouvrez l'application à nouveau et fermez celle actuelle.

J'utilise ce code lorsqu'une application n'a besoin que des privilèges d'administration lorsqu'ils sont exécutés dans certaines conditions, comme lors de l'installation en tant que service. Il n'a donc pas besoin de fonctionner en tant qu'administrateur tout le temps comme les autres réponses le forcent également.

Remarque dans le code ci-dessous NeedsToRunAsAdmin est une méthode qui détecte si dans des conditions actuelles, les privilèges d'administration sont nécessaires. Si cela revient false Le code ne s'élèvera pas. C'est un avantage majeur de cette approche par rapport aux autres.

Bien que ce code ait les avantages énoncés ci-dessus, il doit se relancer comme un nouveau processus qui n'est pas toujours ce que vous voulez.

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

Ceci est une version simplifiée de ce réponse, ci-dessus par @ng

public bool IsUserAdministrator()
{
    try
    {
        WindowsIdentity user = WindowsIdentity.GetCurrent();
        WindowsPrincipal principal = new WindowsPrincipal(user);
        return principal.IsInRole(WindowsBuiltInRole.Administrator);
    }
    catch
    {
        return false;
    }
}

Vous pouvez créer le manifeste à l'aide de paramètres de sécurité ClickOce, 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 Propriétés du projet appelé app.manifest Une fois cette création, vous pouvez décocher le Enable ClickOnce Security Settings option

Ouvrez ce fichier et modifiez cette ligne:

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

à:

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

Cela obligera le programme à exiger les privilèges de l'administrateur.

Cliquez avec le bouton droit sur votre exécutable, accédez à Propriétés> Compatibilité et cochez la case «Exécutez ce programme en tant qu'administrateur».

Si vous souhaitez l'exécuter en tant qu'administrateur pour tous les utilisateurs, faites la même chose dans «Modifier le paramètre pour tous les utilisateurs».

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top