【问题标题】:Determining Write Permissions to the Application Folder确定对应用程序文件夹的写入权限
【发布时间】:2011-05-09 04:51:39
【问题描述】:

我有一个 C# 应用程序,我需要在操作期间将一些输出转储到日志文件。我想让用户选择在哪里找到日志文件,但根据客户端请求,它需要默认为当前应用程序位置,通常是 /Program Files/。

但是,当我在 Win7/Vista 机器上部署我的应用程序时,除非我以管理员身份运行该程序,否则该应用程序不会写入日志文件。同时,它似乎在默默地处理无法写入文件的情况,因为我目前正在处理文件创建和写入过程中抛出的所有异常。

我目前正在尝试检测两者都没有写权限:

A) 通过调用“Directory.GetAccessControl()”和

创建一个 DirectorySecurity 对象

B) 使用“SecurityManager.IsGranted(permissions)”方法检查安全权限,

但是 A 并没有在我期望的时候抛出异常,并且 B 每次都返回 true。

我看过很多与这个主题相关的帖子,但他们都给出了只写到 Application.UserAppDataFolder 或它的一些变体的解决方案。我的客户特别要求默认为当前的应用程序路径,因此我至少需要找到一种方法来在写入日志文件将静默失败时优雅地警告他们。

注意:我当前的代码可以在 Windows XP 上找到(因为没有 UAC,我假设)。基本上我只需要知道为什么我所有的电话都告诉我写文件很好,除非我以管理员身份运行,否则根本不会创建文件。

谢谢!

【问题讨论】:

  • 如果您希望您的应用程序安装在 Program Files 下,您应该真正尝试说服您的客户,在其中写入日志文件是一个非常糟糕的主意。它们确实属于 %AppData%。当然,除非您打算从其他任何地方的文件夹(例如 USB 驱动器)运行您的应用
  • 抱歉投反对票;我昨天胖了,现在改不了了。

标签: c# file permissions uac


【解决方案1】:

您可以强制操作系统以管理员身份运行您的应用。

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

【讨论】:

    【解决方案2】:

    你是否有权限写一个文件的最终测试是打开它来写。 IE。

    try
    {
        File.Open(path, FileMode.OpenOrCreate);
        ...
    }
    catch(SecurityException)
    {
       ... it failed for security reasons
    }
    catch(Exception)
    {
       ... it failed for other reasons
    }
    

    【讨论】:

    • 这个问题是当虚拟化发生时(未显示的应用程序)没有错误或异常。写入成功。它只是不会在 Program Files 下发生,仅此而已。但是你没有什么可以抓住的。
    【解决方案3】:

    除了 Stefan P. 建议将应用程序提升为以管理员身份运行之外,您还可以在安装时修改安装文件夹权限以添加用户组以具有写入权限。然后应用程序也能正常工作。

    移动日志文件位置将是最好的选择。

    【讨论】:

      【解决方案4】:

      Windows Vista 和 7 将文件写入 Program Files 目录就好了。

      嗯,不是真的,但程序认为这很好。实际上,该文件被写入当前用户的 VirtualStore 目录;即在%userprofile%\AppData\Local\VirtualStore\Program Files

      您可以include a manifest file 为您的应用禁用此行为以获得您期望的结果。

      【讨论】:

      • 你说得对。这正是正在发生的事情。感谢您的帮助!
      【解决方案5】:

      您的应用可以通过三种方式运行 - 提升、故意不提升(清单为 asInvoker)或意外不提升(无清单)。提升的应用程序将能够写入程序文件。故意不提升的应用程序将被拒绝访问。意外未提升的应用程序将成功,但该文件将写入其他地方。最后一种情况就是发生在你身上的事情。它并没有默默地失败。你只是不知道文件在哪里。截图见http://www.gregcons.com/KateBlog/FindingFilesYoureSureYouWrote.aspx

      因此,如果用户坚持当前目录,您应该添加一个清单请求asInvoker。然后,您将获得 AccessDenied,他们将看到错误消息。我认为他们想要这个很奇怪。询问他们是否可以通过额外单击找到它们:如果可以,请通过没有清单来让您的应用程序使用虚拟化(我真的不赞成),然后训练他们单击“兼容性文件”按钮。 我的偏好:写在别处并显示到asInvoker。我的第二个选择:坚持当前目录,没有清单,训练他们找到虚拟化文件。我的第三个选择:坚持当前目录,manifest到asInvoker,当日志文件没有写入时用户会看到错误信息,但是日志会丢失。

      【讨论】:

        【解决方案6】:

        我遇到了同样的问题。我有一个要写入的 xml 文件...当我安装应用程序(C sharp)并尝试运行应用程序时,由于写权限而出现异常。当我更改文件权限(授予用户读取权限)时,它工作正常..

        【讨论】:

          猜你喜欢
          • 2011-06-19
          • 1970-01-01
          • 1970-01-01
          • 2011-08-21
          • 2017-07-17
          • 1970-01-01
          • 2012-06-05
          • 1970-01-01
          • 2012-02-04
          相关资源
          最近更新 更多