我們的應用程序需要通過COM接口與另一個程序進行通信。如果其他程序以「以管理員身份運行」啓動,該界面將不起作用。想要檢測這個其他進程是否處於這種狀態並警告用戶。有任何想法嗎?檢測另一個進程是否以「以管理員身份運行」啓動
尋找.NET語言(C#或VB.NET)。
TIA
我們的應用程序需要通過COM接口與另一個程序進行通信。如果其他程序以「以管理員身份運行」啓動,該界面將不起作用。想要檢測這個其他進程是否處於這種狀態並警告用戶。有任何想法嗎?檢測另一個進程是否以「以管理員身份運行」啓動
尋找.NET語言(C#或VB.NET)。
TIA
你可以嘗試這樣的事情:
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
這應該是一個很好的起點:-)
感謝您的出發點。它通過使用RUN AS來啓動進程時接受。我在OpenProcess令牌上得到拒絕訪問。猜測,因爲它是由內置管理員運行的當前用戶(是管理員用戶)dos沒有權限訪問。我可以破解它,並說當我得到訪問被拒絕時,我知道它正在運行。如果您有任何其他建議,將欣賞更優雅的solutino。 – 2011-03-31 11:57:55
我更改了代碼示例,請嘗試使用此示例。 – HABJAN 2011-03-31 12:05:20
同樣的訪問被拒絕。順便說一句,我添加了私人常量int STANDARD_RIGHTS_REQUIRED = 0x000F0000; – 2011-03-31 12:26:12
您的問題似乎是爲什麼COM不跨越在不同級別運行的應用程序之間的橋樑,而不是如何檢測它。你有沒有妥善保護COM通道? – 2011-03-29 22:16:26
COM使得無法發現哪個進程託管服務器。非常多的設計,它允許所有類型的託管技巧。你必須使用你對這個過程的祕密知識。 – 2011-03-29 22:46:49