Как дать 'Всем' полные права на файл (программно)

Я изменяю старую программу C++ для работы Vista. Это не требует Административных привилегий.

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

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

  1. Усера запускает программу сначала, он создает \ProgramData\MyApp\MyLogFile.txt использование CreateFile()

  2. UserB запускает программу затем, он пытается добавить к 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
6
задан egrunin 17 June 2010 в 08:06
поделиться

4 ответа

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

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

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

ea[0].grfAccessMode = DENY_ACCESS;

на это:

ea[0].grfAccessMode = GRANT_ACCESS;
6
ответ дан 10 December 2019 в 00:33
поделиться

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

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

1
ответ дан 10 December 2019 в 00:33
поделиться

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

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

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

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
2
ответ дан 10 December 2019 в 00:33
поделиться

Вам нужно добавить разрешающее правило для пользователя "Everyone", если вы действительно этого хотите.

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

1
ответ дан 10 December 2019 в 00:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: