使用提升的权限登录桌面应用程序

Dmi*_*nov 5 windows security uac scheduling

任务很普遍,但我对目前为止找到的解决方案并不满意.

程序必须在后台运行,定期扫描系统以查看状态更改,并在某些情况下显示通知弹出窗口给用户.该程序在Windows 7下运行.

有两个细微差别.首先,它需要提升权限(最高级别,以管理员身份运行,Windows中存在大量术语)来扫描一些受保护的系统信息.其次,它必须适用于拥有管理权限的所有用户.

以下是典型解决方案的列表以及它们不适合的原因.

  1. 将桌面应用程序放在Windows Startup文件夹中.不起作用,因为不允许指定提升的权限.默认情况下,应用程序将不会运行.充其量,如果配置文件的兼容性,每次程序运行时屏幕上都会出现UAC弹出请求.
  2. 将文件名放入注册表项HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run.同样的问题.
  3. 将任务添加到Windows计划程序并告诉使用最高运行级别.仅适用于运行任务的单个用户.其他人不会看到窗口.
  4. 写一个Windows服务.该服务可以监视用户登录并在其会话中运行桌面应用程序.没有试过这个,但读它可能,虽然很棘手.此外,服务更难调试.看起来有点矫枉过正.
  5. 编写一个Windows服务,接收来自桌面应用程序的调用,执行管理工作并将结果返回给调用者.桌面应用程序没有特权运行 该解决方案看起来非常奇怪,因为它意味着无意义的包装器服务什么都不做,除了传输请求和响应应该为所有管理任务编写.然后,服务更难调试.

这项任务看起来非常普遍,但解决方案很复杂.我误解了什么吗?有更简单的方法吗?

PS:我已经看到过这个主题具有管理权限的进程在用户登录时运行,但想知道是否有更简单的方法.

UPDATE

我发现使用Windows服务的解决方案对我的任务也不起作用.我需要访问用户的个人证书存储区.服务在一个帐户下运行,需要访问另一个帐户的证书.我还没有找到如何使用.Net加密API进行此操作并猜测由于安全策略而无法实现.我发布了我最终想出的解决方案作为这个问题的答案.

Dmi*_*nov 1

最终,我不得不以一种繁琐的方式来实现这一点。我为每个用户创建一个 Windows 任务计划程序任务。这些任务执行完全相同的操作,但在不同的凭据下同时运行。

该解决方案导致的附加任务是如何在程序设置中添加和删除这些任务。我将其实现如下。任务名称是安装过程中生成的 GUID。在安装过程中,会创建一组注册表项,其中项名称是用户名,项值是用户任务的 GUID。卸载期间,名称存储在注册表中的任务将从计划程序中删除。