5

我有 UAC 开发指南所说的“管理选择应用程序”。如果您熟悉这是什么,请跳到下一节。

背景:

我想让“标准”用户能够在我的应用程序的首选项中选择/取消选择“启动时运行”选项。

由于我的应用程序是每台机器(不是每个用户),需要发生的是它需要删除或复制快捷方式文件到开始菜单/程序/启动文件夹中,这将需要管理访问权限才能执行此操作。

所以,我想要的是出现“用户帐户控制凭据提示”,这样如果用户有管理员帐户,他们也可以输入凭据。这显然是应用程序的设计方式,以防止用户在每次需要执行管理操作时都必须切换到另一个帐户。

摘自 MSDN 文档:

行政选择申请

提升的进程或 COM 对象

初始应用程序无需提升即可启动。用户界面中需要管理访问令牌的那些项目都装饰有盾牌图标作为标识。此装饰向用户表明使用该功能需要管理员批准。当应用程序检测到这些按钮之一已被选中时,它有以下两种选择。

  • 应用程序使用 ShellExecute() 启动第二个程序来执行管理任务。第二个程序将被标记为requireAdministrator 的requestedExecutionLevel,从而导致用户被提示批准。第二个程序将使用完整的管理访问令牌运行,并且能够执行所需的任务。-或者-
  • 应用程序使用 CreateElevatedComObject() 启动 COM 对象。此 API 将在获得批准后使用完整的管理访问令牌启动 COM 对象,并且此 COM 对象将能够执行所需的任务。

我只需要复制一个文件......使用 ShellExecute() 分叉一个新进程似乎太过分了,而且我对 COM 的了解还不够,不知道是否可以使用它来复制文件。我希望有人可以发布一些代码,这些代码提供了一种复制文件的方法,并且理想情况下还可以解释如何使用“sheild decorator”来装饰 MenuItem。

笔记:

我查看了microsoft 提供的 UAC Demo,它在多个 StackOverflow 帖子中被引用,例如(Request Windows Vista UAC elevation if path is protected?)关于权限相关的主题。该代码只有一个调用单独进程的示例。

4

2 回答 2

2

尽管它似乎仍然至少涉及重新启动或产生一个进程,但您可以在这里找到一些帮助: CodeProject.com 上的 UAC Shield for Elevation

于 2009-06-30T21:34:26.227 回答
2

我最终走向了不同的方向。我让我的安装程序在 All Users/Startup 文件夹中创建了一个启动快捷方式,该快捷方式将参数传递给应用程序“启动”。

当应用程序启动时,我会检查 arg[0].equals("startup") 是否存在,然后检查 Settings1.Default.RunOnStartup == true。

如果这两个条件都成立,我会立即退出应用程序。当应用程序在没有该参数(即开始菜单程序组)的情况下启动时,应用程序正常加载。

RunOnStartup 设置是用户范围的设置,因此每个用户都可以更改而不影响其他用户。

于 2009-07-30T05:47:31.597 回答