我们可以通过两种方式执行此类可执行文件,例如“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是否可行。
答案 0 :(得分:2)
一个解决方案是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。