2011-03-29 82 views
1

我們的應用程序需要通過COM接口與另一個程序進行通信。如果其他程序以「以管理員身份運行」啓動,該界面將不起作用。想要檢測這個其他進程是否處於這種狀態並警告用戶。有任何想法嗎?檢測另一個進程是否以「以管理員身份運行」啓動

尋找.NET語言(C#或VB.NET)。

TIA

+1

您的問題似乎是爲什麼COM不跨越在不同級別運行的應用程序之間的橋樑,而不是如何檢測它。你有沒有妥善保護COM通道? – 2011-03-29 22:16:26

+0

COM使得無法發現哪個進程託管服務器。非常多的設計,它允許所有類型的託管技巧。你必須使用你對這個過程的祕密知識。 – 2011-03-29 22:46:49

回答

1

你可以嘗試這樣的事情:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Runtime.InteropServices; 
using System.Diagnostics; 
using System.Security.Principal; 
using System.Reflection; 

namespace WindowsFormsApplication2 
{ 

    public class ProcessHelper 
    { 
     [DllImport("advapi32.dll", SetLastError = true)] 
     private static extern bool OpenProcessToken(IntPtr ProcessHandle, UInt32 DesiredAccess, out IntPtr TokenHandle); 

     [DllImport("kernel32.dll", SetLastError = true)] 
     private static extern bool CloseHandle(IntPtr hObject); 

     private const int STANDARD_RIGHTS_REQUIRED  = 0xF0000; 
     private const int TOKEN_ASSIGN_PRIMARY   =0x1; 
     private const int TOKEN_DUPLICATE     = 0x2; 
     private const int TOKEN_IMPERSONATE    = 0x4; 
     private const int TOKEN_QUERY      = 0x8; 
     private const int TOKEN_QUERY_SOURCE    = 0x10; 
     private const int TOKEN_ADJUST_GROUPS   = 0x40; 
     private const int TOKEN_ADJUST_PRIVILEGES  = 0x20; 
     private const int TOKEN_ADJUST_SESSIONID   = 0x100; 
     private const int TOKEN_ADJUST_DEFAULT   = 0x80; 
     private const int TOKEN_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED | TOKEN_ASSIGN_PRIMARY | TOKEN_DUPLICATE | TOKEN_IMPERSONATE | TOKEN_QUERY | TOKEN_QUERY_SOURCE | TOKEN_ADJUST_PRIVILEGES | TOKEN_ADJUST_GROUPS | TOKEN_ADJUST_SESSIONID | TOKEN_ADJUST_DEFAULT); 

     public static bool IsProcessOwnerAdmin(string processName) 
     { 
      Process proc = Process.GetProcessesByName(processName)[0]; 

      IntPtr ph = IntPtr.Zero; 

      OpenProcessToken(proc.Handle, TOKEN_ALL_ACCESS, out ph); 

      WindowsIdentity iden = new WindowsIdentity(ph); 

      bool result = false; 

      foreach (IdentityReference role in iden.Groups) 
      { 
       if (role.IsValidTargetType(typeof(SecurityIdentifier))) 
       { 
        SecurityIdentifier sid = role as SecurityIdentifier; 

        if (sid.IsWellKnown(WellKnownSidType.AccountAdministratorSid) || sid.IsWellKnown(WellKnownSidType.BuiltinAdministratorsSid)) 
        { 
         result = true; 
         break; 
        } 
       } 
      } 

      CloseHandle(ph); 

      return result; 
     } 
    } 

    static class Program 
    { 
     [STAThread] 
     static void Main() 
     { 
      bool isAdmin = ProcessHelper.IsProcessOwnerAdmin("outlook"); 
     } 
    } 
} 

這也可能是一個很好的事情有:Well-known security identifiers in Windows operating systems

這應該是一個很好的起點:-)

+0

感謝您的出發點。它通過使用RUN AS來啓動進程時接受。我在OpenProcess令牌上得到拒絕訪問。猜測,因爲它是由內置管理員運行的當前用戶(是管理員用戶)dos沒有權限訪問。我可以破解它,並說當我得到訪問被拒絕時,我知道它正在運行。如果您有任何其他建議,將欣賞更優雅的solutino。 – 2011-03-31 11:57:55

+0

我更改了代碼示例,請嘗試使用此示例。 – HABJAN 2011-03-31 12:05:20

+0

同樣的訪問被拒絕。順便說一句,我添加了私人常量int STANDARD_RIGHTS_REQUIRED = 0x000F0000; – 2011-03-31 12:26:12

相關問題