Intermittent UnauthorizedAccessException在CommonApplicationData中存储配置文件

时间:2011-03-25 14:00:39

标签: c# .net windows

我已经构建了一个在Environment.SpecialFolder.CommonApplicationData下有一个本地配置存储的应用程序。 (该商店是每台机器,因为它反映了与PC配对的无线电设备的配置更改。)我的安装程序在清单中标记为以管理员身份运行,并使用以下例程创建子目录:

private static void CreateAndPermit(SecurityIdentifier securityIdentifier, String path)
{
    DirectoryInfo info = new DirectoryInfo(path);
    if (!info.Exists)
        info.Create();

    DirectorySecurity security = info.GetAccessControl();
    AccessRule rule = new FileSystemAccessRule(securityIdentifier,
            FileSystemRights.Write |
            FileSystemRights.ReadAndExecute |
            FileSystemRights.Modify |
            FileSystemRights.CreateFiles,
            InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit,
            PropagationFlags.InheritOnly,
            AccessControlType.Allow);
    bool modified;
    security.ModifyAccessRule(AccessControlModification.Add, rule, out modified);
    info.SetAccessControl(security);
}

这将创建桌面用户可以使用资源管理器访问的目录,以及我的应用程序可以写入配置数据的位置。我的应用程序代码然后尝试使用以下序列更新配置文件(不是使用File.Replace,因为我已经分解了调试步骤):

    if (File.Exists(filename + ".bak"))
        File.Delete(filename + ".bak");
    if (File.Exists(filename))
        File.Move(filename, filename + ".bak");
    File.Move(tmpfile, filename);

此代码间歇性地(并且从不在我的开发计算机上)抛出System.UnauthorizedAccessException,通常是删除备份文件的步骤。异常资源管理器指示“Everyone”拥有除“特殊权限”之外的所有内容的权限。

我唯一的线索是,一个最终用户在将XP Pro机器从独立登录切换到使用域后遇到了问题。

1 个答案:

答案 0 :(得分:0)

在多任务操作系统上运行代码存在危险,无法保证您打开或使用的文件也不会被其他进程使用。想想搜索索引器,病毒扫描程序,工具栏。或者只是简单地说明用户开始查看文件的另一个过程。包括你的程序的另一个实例。

假设此类程序对.bak文件不感兴趣,则删除.bak文件无效的一种情况是用户保存文件的第二时间。其他一些进程在原始文件上打开句柄的位置。将文件重命名为.bak不会有问题。删除它会。

假设失败,捕获IOException并告诉用户它现在不能正常工作。用户的IT人员知道如何使用SysInternals的Handle实用程序来找出谁锁定了文件。