【问题标题】:Cannot modify file under "All Users" folder in windows 7 using C# programming无法使用 C# 编程在 Windows 7 中修改“所有用户”文件夹下的文件
【发布时间】:2011-12-05 05:42:33
【问题描述】:

这是我的场景,

我有一个 Outlook 插件,我正在通过这个插件将一些信息写入一个公共文件。当我创建一个可安装文件时,我将通用文件保存在“所有用户”(通用应用程序数据文件夹)文件夹下。当我在 XP 上安装这个插件时,它工作得非常好,没有权限问题。

现在,当我将此应用程序移至 Windows 7 时,我遇到了一些文件访问权限异常。参考一些博客,我在“所有用户”下添加了特定于应用程序的文件夹。在此之后我也无法写入此文件。

还有什么我需要做的,我才能写入这个文件。

我已经阅读了一些关于 UAC 的博客,但是,我并没有清楚地了解它在 Add-in 中的用途。

【问题讨论】:

    标签: c# windows-7 file-manipulation


    【解决方案1】:

    默认情况下,标准用户没有通用应用数据文件夹的写入权限。如果您希望允许您的用户在那里写入,您应该创建一个子文件夹并应用适当的 ACL。在安装过程中执行此操作,因为此时您有足够的权限来创建 ACL。

    另一种选择是按用户存储这些设置,从而避免安全问题。

    【讨论】:

    • 感谢您的回复。我已经在“通用应用程序数据文件夹”下创建了特定于应用程序的子文件夹,但是我不知道安装 ACL。有什么具体的参考资料,我可以通过它来解决这种情况吗?
    • 您的设置工具将能够应用安全设置,即 ACL。
    • 我已经检查过了,但是我无法得到这些。我正在使用 VSTO 2010。如果有详细说明,我将不胜感激。
    • 您使用什么工具来创建安装程序?
    • 我正在使用 Visual Studio 的设置项目模板?
    【解决方案2】:

    为了向文件添加特定权限,我使用了我为此创建的辅助扩展函数:(您需要正确的权限才能在文件上执行此操作)

    public static void AddAccessEveryone(this FileInfo file, FileSystemRights rights, AccessControlType accessType)
    {
        FileSecurity access = file.GetAccessControl();
        SecurityIdentifier everyone = new SecurityIdentifier(WellKnownSidType.WorldSid, null);
        access.AddAccessRule(new FileSystemAccessRule(everyone, rights, accessType));
        file.SetAccessControl(access);
    }
    

    你这样称呼它:

    file.AddAccessEveryone(FileSystemRights.Read | FileSystemRights.Write, AccessControlType.Allow);
    

    您必须将引用 System.ServiceModel 添加到您的项目中。您还必须在文件创建后调用它,在此之前调用它没有任何好处。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-27
      • 1970-01-01
      相关资源
      最近更新 更多