【问题标题】:File permissions across user profiles跨用户配置文件的文件权限
【发布时间】:2011-01-18 09:53:53
【问题描述】:

我正在为 Windows 窗体应用程序使用 ClickOnce 部署,并且我需要基于计算机的配置信息,这些信息在部署和用户配置文件中持续存在。因此,按用户配置没有帮助。我还希望配置文件可以通过文本编辑器在每台机器上众所周知的位置(众所周知,即组织)轻松访问。

我遇到的问题是 ClickOnce 在每次部署时都会覆盖 app.config。我知道 configsource 属性,但据我了解,目标文件必须位于应用程序的路径中 - 这意味着我无法有效地控制位置。

因此,我为要保留的数据创建了一个类,并在我想要的位置对其进行序列化/反序列化。这一切都很好,除了如果文件不存在我正在创建它(使用 XmlSerializer 和 TextWriter)。这里的问题是,在创建应用程序时运行应用程序的用户成为唯一可以访问它的用户。除非我手动向更广泛的 AD 组授予权限,否则后续用户没有权限。即使这样也很好,除了我不想在第一次安装时触摸每台计算机。

那么有没有一种好方法可以在创建文件时以编程方式设置权限,或者我是否应该重新考虑我的设计,因为我错过了有关内置配置功能的一些内容?

编辑:查看 Application.CommonAppDataPath,但它为每个版本的应用程序维护一个文件夹,这意味着每个新部署都重新开始。

【问题讨论】:

    标签: .net winforms configuration configuration-files


    【解决方案1】:

    基于this SO post 我这样做了:

    
    
    

    FileSecurity fileSecurity = File.GetAccessControl(file); fileSecurity.AddAccessRule(new FileSystemAccessRule("Users", FileSystemRights.FullControl, AccessControlType.Allow)); File.SetAccessControl(file, fileSecurity);

    【讨论】:

      【解决方案2】:

      IIRC,您可以在单击一次应用程序中引用所有用户应用程序数据文件夹。

      您所做的是将您的默认配置分发到每个应用程序的正常应用程序数据文件夹,但从不从该文件中读取配置信息。相反,在应用程序启动时,您会在所有用户应用程序数据文件夹中查找配置文件,如果找不到,则将默认文件复制到那里。然后从该位置读取您的配置。

      【讨论】:

      • 谢谢乔尔 - 我没有通过以不同的用户身份运行来完全测试您的解决方案,但我确实将我的文件复制到了所有用户\应用程序数据,然后查看了它的安全设置,它是与我在其他非应用程序数据文件夹中看到的相同。也就是说,创建它的用户拥有完全的控制权,但没有任何明显的东西可以让其他用户控制。也许让其他用户控制已融入应用程序数据?我最终明确授予内置用户组完全控制权。
      • @MarkB - 确保您使用 .net Environment 对象,它是 SpecialFolder 枚举,以确保您以正确的方式前往正确的地方。 All Users 文件夹的性质是,如果权限是从文件夹继承的(它们应该是),那么每个人都应该具有写入权限。第一个用户也将拥有额外的所有权权限,但这不会停止工作。
      • 另外 - 我看到你关于 commonappdata 每次更新都会获得一个新文件夹的注释。这可能比较棘手,但应用数据中应该有一些可供所有版本访问的内容。
      • 我考虑将文件从应用数据中的版本文件夹(即产品名称文件夹)上移一层。继承是一个很好的观点,因此它可能会起作用。不过现在,我将明确设置用户组的权限,因为另一个问题是这家公司已经有将配置文件放在 c:\ 下的特定文件夹中的约定,所以这样我也可以维护他们的标准。
      猜你喜欢
      • 2012-09-04
      • 1970-01-01
      • 2016-03-01
      • 1970-01-01
      • 2019-07-27
      • 2014-01-25
      • 1970-01-01
      • 1970-01-01
      • 2016-07-01
      相关资源
      最近更新 更多