我有一个需要管理员权限才能运行的dotnet控制台应用程序。我找不到怎么做。在常规项目中,我将添加app.manifest并设置
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
但我无法想象如何在构建中嵌入它。
我该怎么做?
答案 0 :(得分:8)
将<ApplicationManifest>app.manifest</ApplicationManifest>
添加到您的csproj
文件中。
MyProject.csproj
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp3.1</TargetFramework>
<ApplicationManifest>app.manifest</ApplicationManifest>
</PropertyGroup>
</Project>
将以下app.manifest
文件添加到您的项目中。
app.manifest
<?xml version="1.0" encoding="utf-8"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
<assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
</requestedPrivileges>
</security>
</trustInfo>
</assembly>
答案 1 :(得分:6)
我发现最简单的解决方法是添加 app.manifest 文件,其设置类似于网络框架应用程序中的设置
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
然后在您的网络核心项目文件(C#项目中为.csproj)上添加以下内容:
<PropertyGroup>
<ApplicationManifest>app.manifest</ApplicationManifest>
</PropertyGroup>
*在控制台和WPF netcore 3.0中工作
答案 2 :(得分:3)
.NET Core不支持此功能。
.NET Core实现了.NET Framework功能的(扩展)子集,这些功能已知是跨平台的。
许多非Windows平台不支持请求和接收提升权限的应用程序。因此,.NET Core不支持它。
(另一方面,删除权限可能会受到更多平台的支持)
答案 3 :(得分:2)
在.NET核心中,当前app.manifest似乎已被忽略。但是,您可以检测您是否正在以管理员身份运行,并向用户提供错误消息。
在Main方法中首先调用MainClass.RequireAdministrator()
作为第一件事。如果该进程不是以管理员/超级用户身份启动的,这将在Windows和Linux上给出错误消息。您可能需要添加Windows兼容性NuGet软件包才能在Windows上运行。
这不会强制抬高,但至少用户会得到一个有用的错误,告诉他们如何解决问题。
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()
{
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");
}
}
}
else if (getuid() != 0)
{
throw new InvalidOperationException("Application must be run as root");
}
}
catch (Exception ex)
{
throw new ApplicationException("Unable to determine administrator or root status", ex);
}
}
}
}
答案 4 :(得分:0)
正如奥马吉德在评论中已经指出的那样,目前无法强制提升。 但是,您仍然可以使用管理员权限运行终端(Powershell,CMD等)。这也将使用相同的权限运行您的应用程序 - 也就是 - 管理员权限。我需要为HttpListener添加前缀。
答案 5 :(得分:0)
要扩展jjxtra的答案,如果您正在运行跨平台,则显然他的答案在非Windows实例中将不起作用。我知道...“ pinvoke baaaaad”,但在这种情况下,我认为还可以,因为我没有其他选择。
因此,对于linux / mac,您可以在以下位置添加以下代码:
private static class LinuxNative
{
[DllImport("libc")]
public static extern uint getuid();
}
var isRoot = LinuxNative.getuid() == 0;