【问题标题】:WinForms/Console application on Mono, how to know it runs as rootMono 上的 WinForms/Console 应用程序,如何知道它以 root 身份运行
【发布时间】:2010-04-11 03:59:06
【问题描述】:

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

【问题讨论】:

    标签: c# mono opensuse


    【解决方案1】:

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

    【讨论】:

    • 谢谢。我最终选择使用 Mono.Unix.Native.Syscall.getuid(),因为这个程序集也可以在 Windows 上使用。
    猜你喜欢
    • 2011-04-20
    • 1970-01-01
    • 1970-01-01
    • 2010-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-12
    相关资源
    最近更新 更多