2

因为我们可以通过两种方式执行此类可执行文件,例如“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 上是否可行。

4

1 回答 1

2

一种解决方案是DllImportlibc 并使用该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 中运行良好。

getuid()编辑:通过 Mono.Posix 程序集中的 Mono.Unix.Native.Syscall 包装类访问可能会更好:

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 都是您想知道的;如果它等于 0,那么你就是 root,否则你不是 root。

于 2010-04-11T05:10:01.773 回答