WinForms / aplicación de consola en Mono, cómo saber que se ejecuta como root

StackOverflow https://stackoverflow.com/questions/2615997

  •  26-09-2019
  •  | 
  •  

Pregunta

Como podemos ejecutar dichos archivos ejecutables de dos maneras, tales como "sudo mono test.exe", y "mono test.exe".

Ahora quiero saber cómo detectar si esta aplicación se está ejecutando como root dentro de la propia aplicación.

He intentado comprobar el nombre de usuario, como a continuación y ver si es igual a "raíz",

Thread.CurrentPrincipal.Identity.Name

Process.GetCurrentProcess (). StartInfo.UserName

AppDomain.CurrentDomain.ApplicationIdentity.FullName

Los dos primeros son cadenas vacías siempre, mientras que la tercera lanza NullReferenceException.

Por favor avise si esto es factible en Mono 2.6.

¿Fue útil?

Solución

Una solución es DllImport libc y utilizar la función getuid(). Si se está ejecutando como root, getuid() devuelve 0; si no, se vuelve otro 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...");
        }
    }
}

Esto funciona bien en Mono 2.6.

EDIT: Tal vez sea mejor para el acceso a través de la getuid() Mono.Unix.Native.Syscall contenedor de clase en el Mono.Posix montaje:

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

Lo siento, no soy mucho de un experto en Mono. Pero sin embargo se llega a ella, UID del proceso no es lo que quiere saber; si es igual a cero, entonces que sea root, de lo contrario no es root.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top