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

时间:2011-05-17 14:42:52

标签: windows security scheduling uac

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

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

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

以下列出了典型的解决方案以及它们不合适的原因。

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

    PS:我已经看过这个话题Process with administrative privileges run on user logon,但想知道是否有更简单的方法。

    更新

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

4 个答案:

答案 0 :(得分:2)

您需要一项服务来执行“脏工作”(即需要管理员权限的地方)。添加一个与用户交互的应用程序。

服务不难调试 - 只需连接到Visual Studio中正在运行的进程。

答案 1 :(得分:2)

根据您要完成的操作,您可以使用众所周知的安全错误绕过UAC来运行提升的代码。我不建议将其用于任何类型的商业用途,但在快速和脏的情况下,它可能只是票。

http://www.pretentiousname.com/misc/win7_uac_whitelist2.html

答案 2 :(得分:1)

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

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

答案 3 :(得分:-1)

只需使用Winaero的Elevated Shortcut并将快捷方式放在启动文件夹或组策略的登录脚本中。

相关问题