【问题标题】:How do I check if the window handle is running in administration mode in Win32 using C++? [duplicate]如何使用 C++ 检查窗口句柄是否在 Win32 中以管理模式运行? [复制]
【发布时间】:2014-07-30 23:20:09
【问题描述】:

我有应用程序的窗口句柄。如何查看应用程序是否在管理员模式下运行?

【问题讨论】:

标签: c++ windows winapi


【解决方案1】:

只是一个简单的答案,它基本上会指向一些 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是获取Process Token,它可以让你以不同的方式获取相似的信息。您可以通过调用OpenProcessToken 然后调用GetTokenInformation 来执行此操作。同样,您传递的参数将取决于您想要信息的目的。这样的事情应该让你开始:

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

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

【讨论】:

  • 你查询的是进程,为什么不查询线程呢?单个线程可以冒充管理员,而无需提升整个流程的整体性。
  • 是的,一个线程可以有不同的凭据,但是 OP 询问了应用程序,所以我选择了 Process。同样,它有点取决于为什么 OP 需要知道采取哪种方法。没有这些信息,我的答案就很模糊:)
【解决方案2】:

您可以使用以下代码,如果用户是管理员则返回 TRUE,否则返回 False。

BOOL IsUserAnAdmin() 

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

【讨论】:

  • 这需要代码在拥有窗口句柄的进程中运行
猜你喜欢
  • 1970-01-01
  • 2014-09-13
  • 2010-09-05
  • 1970-01-01
  • 1970-01-01
  • 2020-07-31
  • 2021-08-21
  • 2021-03-08
  • 1970-01-01
相关资源
最近更新 更多