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

发布于 2024-08-28 14:06:43 字数 397 浏览 10 评论 0原文

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

As we can execute such executables in two ways, such as "sudo mono test.exe", and "mono test.exe".

Now I want to know how to detect whether this application is running as root inside the application itself.

I tried to check user name like below and see whether they equal to "root",

Thread.CurrentPrincipal.Identity.Name

Process.GetCurrentProcess().StartInfo.UserName

AppDomain.CurrentDomain.ApplicationIdentity.FullName

The first two are empty strings always, while the third throws NullReferenceException.

Please advise if this is doable on Mono 2.6.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

仲春光 2024-09-04 14:06:43

一种解决方案是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。

One solution is to DllImport libc and use the getuid() function. If you're running as root, getuid() returns 0; if not, it returns some other 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...");
        }
    }
}

This works fine in Mono 2.6.

EDIT: It might be better to access getuid() through the Mono.Unix.Native.Syscall wrapper class in the Mono.Posix assembly:

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...");
        }
    }
}

Sorry, I'm not much of a Mono expert. But however you get to it, the process's UID is what you want to know; if it's equal to zero then you're root, otherwise you're not root.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文