【发布时间】:2018-11-24 14:23:43
【问题描述】:
我写了一个代码来检查在同一台机器上运行的进程是否具有管理员权限。但它总是返回 false。
你能告诉我它有什么问题吗?
private static bool HasAdminPrivileges(int processId)
{
var hProcess = WinApi.OpenProcess(ProcessAccessFlags.QueryInformation, false, processId);
var opened = WinApi.OpenProcessToken(hProcess, WinApi.TOKEN_QUERY, out IntPtr hToken);
if (opened)
{
var token = new IntPtr(hProcess.ToInt64() + hToken.ToInt64()); // 64 bit machine only
WinApi.CreateWellKnownSid(WELL_KNOWN_SID_TYPE.WinBuiltinAdministratorsSid, IntPtr.Zero, IntPtr.Zero, out uint cbSidUint);
var cbSid = new IntPtr(cbSidUint);
var succeed = WinApi.CheckTokenMembership(token, cbSid, out bool isMember);
return succeed && isMember;
}
return false;
}
public class WinApi
{
public const int TOKEN_QUERY = 0X00000008;
[DllImport("advapi32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool OpenProcessToken(IntPtr ProcessHandle, UInt32 DesiredAccess, out IntPtr TokenHandle);
[DllImport("kernel32.dll", SetLastError = true)]
public static extern IntPtr OpenProcess(ProcessAccessFlags processAccess, bool bInheritHandle, int processId);
[DllImport("advapi32.dll", SetLastError = true)]
public static extern bool CreateWellKnownSid(WELL_KNOWN_SID_TYPE WellKnownSidType, IntPtr DomainSid, IntPtr pSid, out uint cbSid);
[DllImport("advapi32.dll", SetLastError = true)]
public static extern bool CheckTokenMembership(IntPtr TokenHandle, IntPtr SidToCheck, out bool IsMember);
}
public enum ProcessAccessFlags : uint
{
QueryInformation = 0x00000400
}
public enum WELL_KNOWN_SID_TYPE
{
WinBuiltinAdministratorsSid = 26
}
【问题讨论】:
-
错误:1您必须打开具有访问权限
PROCESS_QUERY_LIMITED_INFORMATION而不是PROCESS_QUERY_INFORMATION的进程(如果您不是以管理员身份运行,则会在此处拒绝访问)2CheckTokenMembership仅适用于模拟令牌。但您尝试将主令牌传递给它。 3 您没有创建管理员 sid - 在对CreateWellKnownSid的单次调用中,您没有将指针传递给可以存储此 sid 的内存。 4 你没有关闭打开的句柄。 5你没有检查任何错误 -
6你根本不调试自己的代码
标签: windows winapi process system32 advapi32