5

首先大家好,感谢您多次在这里搜索帮助我或教会了我一些东西。

我已经为我玩的游戏制作了一个自定义 HUD,并且正在使用 C# 开发一个安装程序,灵感来自同一游戏的另一个 HUD。它将所有脚本文件下载并覆盖到现有目录:

C:\Program Files (x86)\Steam\steamapps\me\team fortress 2\tf

[不幸的是,我无法控制使用哪个文件夹,因为我正在修改 Valve 安装的文件]

为了删除文件夹、添加文件夹或复制文件,我不得不在每次启动 exe 时使用应用清单来增加用户权限:

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

不知何故,我受到启发的安装程序正在安装到与我相同的文件夹中,而无需强制 UAC 提示。

他的应用程序只显示一个安全警告,但如果我取消选中“始终检查”复选框,我可以一遍又一遍地运行它,而无需验证任何特殊权限:

http://www.trishtech.com/img_art_a/win7_publisher_not_verified_0.jpg>">

关于如何使我的应用程序像他的一样无缝的任何建议?我已经联系了另一个应用程序的作者,他说他也在使用 C#,但不知道他正在做什么特别的工作来完成这项工作。

编辑:我知道我们正在做一些不同的事情,以防万一他们以某种方式有所作为:

  • 我正在使用文件浏览器来决定将文件放在哪里,因此可以从任何地方运行该应用程序。
    • 他只是将它们输出到与exe相同的目录,要求将exe放在目标文件夹中。
  • 我正在使用 ILMerge 将 SharpZipLib 与我的应用程序捆绑在一起。
    • 他只是将 dll 留在了 exe 旁边的 zip 文件中。
4

3 回答 3

3

如果您尝试写入“C:\Program Files (x86)”,那么您需要管理员权限。因此,其他应用程序不得在此处创建文件,而是在不受 UAC 保护的目录中创建文件。

如果您的文件是每个用户的,那么您可以在 appdata 文件夹中创建一个子文件夹并将文件保存在那里。

约定是创建一个文件夹来标识公司,另一个文件夹来标识产品,

例如

var dir = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) 
          +    "\\MyCompanyName\\MyApplicationName";
于 2012-09-04T20:38:38.747 回答
2

他只是将它们输出到与exe相同的目录,要求将exe放在目标文件夹中。

我不认为会是这样。同一个exe目录应该没有什么不同,你要么有权限,要么没有。

“正常”响应是,写入您有权访问的目录。但这并不总是可能的。

如果您将应用程序作为服务运行,它只会在我认为的 Windows 下弹出一次,但这似乎不适合您的用例。

我认为不会有任何适当的方法来压制这样的消息,就像第 22 条问题一样。要做一些你不能做的事情,你需要获得许可(所以提升用户 - > UAC弹出窗口)。

于 2012-09-04T20:57:53.083 回答
0

我将 sgmoore 的答案标记为正确的答案,尽管我自己的案例似乎有点陌生,我也想记录下来。

我已经将我的程序简化为基础,并做了很多实验。我发现出于某种原因,他和我实际上可以将文件复制并在该目录中创建文件夹。也许它是 steamapps 文件夹的特殊之处,或者它只是一个错误,使它在这种有限的情况下实际工作,而它通常不应该用于“真实”程序。

奇怪的是,实际上需要 UAC 提示符的是从我的项目最初生成它的 \Bin\Debug\ 文件夹中运行 exe。如果我将我的 exe 移到其他地方然后运行它,它工作正常。如果我从我的 \Bin\Debug\ 文件夹中运行他的 exe,他也不起作用。我一直无法弄清楚为什么会这样。

我注意到的另一件事是,当我的应用程序将毫无例外地成功时,当我启动它时它不会提示安全警告。它只是默默地打开然后工作。任何时候它确实显示安全警告,它都会失败。

我猜协议会将这两个问题变成新问题,但目前看来它可能已经进入了边缘案例/黑客领域,因为你们所有人都同意这甚至根本不应该工作。

我将重新构建我的程序,看看在这些奇怪的情况下我是否仍然可以让它发挥全部功能,或者我是否必须重新启用 UAC 提升。

于 2012-09-05T18:39:02.203 回答