Привет.
Как известно, если у текущего пользователя нет админских прав, то программа, запущенная под таким пользователем, не сможет создавать и перезаписывать файлы в любой папке, отличной от 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 не удалось...
я нигде не ошибся?
Помогите, как грамотно все организовать - кто-нибудь этим занимался?