如何创建任务计划程序任务以通过C ++启动时作为管理员运行(或创建更好的OpenProcess调用)

时间:2016-10-21 05:19:34

标签: c++ windows qt uac

我有一个程序可以收集有关在Windows系统上运行进程的信息。它使用OpenProcess打开它迭代的进程,以查看正在运行的进程。它仅在用户同意的情况下执行此操作,并在启动时通知他们。我想收集标题栏文本和正在运行的.exe文件。但是,某些进程受到保护。 Win10为DRM引入了这样的过程。如果我无法收集有关此类流程的信息,那将不会是世界末日,但它会很好。但是,只有在我的应用程序以admin身份运行时才能打开其他进程;我希望能够收集他们的信息。奇怪的是,我感兴趣的其中一个应用程序没有以管理员身份运行(它在Win7上);所以可能有一个更好的使用呼吁,而不提升我的编程管理员,但我不知道它是什么。我注意到任务管理器能够在没有UAC提示的情况下收集此类信息;所以一定是可能的。

我只是创建一个以管理员身份运行的快捷方式,但是我宁愿让用户不必在每次启动时都响应UAC提升提示。我可以使用任务计划程序执行此操作,并选中“以最高权限运行”属性,但我希望仅在用户选择时才创建任务。我在C ++下使用Qt框架,但win32风格的调用工作正常。出于实际目的,我将在非托管C ++中进行(即#include“windows.h”)。我看到了如何在C ++下创建任务的示例,例如Weekly Trigger Example (C++)C/C++ Code Example: Creating a Task Using NewWorkItem;但这留下了很多未回答的问题:

  1. 我为“以最高权限运行”设置了什么属性?
  2. 我为“登录时运行”设置了什么属性?
  3. 我猜想当我的prog安排任务时,用户只会看到一个UAC提示;但不是在开机。是这样的,还是我需要让我的程序启动一个提升程序(使用UAC提示)来安排任务?
  4. (当然,我不认为非管理员可以在没有管理员密码的情况下使用我的编程创建此类任务。)

    注意:在WinXP中不会发生此问题,但在Win7中会发生此问题。因此,我希望该解决方案对Vista和更好 - 即使用Task Scheduler 2.0 API;或者一些更好的OpenProcess版本。

    我的代码看起来像

    HWND hWnd;
    
    hWnd = GetForegroundWindow();
    
    DWORD dwProcessID;
    GetWindowThreadProcessId(hWnd, &dwProcessID);
    
    int iProcessID=dwProcessID;
    
    HANDLE h_process;
    HMODULE proc_module;
    DWORD bNeeded;
    WCHAR moduleBuffer[OSDFLONGESTPATH];
    
    h_process = OpenProcess(PROCESS_ALL_ACCESS,
        FALSE, iProcessID);
    

    在某些进程上它失败,除非它以管理员身份运行,即使进程不是管理员也是如此。此代码无法打开它:Taking a Snapshot and Viewing Processes;系统信息也没有运行任务。

    如果用户已经以管理员身份运行,我希望不必指定用户帐户。

0 个答案:

没有答案