Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: [WinAPI] Изменить права доступа для папки  (Прочитано 9677 раз)
0 Пользователей и 1 Гость смотрят эту тему.
The Nameless One
Помогающий

ru
Offline Offline
Пол: Мужской

« : 03-08-2011 12:09 » 

Привет.
Как известно, если у текущего пользователя нет админских прав, то программа, запущенная под таким пользователем, не сможет создавать и перезаписывать файлы в любой папке, отличной от AppData.

Задача в том, чтобы программе дать возможность создавать файлы и делать с ними что угодно в своей папке, куда её установят. Восновном это нужно, чтобы эта програ вытягивала с интернета апдейты и патчи для самой себя, т.е. обновлялась. И делать она могла это из под люього юзера, даже у которого нет админских прав.
Инсталлировать такую программу можно только с правами админа, а пользоваться ей может кто угодно на данном ПК. И эта программа должна быть международной, с поддержкой других языков.

Для этого нужно во время инсталляции папку, в которую будет установлена программа, наградить правами доступа.

Возникает несколько вопросов:

1) нужно ли доставать адрес UserName\ApplicationData в UNICODE? предполагаю что на многих европейских компах UserName - это то что написал юзверь на своем родном языке... хотя почему то мне кажется что там только англицкий и кирилица =\

2) изменение прав делаю с помощью Cacls... в C++ это:
system("cacls . /E /T /C /G Administrators:F"); //откроет админам FullControl
такой способ вобще работоспособен на вин7/виста? на XP у меня работает.

3) имя администратора / пользователя зависит от языка операционки...
system("cacls . /E /T /C /G Administrators:F");
не будет работать на руской винде, там надо
system("cacls . /E /T /C /G Администраторы:F");

так же для "Everyone" = "Все", "Users" = "Пользователи"... и как я подозреваю на разных языках оно по разному.
для этого:
во первых юзать WCHAR
_wsystem(...);
во вторых, мы не можем знать как "Админстраторы" будет уругвайском, поэтому нам нужно достать имена нужных юзеров из системы.
для этого нужен код такой:

Код:
SID_NAME_USE sidNameUse;
    wchar_t szAccName[256];
    wchar_t szDomName[256];
    DWORD dwNameSize = sizeof(szAccName)/sizeof(szAccName[0]);
    DWORD dwDomSize = sizeof(szDomName)/sizeof(szDomName[0]);
    PSID pSid;
    SID_IDENTIFIER_AUTHORITY siaWorld = SECURITY_WORLD_SID_AUTHORITY;
    AllocateAndInitializeSid(&siaWorld, 1, SECURITY_WORLD_RID, 0, 0, 0, 0, 0, 0, 0, &pSid);
    LookupAccountSid(NULL, pSid, szAccName, &dwNameSize, szDomName, &dwDomSize, &sidNameUse);
    FreeSid(pSid);

но пока что собрать рабочий вариант с WCHAR не удалось...
я нигде не ошибся?

Помогите, как грамотно все организовать - кто-нибудь этим занимался?

Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 03-08-2011 13:05 » 

Как известно, если у текущего пользователя нет админских прав, то программа, запущенная под таким пользователем, не сможет создавать и перезаписывать файлы в любой папке, отличной от AppData.

Все зависит от версии винды и настроек защиты. В XP достаточно "Power Users" ("Опытные пользователи") чтобы напряму писать в Program Files и многие места реестра.
В Vista и W7 при отключенном UAC аналогично.

1. Почему же? Там и "арабица", и "ивритица" возможны. Главное, чтобы твое приложение использовало версии функций API для Unicode.

3. Имя администратора не зависит ни от чего - оно просто может быть произвольным. Очень глупо рассчитывать на какие-то строгие идентификаторы, когда работаешь с людьми. Чтобы с этим не путаться, существуют человеконечитаемые идентификаторы, базирующиеся на UUID. Через них можно идентифицировать встроенные группы.
« Последнее редактирование: 03-08-2011 13:13 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
The Nameless One
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 03-08-2011 19:00 » 

RXL, спасибо, пробую дальше разбираться.
Вот тут ссылка ещё вроде в тему http://msdn.microsoft.com/en-us/library/aa379609%28v=VS.85%29.aspx
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines