少年击剑更吹箫,剑气箫心一例消。这篇文章主要讲述如何判断 .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?
?是什么意思?euidlinux 系统中每个进程都有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也是一样的。?【如何判断 .NET Core 应用程序是以管理员身份运行 #yyds干货盘点#】
?那为什么要搞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“??
推荐阅读
- 第十五节:SpringBoot使用JPA访问数据库
- 为什么短信链接总是被拦截(应该如何避免拦截?)
- Shell之多线程
- 我笑了!面试加薪题竟然是有关RabbitMQ的
- Python字典查找字符串中的镜像字符
- 20行Python代码(桌面新闻通知程序)
- Python使用OpenCV检测图像的一角
- Python Django管理界面项目示例
- Python Django Google身份验证和从头开始获取邮件