文件夹权限:所有用户被授予完全控制权限。

5

我正在开发一个应用程序,它将一些文件存储在 CommonApplicationData 文件夹中。我的应用程序需要修改这些文件。我成功创建了一个自定义操作来授予 CommonApplicationData 文件夹中我的应用程序文件夹的 fullcontrol 权限。但是,这并没有解决非管理员用户的问题。当我以用户身份登录并尝试修改其中一个文件时,会收到“拒绝访问”的消息。
我该如何解决这个问题?谢谢。
以下是我在自定义操作中使用的代码:

public void GetUsers()
        {
            SelectQuery sQuery = new SelectQuery("Win32_UserAccount", "Domain='" + System.Environment.UserDomainName.ToString() + "'");
            try
            {
                ManagementObjectSearcher mSearcher = new ManagementObjectSearcher(sQuery);
                foreach (ManagementObject mObject in mSearcher.Get())
                {
                    Permission(mObject["Name"].ToString());
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }
        private void Permission(string user)
        {
            string directory = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData);
            string CompanyFolderPath = Path.Combine(directory, "naseelco\\lms2004");
            DirectoryInfo myDirectoryInfo = new DirectoryInfo(CompanyFolderPath);
            DirectorySecurity myDirectorySecurity = myDirectoryInfo.GetAccessControl();
            string User = System.Environment.UserDomainName + "\\" + user;
            myDirectorySecurity.AddAccessRule(new FileSystemAccessRule(User, FileSystemRights.FullControl, AccessControlType.Allow));
            myDirectoryInfo.SetAccessControl(myDirectorySecurity);
        }

编辑:
对于那些想要解决这个问题的人: 不是给父文件夹授予权限,而是为该文件夹中的每个用户单独授予各自的访问权限。上面代码中的Permission方法已经被修改如下:

private void Permission(string user)
{
  string directory = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData);
  string filePath = Path.Combine(directory, "naseelco\\lms2004\\fms.txt");
  FileSecurity fSecurity = File.GetAccessControl(filePath);
  FileSystemAccessRule rule = new FileSystemAccessRule(user, FileSystemRights.FullControl, AccessControlType.Allow);
  fSecurity.SetAccessRule(rule);
  File.SetAccessControl(filePath, fSecurity);
}

1
@David Heffernan:像什么?我正在使用CommonApplicationData中的子文件夹。 - FadelMS
@FadelMS:我之前也遇到过这个问题。+1 用户应用数据文件夹是非管理员用户拥有权限的,但这些位置不重叠,因此您无法存储全局数据。我希望您在找到解决方案时发布它。您可能需要使用注册表或程序文件位置。 - user153923
2
“CommonApplicationData”是所有用户的相同文件夹;然而,正如FadelMS所发现的那样,不是所有用户都可以访问它。 - user153923
你可以在Vista上使用FOLDERID_Public - David Heffernan
我认为你可以在这里找到解决方案:https://dev59.com/hWox5IYBdhLWcg3w1Xo3。 - Massimo
显示剩余2条评论
1个回答

6
一个好的解决方案是使用 xcacls.exe 或任何其他 ACL 工具将完全控制权限授予 Everyone。这个工具可以作为你的安装项目中的自定义操作加入。
不建议对每个用户授予权限,因为未来的账户将无法涵盖。此外,通过自定义代码进行此操作并不总是有效的。当涉及到通过代码控制 Windows 权限时,情况有些棘手。

1
或者用户组,另外还有已验证的用户;后者不包括访客。 - Alexey Ivanov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接