Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Изменение разрешений на папку Win7


Автор: Etud 2.8.2011, 20:45
Известно, что программа не может изменять данные в Program Files, 
так как это системная защищённая папка.

Нужно периодически обновлять DLL-ки  в программе (C:\Program Files\MyProgram\Plugins) .

Как можно в папке Plugins поменять разрешения с чтения на запись ???

Ручками все весьма просто меняется для Пользователя.

Автор: Riddik 2.8.2011, 21:21
Если у пользователя нет админских прав, то в любую папку прога обломится писать файлы, кроме как в AppData.
Но как-то производители ПО обходят этот момент - их проги умеют апдейтиться из нета и писать в свою папку.
Вопрос я задал в теме рядом - как это делать?

Автор: asmdzen 2.8.2011, 21:44
Цитата(Etud @  2.8.2011,  20:45 Найти цитируемый пост)
Как можно в папке Plugins поменять разрешения с чтения на запись ???


Цитата(Riddik @  2.8.2011,  21:21 Найти цитируемый пост)
Но как-то производители ПО обходят этот момент

может когда прога устанавливается у инсталятора есть админ права и он устанавливает на свои папки какие хочет разрешения, типа записи?

Автор: Riddik 2.8.2011, 22:02
с http://codehelper.ru есть решение для .Net, поможет кто-нибудь перевести на win32? (с/с++)
Код

public bool SetAcl(string pathname, string userRights, string username, bool inheritSubDirectories)
{
    if (string.IsNullOrEmpty(pathname))
    {
        return false;
    }

    pathname = pathname.TrimEnd('\\');
    var rights = (FileSystemRights)0;
    if (userRights == "R")
    {
        rights = FileSystemRights.ReadAndExecute;
    }
    else if (userRights == "C")
    {
        rights = FileSystemRights.ChangePermissions;
    }
    else if (userRights == "F")
    {
        rights = FileSystemRights.FullControl;
    }

    var accessRule = new FileSystemAccessRule(username, rights,
                                InheritanceFlags.None,
                                PropagationFlags.NoPropagateInherit,
                                AccessControlType.Allow);
    var info = new DirectoryInfo(pathname);
    var security = info.GetAccessControl(AccessControlSections.Access);
    bool result;
    security.ModifyAccessRule(AccessControlModification.Set, accessRule, out result);
    if (!result)
    {
        return false;
    }

    InheritanceFlags iFlags = InheritanceFlags.ObjectInherit;
    if (inheritSubDirectories)
    {
        iFlags = InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit;
    }
    accessRule = new FileSystemAccessRule(username, rights,
                                iFlags,
                                PropagationFlags.InheritOnly,
                                AccessControlType.Allow);

    security.ModifyAccessRule(AccessControlModification.Add, accessRule, out result);
    if (!result)
    {
        return false;
    }

    info.SetAccessControl(security);
    return true;


ссылка: http://codehelper.ru/questions/1/new/%D0%BA%D0%B0%D0%BA-%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%BD%D0%BE-%D1%83%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%B8%D1%82%D1%8C-%D0%BF%D1%80%D0%B0%D0%B2%D0%B0-%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%D0%B0-%D0%BD%D0%B0-%D0%BF%D0%B0%D0%BF%D0%BA%D1%83-%D0%B2-net

Автор: Etud 2.8.2011, 22:46
Цитата(Riddik @  2.8.2011,  21:21 Найти цитируемый пост)
Если у пользователя нет админских прав, то в любую папку прога обломится писать файлы, кроме как в AppData.Но как-то производители ПО обходят этот момент - их проги умеют апдейтиться из нета и писать в свою папку.Вопрос я задал в теме рядом - как это делать?


Не запишет в защищенные (Windows, Program Files, System), в другое место - пожалуйста.

Меняют разрешения на запись. Вот и я хочу поменять.





Автор: Riddik 2.8.2011, 23:27
Цитата(Etud @  2.8.2011,  22:46 Найти цитируемый пост)
Меняют разрешения на запись. Вот и я хочу поменять.

Ну а я к чему код привёл?

Вот и winдовая ф-ия http://msdn.microsoft.com/en-us/library/aa379575

Автор: xvr 3.8.2011, 16:22
Цитата(Riddik @  2.8.2011,  21:21 Найти цитируемый пост)
Но как-то производители ПО обходят этот момент - их проги умеют апдейтиться из нета и писать в свою папку.

Этим занимается не ПО производителей, а Windows Installer. Смотреть http://msdn.microsoft.com/en-us/library/aa382503%28v=VS.85%29.aspx и http://msdn.microsoft.com/en-us/library/aa372868%28VS.85%29.aspx

Автор: Riddik 3.8.2011, 17:23
xvr, спасибо за ссылки!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)