【问题标题】:Win7 UAC problems when running application designed for WinXP运行为 WinXP 设计的应用程序时出现 Win7 UAC 问题
【发布时间】:2010-10-22 15:53:47
【问题描述】:

Application2 最初是为 WinXP 开发的应用程序。现在我不得不与 Win7 上的用户帐户控制 (UAC) 抗衡。只要用户登录到管理员帐户并选择“以管理员身份运行”,Application2 就可以在 Win7 上正常运行。但是,我正在尝试评估是否可以重构 Application2,使其不需要管理员帐户和“以管理员身份运行”。如果可能的话,我还想避免任何要求用户做出选择的对话框。

Application2 目前需要“以管理员身份运行”的功能

  1. 创建系统数据源 (ODBC)
  2. 读/写/删除注册表项
  3. 复制/删除C:\Program Files\MyApp中的文件
  4. 加密/解密C:\Program Files\MyApp 中的文件
  5. 启动位于远程计算机上共享文件夹中的 .exe 进程
  6. 启动安装 Office 加载项和读取/写入/删除注册表项的 VBScript 进程
  7. 复制/删除/修改C:\Program Files\MyApp\MyData中的文件

可以通过将此文件夹重新定位到我的文档(其位置存储在注册表中*),或授予用户“完全控制”权限C:\Program Files\MyApp\MyData,或让 Win7 在 VirtualStore 中进行必要的修改来解决第 6 个问题文件夹。

数字 3 和 4 更难处理,因为 Application1 必须读取 C:\Program Files\MyApp 中的文件。 Application1 不会使用“以管理员身份运行”,我需要做更多的研究来弄清楚如何使用 VirtualStore 文件夹来弥合 Application2 和 Application1.

至于其他几点,我正在尝试找出选项:

  1. 请告诉我是否/如何可以在非管理员用户帐户下执行这些操作,并且无需“以管理员身份运行”。
  2. 如果没有管理员身份无法执行任何操作,请告诉我。
  3. 请随时指出我在此问题的内容中可能犯的任何技术错误。
  4. 我再次尝试在应用程序运行时避免出现对话框。

*在这里大声思考:复制到C:\My Documents\MyData后我需要删除C:\Program Files\MyApp\MyData,并且我需要修改存储文件夹路径的注册表项,也许这些步骤可以在安装过程中完成。


发现

在 Windows 7 上,即使 没有“以管理员身份运行”,您也可以:

  1. 创建/删除用户数据源
  2. C:\Users\Public\DocumentsC:\Users\currentuser\Documents 中创建/修改/删除文件
  3. HKEY_CURRENT_USER 中创建/删除注册表项

此外,我认为没有 UAC 应用程序清单文件的 Windows 7 应用程序是危险的。因为,如果您没有,Windows 7 会为您决定是否在兼容模式下运行该应用程序。如果您有,可以指定您的应用程序需要如何运行。

【问题讨论】:

    标签: c# windows-7 .net-2.0 uac


    【解决方案1】:

    不,你不能在没有得到提升的情况下做这些事情。 UAC 的意义在于不是阻止你这样做,它是让用户知道你将要这样做。 UAC 的一个明显且有价值的特性是,它不会在用户不知道的情况下提供后门来执行这些操作。这不是问题,这是一项功能。

    你所描述的事情并没有让我觉得需要经常发生。这不应该使用户疲惫。如果这是一个问题,您可以使用管理员帐户从计划任务中运行它。

    【讨论】:

    • 不幸的是,这确实经常发生。为了清楚起见,您是说用户需要成为管理员并且需要为所有列出的操作启动应用程序“以管理员身份运行”?即便如此,可能会遇到对话框?如果用户不是管理员,是否可以执行这些操作?
    • 好吧,如果你是对的,我想这回答了我的问题。欢迎任何其他信息或建议!
    【解决方案2】:

    最好的办法是更改您的应用程序 - 请注意,只是稍微改变一下 - 以便它将作为非提升用户运行。为了帮助您做到这一点,我必须指出一些微妙之处。

    例如,第 1 点“读取和写入注册表项”过于笼统。非提升的应用程序可以毫无问题地读取和写入注册表项。限制是您不能在 HKLM写入 注册表项。因此,如果您将代码更改为使用 HKCU 下的密钥,或者将部分代码重构为运行提升权限并将密钥写入 HKLM 的 admin/config/setup 应用程序,以及读取这些密钥的普通应用程序,则可以避免 UAC 问题键,但从不写它们。

    第 2 点和第 3 点都是“不能写入 Program Files 下的任何内容”。更改您的代码,以便您需要复制/删除/加密/解密的文件不在 Program Files 下。 AppData 是一个受欢迎的(每个用户)位置。

    远离整个虚拟化,故意尝试使用虚拟存储。它极大地混淆了用户。相反,要深入了解非提升应用程序无法执行的行为,并调整您的代码以执行(非常相似的)替换行为,例如使用 HKCU 代替 HKLM 或使用 AppData 代替 Program Files。

    【讨论】:

    • +1,谢谢。 (1) Application1HKLM 读取,我无法控制,因此 Application2 需要修改 HLKM 也一样。 (2) 同样,Application1Program Files 读取。 (3) 我不打算故意使用 VirtualStore,但它确实会成为非提升和Program Files 等情况下的一个因素。
    猜你喜欢
    • 2011-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-29
    • 2011-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多