2

このような実行可能ファイルは、「sudo mono test.exe」と「mono test.exe」の 2 つの方法で実行できます。

このアプリケーションがアプリケーション自体の内部でルートとして実行されているかどうかを検出する方法を知りたいです。

以下のようにユーザー名を確認して、「root」に等しいかどうかを確認しようとしましたが、

Thread.CurrentPrincipal.Identity.Name

Process.GetCurrentProcess().StartInfo.UserName

AppDomain.CurrentDomain.ApplicationIdentity.FullName

最初の 2 つは常に空の文字列ですが、3 番目は NullReferenceException をスローします。

これが Mono 2.6 で実行可能かどうかアドバイスしてください。

4

1 に答える 1

2

1つの解決策は、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...");
        }
    }
}

これはMono2.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...");
        }
    }
}

申し訳ありませんが、私はモノの専門家ではありません。しかし、どのように到達しても、プロセスのUIDはあなたが知りたいものです。ゼロに等しい場合はルートです。そうでない場合はルートではありません。

于 2010-04-11T05:10:01.773 に答える