WinForms / aplicación de consola en Mono, cómo saber que se ejecuta como root
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.
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.