如何判断 .NET Core 应用程序是以管理员身份运行
有時候,我們需要知道當前程序是否以管理員身份運行,以便執行一些需要特殊權限的操作。
在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 应用程序是以管理员身份运行的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .NET 深度指南:Colors
- 下一篇: Windows 11 上大招!正式支持安