【问题标题】:Default access rights of files and directories文件和目录的默认访问权限
【发布时间】:2011-04-09 10:22:51
【问题描述】:

我有一个应用程序由具有提升的用户权限的用户(以及通过 UAC 提升提示的管理员)安装在 Vista PC 上。

安装程序将一些文件写入 %APPDATA% 文件夹中的文件夹。

当用户(没有提升的用户权限)运行应用程序时,共享 %APPDATA%(Vista 中的 c:\ProgramData)中的文件(和创建的文件夹)不可访问。

文件由第 3 方组件编写。如果在没有提升用户权限的情况下使用组件,则文件可以访问(和可写)。

我试图更改写入文件的访问权限,但运气不佳。

有没有办法让每个人都可以完全控制文件的默认访问权限?

【问题讨论】:

  • 您是说您为您的应用编写了一个安装程序,并且需要更改它生成的文件的权限?
  • 具有提升权限的用户 - 他们以什么身份登录?他们是否以管理员身份登录以获得提升的权限,然后以自己的身份重新登录以获得普通用户权限?如果是这样,他们正在访问不同的%APPDATA% 位置。
  • 反过来。用户以普通用户身份登录,管理员通过 UAC 提升提示安装应用程序。也许 %APPDATA% 不正确。在 Vista 中是 c:\ProgramData

标签: c# .net uac


【解决方案1】:

我通过使用here 描述的方法创建一个子文件夹 i c:\ProgramData 解决了这个问题

bool modified;
DirectoryInfo directoryInfo = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), "MyFolder");
DirectorySecurity directorySecurity = directoryInfo.GetAccessControl();
FileSystemAccessRule rule = new FileSystemAccessRule(
    securityIdentifier,
    FileSystemRights.Write |
    FileSystemRights.ReadAndExecute |
    FileSystemRights.Modify,
    InheritanceFlags.ContainerInherit |
    InheritanceFlags.ObjectInherit,
    PropagationFlags.InheritOnly,
    AccessControlType.Allow);
directorySecurity.ModifyAccessRule(AccessControlModification.Add, rule, out modified);
directoryInfo.SetAccessControl(directorySecurity);

规则由子文件夹和文件继承。在“MyFolder”中创建的所有文件和文件夹都可以写入用户组。

【讨论】:

    【解决方案2】:

    首先,您确定您的安装程序正在为所有用户设置 AppData,而不仅仅是一个用户?如果安装程序在某个用户的 AppData 文件夹下生成文件夹,那么通常您在系统上拥有多少权限并不重要,除非您是该用户,否则您无法访问该文件夹。

    其次,听起来您的安装程序正在代表执行安装的用户写入文件夹和/或文件,这将是管理员,因此需要提升的权限。有一种方法可以获取和更改文件夹和/或文件的 ACL 权限。也许您正在尝试但不起作用的代码 sn-p 可以帮助我们帮助您。

    【讨论】:

    • 文件夹是共享的appdata(Vista中的c:\ProgramData)。运行安装程序的用户是代表用户通过 UAC 提升的管理员。我希望写入 c:\ProgramData 的文件之后可供用户访问(可写)。用户对 c:\ProgramDat 有写权限,但没有安装程序写入其中的文件。
    猜你喜欢
    • 2013-12-01
    • 2013-06-05
    • 2010-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-25
    • 2017-10-08
    • 2018-10-21
    相关资源
    最近更新 更多