実行するには管理者権限が必要なdotnetコンソールアプリケーションがあります。これを行う方法が見つかりません。通常のプロジェクトでは、app.manifestを追加して設定します
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
しかし、これをビルドに埋め込む方法がわかりません。
どうすればよいですか?
これは.NET Coreではサポートされていません。
.NET Coreは、クロスプラットフォームであることがわかっている.NET Framework機能の(拡張)サブセットを実装します。
昇格特権を要求および受信するアプリケーションは、Windows以外の多くのプラットフォームではサポートされていません。したがって、.NET Coreではサポートされていません。
(一方で、特権の削除は、より多くのプラットフォームでサポートされる可能性があります)
.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);
}
}
}
}
Jjxtraの回答を拡張するために、クロスプラットフォームを実行している場合、明らかに彼の回答はWindows以外のインスタンスでは機能しません。私は知っています... "ピンボークバアーアド"ですが、この場合、私が知っている代替手段がないので、大丈夫だと思います。
したがって、linux/macの場合、このコードを次の場所に追加できます。
private static class LinuxNative
{
[DllImport("libc")]
public static extern uint getuid();
}
var isRoot = LinuxNative.getuid() == 0;
Omajidがコメントですでに指摘したように、現在、昇格を強制する方法はありません。ただし、管理者権限でターミナル(Powershell、CMDなど)を実行できる場合があります。これにより、同じ権限(別名-管理者権限)でアプリが実行されます。 HttpListenerがプレフィックスを追加するために必要でした。