Я изменяю старую программу C++ для работы Vista. Это не требует Административных привилегий.
Я изменил код, чтобы вставить файлы журнала \ProgramData\MyApp\
. Эти файлы журнала записаны с stdio
функции (fopen
, fprintf
, fclose
).
Вот проблема:
Усера запускает программу сначала, он создает \ProgramData\MyApp\MyLogFile.txt
использование CreateFile()
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
+1 всем за попытки, но в конце концов я нашел здесь ответ:
Мне пришлось изменить одну строку этого решения, с этого:
ea[0].grfAccessMode = DENY_ACCESS;
на это:
ea[0].grfAccessMode = GRANT_ACCESS;
Вы должны обязательно использовать CreateFile . См. Дополнительные сведения о безопасности и правах доступа . Я уверен, что функции из стандартной библиотеки C используют CreateFile (он не может использовать что-либо еще в Windows), но с параметрами безопасности по умолчанию, которые в вашем случае бесполезны.
Я также попытался заглянуть внутрь структур SECURITY_ATTRIBUTES и SECURITY_DESCRIPTOR , но не очень легко понять, как это сделать, хотя это может быть случайностью.
Вероятно, ваше приложение использует программу установки. Когда программа установки создаст вашу папку "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
Вам нужно добавить разрешающее правило для пользователя "Everyone", если вы действительно этого хотите.
Нулевой дескриптор отложит безопасность каталога, если мне не изменяет память...