检测另一个进程是否以“以管理员身份运行”启动

问题描述:

我们的应用程序需要通过COM接口与另一个程序进行通信。如果其他程序以“以管理员身份运行”启动,该界面将不起作用。想要检测这个其他进程是否处于这种状态并警告用户。有任何想法吗?检测另一个进程是否以“以管理员身份运行”启动

寻找.NET语言(C#或VB.NET)。

TIA

+1

您的问题似乎是为什么COM不跨越在不同级别运行的应用程序之间的桥梁,而不是如何检测它。你有没有妥善保护COM通道? – 2011-03-29 22:16:26

+0

COM使得无法发现哪个进程托管服务器。非常多的设计,它允许所有类型的托管技巧。你必须使用你对这个过程的秘密知识。 – 2011-03-29 22:46:49

你可以尝试这样的事情:

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