本文介绍了检测是否以“以管理员身份运行"启动了另一个进程.的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我们的应用程序需要通过COM接口与另一个程序进行通信.如果其他程序以以管理员身份运行"启动,则该界面将不起作用.想要检测此其他进程是否处于此状态并警告用户.有任何想法吗?
Our application needs to communicate with another program through a COM interface. The interface will not work if the other program is started with "Run as Administrator". Would like to detect if this other process is in this state and warn the user. Any ideas?
寻找.NET语言(C#或VB.NET).
Looking for .NET languages (C# or VB.NET).
TIA
推荐答案
您可以尝试执行以下操作:
You can try something like this:
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");
}
}
}
这也可能是一件好事: Windows操作系统中的知名安全标识符
This could also be a good thing to have: Well-known security identifiers in Windows operating systems
那应该是一个不错的起点:-)
That should be a good start point :-)
这篇关于检测是否以“以管理员身份运行"启动了另一个进程.的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!