2010-04-11 62 views
3

因爲我們可以通過兩種方式執行這些可執行文件,例如「sudo mono test.exe」和「mono test.exe」。Mono上的WinForms/Console應用程序,如何知道它以root身份運行

現在我想知道如何檢測此應用程序是否以應用程序本身內部的root身份運行。

我嘗試檢查用戶名等下面,看看它們是否等於 「根」,

Thread.CurrentPrincipal.Identity.Name

Process.GetCurrentProcess()。StartInfo.UserName

AppDomain.CurrentDomain.ApplicationIdentity.FullName

前兩個是空字符串總是,而第三個拋出NullReferenceException。

請指教這是否適用於Mono 2.6。

回答

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

這在單聲道2.6中正常工作。

編輯:這可能會更好過Mono.Unix.Native.Syscall包裝類訪問getuid()在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就是你想知道的;如果它等於零,那麼你就是根,否則你不是根。

+1

謝謝。我最終選擇使用Mono.Unix.Native.Syscall.getuid(),因爲此程序集也可以在Windows上使用。 – 2010-04-11 06:51:22

相關問題