WinForms / Консольное приложение на Mono, как узнать, что оно запускается от имени пользователя root - PullRequest
3 голосов
/ 11 апреля 2010

Поскольку мы можем выполнять такие исполняемые файлы двумя способами, такими как «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.

1 Ответ

2 голосов
/ 11 апреля 2010

Одним из решений является 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.

РЕДАКТИРОВАТЬ: может быть лучше получить доступ к getuid() через класс-оболочку Mono.Unix.Native.Syscall в сборке Mono.Posix:

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 процесса - это то, что вы хотите знать; если он равен нулю, то вы root, иначе вы не root.

...