一千萬個為什麽

搜索

Mono上的WinForms/Console應用程序,如何知道它以root身份運行

因為我們可以通過兩種方式執行此類可執行文件,例如“sudo mono test.exe”和“mono test.exe”。

現在我想知道如何檢測此應用程序是否在應用程序本身內以root身份運行。

我試著查看下面的用戶名,看看它們是否等於“root”,

Thread.CurrentPrincipal.Identity.Name

Process.GetCurrentProcess()。StartInfo.UserName

AppDomain.CurrentDomain.ApplicationIdentity.FullName

前兩個總是空字符串,而第三個拋出NullReferenceException。

請告知Mono 2.6是否可行。

最佳答案

一種解決方案是 DllImport libc並使用 getuid()函數。如果您以root身份運行, getuid()將返回0;如果沒有,它返回一些其他UID:

using System.Runtime.InteropServices;

public class Program
{
    [DllImport ("libc")]
    public static extern uint getuid ();

    public static void Main()
    {
        if (getuid() == 0) {
            System.Console.WriteLine("I'm running as root!");
        } else {
            System.Console.WriteLine("Not root...");
        }
    }
}

這在Mono 2.6中運行良好。

編輯:通過Mono.Posix程序集中的Mono.Unix.Native.Syscall包裝類訪問 getuid()可能更好:

using Mono.Unix.Native;

public class Program
{
    public static void Main()
    {
        if (Syscall.getuid() == 0) {
            System.Console.WriteLine("I'm running as root!");
        } else {
            System.Console.WriteLine("Not root...");
        }
    }
}

對不起,我不是Mono專家。但是無論如何,這個過程的UID就是你想知道的;如果它等於零那麽你就是root,否則你就不是root。

轉載註明原文: Mono上的WinForms/Console應用程序,如何知道它以root身份運行