web-dev-qa-db-ja.com

管理者として実行されるdotnetコアアプリ

実行するには管理者権限が必要なdotnetコンソールアプリケーションがあります。これを行う方法が見つかりません。通常のプロジェクトでは、app.manifestを追加して設定します

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

しかし、これをビルドに埋め込む方法がわかりません。

どうすればよいですか?

21
A Jackson

これは.NET Coreではサポートされていません。

.NET Coreは、クロスプラットフォームであることがわかっている.NET Framework機能の(拡張)サブセットを実装します。

昇格特権を要求および受信するアプリケーションは、Windows以外の多くのプラットフォームではサポートされていません。したがって、.NET Coreではサポートされていません。

(一方で、特権の削除は、より多くのプラットフォームでサポートされる可能性があります)

3
Omair Majid

.NETコアでは現在、app.manifestは無視されているようです。ただし、管理者として実行しているかどうかを検出し、ユーザーにエラーメッセージを提供できます。

Mainメソッドで最初にMainClass.RequireAdministrator()を呼び出すだけです。これは、プロセスが管理者/ルートとして開始されなかった場合、WindowsおよびLinuxでエラーメッセージを表示するように機能します。 Windowsで動作するには、Windows互換性のあるNuGetパッケージを追加する必要がある場合があります。

これは強制的に昇格するわけではありませんが、少なくともユーザーは問題の解決方法を説明する有用なエラーを受け取ります。

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

Jjxtraの回答を拡張するために、クロスプラットフォームを実行している場合、明らかに彼の回答はWindows以外のインスタンスでは機能しません。私は知っています... "ピンボークバアーアド"ですが、この場合、私が知っている代替手段がないので、大丈夫だと思います。

したがって、linux/macの場合、このコードを次の場所に追加できます。

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

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

Omajidがコメントですでに指摘したように、現在、昇格を強制する方法はありません。ただし、管理者権限でターミナル(Powershell、CMDなど)を実行できる場合があります。これにより、同じ権限(別名-管理者権限)でアプリが実行されます。 HttpListenerがプレフィックスを追加するために必要でした。

0
Johannes J.