Права доступа к папке: Полный доступ предоставляется всем пользователям. - PullRequest
5 голосов
/ 25 октября 2011

Я работаю над приложением, которое хранит некоторые файлы в папке CommonApplicationData. Мое приложение должно изменить эти файлы. Мне удалось создать настраиваемое действие, чтобы предоставить права fullcontrol для папки моего приложения в папке CommonApplicationData. Но это не решило проблему для пользователей без прав администратора. Когда я вхожу в систему как пользователь и пытаюсь изменить один из этих файлов, я получаю сообщение «Отказано в доступе».
Как я могу решить эту проблему? Спасибо.
Вот код, который я использовал в пользовательском действии:

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);
        }

EDIT:
Для тех, кто хотел бы узнать решение этой проблемы: Вместо предоставления прав доступа родительской папке отдельным файлам в этой папке предоставляются права доступа для каждого пользователя. Метод 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 Ответ

6 голосов
/ 25 октября 2011

Хорошим решением является предоставление полного контроля Каждому с использованием xcacls.exe или любого другого инструмента ACL. Этот инструмент можно добавить в качестве настраиваемого действия в вашем проекте установки.

Предоставление привилегий каждому пользователю не рекомендуется, поскольку будущие учетные записи не будут покрываться. Кроме того, выполнение этого с помощью пользовательского кода не всегда работает. Разрешения Windows немного сложны, когда дело доходит до управления ими с помощью кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...