【问题标题】:Check if user has write permission in "Program Files"检查用户是否在“程序文件”中具有写入权限
【发布时间】:2011-03-10 14:29:22
【问题描述】:

我需要检查当前用户在Program Files文件夹内是否有写权限。
主要问题发生在 Vista/7 中 - 如果我只是尝试在此位置创建一个临时文件,我会得到一个异常,即使用户可以使用 Windows 资源管理器执行这样的操作(在允许 UAC 提升之后)。听起来很合理,因为进程本身没有以管理员权限运行。
然后我尝试使用this 解决方案,但我总是返回“true”,即使我尝试使用标准(非管理员)用户运行它。

我最终希望能够回答的是,如果用户尝试在 Program Files 中创建目录,他是否需要提供管理员凭据,或者只需单击 UAC 中的“继续”够了吗?
我正在寻找一种方法来回答这个问题,而无需自己提出(任何类型的)UAC 弹出窗口。有没有相对简单的方法来做到这一点?

更新

感谢您让我使用 UserData 文件夹,但我只需要知道用户是否在该文件夹中具有写入权限,以便我可以决定是否应该尝试执行自动更新(运行 msi) ,或不。

【问题讨论】:

    标签: c# windows permissions file-permissions


    【解决方案1】:

    更好的解决方案是将应用程序数据存储在您应该存储的位置:

    Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
    

    【讨论】:

      【解决方案2】:

      遵守规则会更好。请注意,并非所有用户都可以通过 UAC 提升权限。你可以尝试写作,它可能似乎成功,但使用 Vista/Win7 将你的写作“虚拟化”到其他地方。

      既然你标记了这个 C# 和 Windows,那么看看

      string dataPath = 
         Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
      

      【讨论】:

        【解决方案3】:

        ProgramFiles 位置在未经用户同意的情况下不允许写入访问是有充分理由的。你必须要么

        1. 始终提升运行您的应用程序(每次启动时征求用户同意),或
        2. 使用服务进行自动更新
        3. 将更新下载到用户的临时文件夹,然后使用提升运行更新

        选项 1 和 2 有严重的缺点,所以我建议选择选项 3。其他应用程序也使用这种方式(例如 FireFox)。

        【讨论】:

        • 更新自然会以提升的权限运行。我不希望用户在没有事先确认的情况下安装 msi。我想要做的就是提前知道用户是否在“程序文件”中具有写权限。我需要这些知识,以便我可以做出明智的决定是否要使用我的自动更新功能。再澄清一次 - 在 msi 运行期间是否会要求用户提供管理员凭据,还是只需要单击“继续”?
        • 这取决于用户是否是管理员。测试 Program Files 的写权限不是检查这个的方法;相反,您应该检查用户是否是管理员组的成员。
        • 组权限可能会改变(用户可以在“Administrators”组中,该组对计算机没有任何特殊权限),或者不在该组中,但授予文件夹的特定权限(甚至在另一个拥有此类权限的“Foo”组中)。我想 %100 确保用户可以写入“程序文件”。有可能吗?
        • 如果你真的想这样做,唯一的方法是 AccessCheck (msdn.microsoft.com/en-us/library/aa374815.aspx),但使用起来有点痛苦。我不确定是否有 .NET 等价物。
        猜你喜欢
        • 2016-04-23
        • 2011-05-12
        • 1970-01-01
        • 2014-03-27
        • 2011-06-23
        • 2015-05-28
        • 2011-04-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多