Предоставить полный доступ на языке NSIS - PullRequest
1 голос
/ 21 сентября 2019

Как предоставить полный доступ (чтение / запись / удаление) к каталогу 1 и всем его подкаталогам для всех пользователей, использующих язык NSIS?Я видел это и все подобные ответы.Все они рекомендуют сделать это:

AccessControl::GrantOnFile  "$APPDATA\${APP_NAME}" "(S-1-5-32-545)" "FullAccess"

Я сделал это, но файлы, созданные в "$APPDATA\${APP_NAME}", по-прежнему недоступны (не могут быть прочитаны / изменены / удалены) для пользователей, отличных от создателя.Ни один из файлов не может быть изменен, а некоторые даже не могут быть прочитаны.Я на Windows 7 64 бит.Что я делаю неправильно?Я также пытался использовать "(BU)" вместо "(S-1-5-32-545)" и "GenericRead + GenericWrite" вместо "FullAccess".Ничего не помогло.
Я использую SetShellVarContext all, и после выполнения установщика разрешения выглядят так:

Permissions


Мой главныйЦель состоит в том, чтобы хранить файлы, которые должны быть прочитаны и изменены всеми пользователями.Если есть лучший способ сделать это, кроме хранения в "C:/ProgramData/MyApplication/" и предоставления разрешений всем пользователям, это также будет полезно.

1 Каталог: "$APPDATA\${APP_NAME}", что составляет C:/ProgramData/MyApplication/

1 Ответ

1 голос
/ 21 сентября 2019

Хотя моя вкладка безопасности выглядит так же, как и ваша, другие пользователи, не являющиеся администраторами, могут записывать файлы после вызова AccessControl.Если вы нажмете кнопку «Дополнительно» на скриншоте, вы увидите истинный ACL, в котором должна быть не унаследованная запись, предоставляющая полный доступ к группе пользователей.

RequestExecutionLevel admin
!define APP_NAME "SOTest"

Section
SetShellVarContext all

CreateDirectory "$APPDATA\${APP_NAME}"
nsExec::ExecToLog '"icacls" "$APPDATA\${APP_NAME}"'
Pop $0

AccessControl::GrantOnFile "$APPDATA\${APP_NAME}" "(S-1-5-32-545)" "FullAccess" ; or use S-1-1-0 for Everyone
Pop $0
MessageBox mb_ok "GrantOnFile returned $0"
nsExec::ExecToLog '"icacls" "$APPDATA\${APP_NAME}"'
Pop $0
SectionEnd

дает мне

Create folder: C:\ProgramData\SOTest
C:\ProgramData\SOTest NT AUTHORITY\SYSTEM:(I)(OI)(CI)(F)
                      BUILTIN\Administrators:(I)(OI)(CI)(F)
                      CREATOR OWNER:(I)(OI)(CI)(IO)(F)
                      BUILTIN\Users:(I)(OI)(CI)(RX)
                      BUILTIN\Users:(I)(CI)(WD,AD,WEA,WA)

Successfully processed 1 files; Failed processing 0 files
C:\ProgramData\SOTest BUILTIN\Users:(OI)(CI)(F) <-- Full access for users group
                      NT AUTHORITY\SYSTEM:(I)(OI)(CI)(F)
                      BUILTIN\Administrators:(I)(OI)(CI)(F)
                      CREATOR OWNER:(I)(OI)(CI)(IO)(F)
                      BUILTIN\Users:(I)(OI)(CI)(RX)
                      BUILTIN\Users:(I)(CI)(WD,AD,WEA,WA)

Successfully processed 1 files; Failed processing 0 files

Даже если вы можете заставить его работать, - неправильный способ работы приложения .Вы можете сохранить исходные данные / данные шаблона в папке ProgramData, но при первом запуске приложения пользователь должен скопировать данные из ProgramData в папку% AppData% пользователей.Это, конечно, означает, что у каждого пользователя есть свои личные данные.Это был предпочтительный метод в течение как минимум 20 лет.

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

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