如何判断 .NET Core 应用程序是以管理员身份运行 #yyds干货盘点#

Posted My空格IO

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何判断 .NET Core 应用程序是以管理员身份运行 #yyds干货盘点#相关的知识,希望对你有一定的参考价值。

有时候,我们需要知道当前程序是否以管理员身份运行,以便执行一些需要特殊权限的操作。

在github(https://github.com/dotnet/runtime/issues/25118#issuecomment-367407469)上找到了一个解决方案:

//需要引用nuget包Mono.Posix.NETStandard
public static bool IsAdministrator =>
RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ?
new WindowsPrincipal(WindowsIdentity.GetCurrent())
.IsInRole(WindowsBuiltInRole.Administrator) :
Mono.Unix.Native.Syscall.geteuid() == 0;

好了,问题解决,文章写完了。

如何判断




等等!Windows 下的判断很好理解,用户属于 Administrator 角色。但是 linux 下的​​geteuid() == 0​​是什么意思?

euid

linux 系统中每个进程都有2个 ID,分别为用户 ID(uid)和有效用户 ID(euid)。

​root​​​的用户 ID确实是0。 

Console.WriteLine($"UID: Mono.Unix.Native.Syscall.getuid()");
Console.WriteLine($"EUID: Mono.Unix.Native.Syscall.geteuid()");

如何判断

我又换成​demo1​​​用户试了一下,这2个Id也是一样的。

如何判断

那为什么要搞2个Id呢?

setuid

因为linux系统有一个功能:如果一个程序被设置了 setuid 位,那么它无论被哪个用户执行,都会具备 setuid 对应用户的权限,进程的 EUID 也会变成对应用户的 UID。

Demo

我们来试验一下,默认情况下​​demo1​​​用户无法操作​​1.txt​​​,因为文件是由​​root​​用户创建的,如下图:

如何判断

当我们使用​​root​​用户设置了 setuid 位后,可以发现程序的权限起了变化:

如何判断

如何判断

这时我们再次运行程序,发现​​1.txt​​操作成功,而且euid也变成0(​​root​​用户)了。

如何判断

结论

综上,github 上给的解决方案非常完美,如果你要判断当前用户是否​​root​​​,则需要使用​​getuid() == 0​​。

想了解更多内容,请关注我的个人公众号”My IO“

如何判断


以上是关于如何判断 .NET Core 应用程序是以管理员身份运行 #yyds干货盘点#的主要内容,如果未能解决你的问题,请参考以下文章

Dora.Interception, 为.NET Core度身打造的AOP框架[4]:演示几个典型应用

Dora.Interception,为.NET Core度身打造的AOP框架 [3]:多样化拦截器应用方式

Dora.Interception,为.NET Core度身打造的AOP框架 [4]:与依赖注入框架的无缝集成

Dora.Interception,为.NET Core度身打造的AOP框架 [2]:以约定的方式定义拦截器

Dora.Interception,为.NET Core度身打造的AOP框架 [1]:更加简练的编程体验

Dora.Interception,为.NET Core度身打造的AOP框架 [5]:轻松地实现与其他AOP框架的整合