运行为WinXP设计的应用程序时出现Win7 UAC问题

时间:2010-10-22 15:53:47

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

Application2 是orginally开发的WinXP应用程序。现在我必须在Win7上与用户帐户控制(UAC)竞争。只要用户登录管理员帐户并选择“以管理员身份运行”, Application2 就可以在Win7上正常运行。但是,我正在尝试评估是否可以折射 Application2 ,以便它不需要管理员帐户和“以管理员身份运行”。我还想避免任何需要用户做出选择的对话框。

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

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

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

    数字3和4更难处理,因为 Application1 必须读取C:\Program Files\MyApp\MyData中的文件。 Application1 将不会使用“以管理员身份运行”,我需要进行更多研究,以弄清楚VirtualStore文件夹如何用于弥合 Application2 和<之间的差距EM>应用1

    至于其他方面,我正在试图找出选项:

    1. 请告知我是否/如何在非管理员用户帐户下执行这些操作,而不是“以管理员身份运行”。
    2. 如果不是管理员,是否有任何行动是不可能的,请告诉我。
    3. 请随意指出我在此问题的内容中可能出现的任何技术错误。
    4. 同样,我试图在应用程序运行时避免使用对话框。
    5. * 在这里大声思考:我需要在复制到C:\Program Files\MyApp后删除C:\Program Files\MyApp\MyData,我需要修改存储文件夹路径的注册表项,也许这些步骤可能是在安装过程中完成。


      发现

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

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

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

2 个答案:

答案 0 :(得分:2)

不,你不能在没有升高的情况下做这些事情。 UAC的意思是阻止你这样做,它是让用户知道你即将这样做。 UAC的一个明显而有价值的特性是,在用户不知情的情况下,它无法提供后门来做这些事情。这不是问题,它是一个功能。

你所描述的并不会让我感到需要经常发生的事情。这不应该磨损用户。如果这是一个问题,您可以使用管理员帐户从计划任务运行它。

答案 1 :(得分:1)

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

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

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

远离整个虚拟化的事物并故意尝试使用虚拟商店。它极大地困扰了用户。相反,要非常了解非提升的应用程序无法执行的行为,并调整代码以执行(非常相似的)替换行为,例如使用HKCU而不是HKLM或AppData而不是程序文件。