Как дать «Все» полные права на файл (программно) - PullRequest
6 голосов
/ 17 июня 2010

Я модифицирую старую программу C ++ для работы в Vista.Не требует прав администратора.

Я изменил код для размещения файлов журнала в \ProgramData\MyApp\.Эти журналы записываются с использованием функций stdio (fopen, fprintf, fclose).

Вот проблема:

  1. Пользователь A запускает программуво-первых, он создает \ProgramData\MyApp\MyLogFile.txt, используя CreateFile()

  2. Далее пользователь запускает программу, пытается добавить к MyLogFile.txt и получает отказ в доступе.

Я попытался создать ноль SECURITY_DESCRIPTOR и передать его CreateFile().Это создает файл с «не назначенными разрешениями», но кажется, что первый пользователь, который пишет в файл, становится владельцем, а после этого всем остальным пользователям, не являющимся администраторами, не повезло.

Важно, чтобывсе пользователи используют одни и те же файлы журналов, но также важно, чтобы я изменил как можно меньше кода.

Отредактировано, чтобы добавить:

\ProgramData\MyApp создается по стандартуУстановщик Visual Studio.(Я не вижу места для установки безопасности каталогов.) Когда он создает \MyApp, он предоставляет Users следующие разрешения:

Read & execute  
List folder contents
Read
Special permissions

Под Advanced Я вижу, что специальные разрешения включают в себя:

Create files / write data
Create folders / append data
Write attributes
Write extended attributes

Ответы [ 4 ]

6 голосов
/ 17 июня 2010

+ 1 всем за попытку, но в конце концов я нашел ответ здесь:

как изменить ACL-списки с c ++?

Мне пришлось изменить одинлиния этого решения, от этого:

ea[0].grfAccessMode = DENY_ACCESS;

до этого:

ea[0].grfAccessMode = GRANT_ACCESS;
2 голосов
/ 17 июня 2010

Возможно, ваше приложение использует установщик. Когда установщик создаст вашу папку «MyApp», назначьте права на чтение и запись для всех. Это, вероятно, решит вашу проблему. Есть разные способы сделать это, но это зависит от типа используемой установки.

Добавлена ​​информация о пользовательских действиях.

Если после установки папка не имеет необходимых разрешений, вы можете добавить, например, настраиваемое действие в качестве базового сценария Visual в последовательности установки, которое установит необходимые разрешения.

VBS Examble:

    Function SetPermissions()
        Dim strHomeFolder, strHome, strUser
        Dim intRunError, objShell, objFSO

        strHomeFolder = "C:\Test"

        Set objShell = CreateObject("Wscript.Shell")
        Set objFSO = CreateObject("Scripting.FileSystemObject")
        If objFSO.FolderExists(strHomeFolder) Then
            intRunError = objShell.Run("%COMSPEC% /c Echo Y| cacls " _
            & strHomeFolder & " /t /c /g everyone:F ", 2, True)

            If intRunError <> 0 Then
                Wscript.Echo "Error assigning permissions for user " _
                & strUser & " to home folder " & strHomeFolder
            End If
        End If

End Function
1 голос
/ 17 июня 2010

Вы должны обязательно использовать CreateFile . Подробнее о безопасности и правах доступа . Я уверен, что функции из стандартной библиотеки C используют CreateFile (она не может использовать ничего другого в Windows), но с параметрами безопасности по умолчанию, которые не помогают в вашем случае.

Я также пытался заглянуть внутрь SECURITY_ATTRIBUTES и SECURITY_DESCRIPTOR структур, но не очень легко понять, как это сделать, хотя это может быть шанс.

1 голос
/ 17 июня 2010

Вам необходимо добавить правило разрешения для пользователя «Все», если это то, что вы действительно хотите.

Пустой дескриптор будет ссылаться на безопасность каталога, если память служит ...

...