如何检查Win32中使用c++的窗口句柄是否在管理模式下运行

How do I check if the window handle is running in administration mode in Win32 using C++?

本文关键字:窗口句柄 c++ 是否 运行 管理模式 何检查 检查 Win32      更新时间:2023-10-16

我有应用程序的窗口句柄。如何知道应用程序是否以管理员模式运行?

只是一个简单的答案,它基本上会指向一些API调用来阅读。

首先,您需要获得所属进程的ID,然后获得该进程的句柄:

DWORD proc_id = 0U;
DWORD thread_id = GetWindowThreadProcessId(hWnd, &proc_id);
// assuming it all works, open the process
HANDLE hProc = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, proc_id);

PROCESS_QUERY_INFORMATION表示您正在尝试打开具有查询其信息的权限的进程…例如它的令牌等。然后你有几个选项——你使用哪个部分取决于你为什么需要这些信息。

选项1是使用GetSecurityInfo API获取有关进程的安全信息。这将允许您请求诸如进程的所有者(SID)、安全访问信息(SACL/DACL)等信息。我突然想到,像这样:

GetSecurityInfo(hProc, SE_KERNEL_OBJECT, ...);

传入的参数将取决于您想要的信息。请记住,您可能没有权利要求这些信息。

选项2是获得进程令牌,它允许您以不同的方式获得类似的信息。您可以通过调用OpenProcessToken和GetTokenInformation来实现这一点。同样,您传递的参数将取决于您想要这些信息的目的。像这样的东西应该让你开始:

HANDLE hToken;
OpenProcessToken(hProc, TOKEN_READ, &hToken);
GetTokenInformation(hToken, TOKEN_USER, ...); // get the user associated with the token

请注意,我没有尝试过这些,我只是看了看MSDN并做出了有根据的猜测。我也没有进行错误检查……请记住,如果您正在查询进程,那么某些调用可能会失败,因为您没有请求该信息的权限。

您可以使用以下代码,如果User是admin则返回TRUE,否则返回False。

BOOL IsUserAnAdmin() 

更多参考:http://msdn.microsoft.com/en-us/library/windows/desktop/bb776463(v=vs.85).aspx