web-dev-qa-db-fra.com

application dotnet core exécutée en tant qu'administrateur

J'ai une application de console dotnet qui nécessite des privilèges d'administrateur pour fonctionner. Je ne trouve pas comment faire ça. Dans un projet régulier, j'ajouterais un app.manifest et je définirais

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

mais je ne sais pas comment intégrer cela dans la version.

Comment puis-je faire cela?

21
A Jackson

Cela n'est pas pris en charge sur .NET Core.

.NET Core implémente ce sous-ensemble (étendu) de fonctionnalités .NET Framework qui sont connues pour être multiplateformes.

Une application demandant et recevant des privilèges élevés n'est pas prise en charge sur de nombreuses plates-formes non Windows. Par conséquent, il n'est pas pris en charge par .NET Core.

(La suppression des privilèges, en revanche, pourrait être prise en charge par davantage de plates-formes)

3
Omair Majid

Dans .NET core, le fichier app.manifest semble actuellement ignoré. Cependant, vous pouvez détecter si vous exécutez en tant qu'administrateur et fournir un message d'erreur à l'utilisateur.

Appelez simplement MainClass.RequireAdministrator() comme première chose dans votre méthode Main. Cela fonctionnera pour donner un message d'erreur sur Windows et Linux si le processus n'a pas été démarré en tant qu'administrateur/root. Vous devrez peut-être ajouter le package NuGet de compatibilité Windows pour qu'il fonctionne sous Windows.

Cela ne force pas l'élévation, mais au moins l'utilisateur obtient une erreur utile lui indiquant comment résoudre le problème.

using System.Runtime.InteropServices;
using System.Security.Principal;

namespace MyNamespace
{
    public static class MainClass
    {
        public static void Main(string[] args)
        {
            RequireAdministrator();
        }

        [DllImport("libc")]
        public static extern uint getuid();

        /// <summary>
        /// Asks for administrator privileges upgrade if the platform supports it, otherwise does nothing
        /// </summary>
        public static void RequireAdministrator()
        {
            string name = System.AppDomain.CurrentDomain.FriendlyName;
            try
            {
                if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
                {
                    using (WindowsIdentity identity = WindowsIdentity.GetCurrent())
                    {
                        WindowsPrincipal principal = new WindowsPrincipal(identity);
                        if (!principal.IsInRole(WindowsBuiltInRole.Administrator))
                        {
                            throw new InvalidOperationException($"Application must be run as administrator. Right click the {name} file and select 'run as administrator'.");
                        }
                    }
                }
                else if (getuid() != 0)
                {
                    throw new InvalidOperationException($"Application must be run as root/Sudo. From terminal, run the executable as 'Sudo {name}'");
                }
            }
            catch (Exception ex)
            {
                throw new ApplicationException("Unable to determine administrator or root status", ex);
            }
        }
    }
}
4
jjxtra

Pour étendre la réponse de jjxtra, si vous utilisez plusieurs plates-formes, sa réponse ne fonctionnera évidemment pas dans les instances non Windows. Je sais ... "pinvoke baaaaad", mais dans ce cas je pense que c'est OK car il n'y a pas d'alternative que je sache.

Donc, pour linux/mac, vous pouvez ajouter ce code dans:

private static class LinuxNative
{
    [DllImport("libc")]
    public static extern uint getuid();
}

var isRoot = LinuxNative.getuid() == 0;
0
Andy

Comme omajid l'a déjà souligné dans un commentaire, il n'y a actuellement aucun moyen de forcer l'élévation. Cependant, vous pouvez toujours exécuter le terminal (Powershell, CMD, etc.) avec des privilèges d'administrateur. Cela exécutera également votre application avec les mêmes privilèges - alias - privilèges d'administrateur. J'en avais besoin pour que HttpListener lui ajoute des préfixes.

0
Johannes J.