Может кто нибудь сталкивался, с такой задачей: необходимо в реестр записывать и читать от туда данные, но так чтобы это можно было делать от любого пользователя. Если HKLM, то читать можно от любого, а записать тока от Админа. Если HKCU, то проблемы с чтением/записью от другова пользователя. Может кто нибудь знает как организовать это?
Возможно я ошибаюсь, если да то поправьте. Но ты хочешь писать в реестр ВСЕГДА. А как же права учетных записей? По моему это взаимоисключающие понятия. Апд: Только что в аське с другом поговорил - в принципе можно ведь менять СИД пользователя. Тогда в редакторе реестра отобразятся настройки другого. Но это в редакторе. А вот как это провернуть программно?
2 =Zeus= - менять SID не подойдет, потому что должно работать и из под Гостя. 2 fd00ch - ну да, можно не реестр, можно файлы, но опять же глюки с правами доступа. т.е. можно закинуть всё в файл, но вот куда сам файл закинуть - хз. Главное учитывать что у пользователей могут быть права начиная от Гостя и заканчивая Системой
2 Nightmarе нет, потому что файл может быть создан одним пользователем, а запускаться другим. Да и опять же. файл надо создавать в таком месте где все пользователи смогут иметь доступ
Не совсем понятно, что именно нужно слешу. Просто сохранять настройки своей программы? Это малварь или прикладная программа?
2 =Zeus= а что тут не понятно? Есть программа на компе, есть комп на котором работают пользователи разных привилегий (от админа до гостя) и каждый должен уметь читать настройки и иногда сохранять их. При этом для всех пользователей настройки должны быть одинаковые.
2 Metal-Core в виндовый темп нельзя писать гостю (в XP и Win7) да и ктому же конфиги нах полетят при очистке темпа.
2 shadowrun в шаредокс можно создать файлы любым пользователем, но править их уже сложно. т.е. если админ создаст файл, то гость не сможет исправить. Есть вариант поиграться с правами доступа программно, но это уже не то
Win7 Guest Mode features 1) Prevents system setting changes. 2) Prevents the installation of applications and other software. 3) Prevents the user from writing to the disk outside of their user profile. 4) Data saved inside of the user profile is deleted when the user logs off. Как видно универсальности не получиться, гость слишком ограниченная учетка.
Для каждого пользователя по файлу . Ну или не давать проге создавать файл под учеткой админа. Создание файла должен быть из под Гостя, чтоб править могли все. Бредово и тупо, но других путей не вижу...
2 fd00ch CSIDL_COMMON_APPDATA ведет в \Documents and Settings\All Users\Application Data И там такие же проблемы как и в шаредок. Если админ создаст файл, то гость его не сможет править, если конечно при создании не зададутся принудительно права доступа к файлу, даующие всем доступ
Решил проблему следующим образом: 1) Если надо читать файл, то открыть на чтение и считать данные. 2) Если надо записать файл, то создать файл сразу с нужным DACL который даёт всем пользователям полные права. Кому интересно это делается, то вот пример: Code: #include <Windows.h> #include <AccCtrl.h> #include <Aclapi.h> PISECURITY_DESCRIPTOR InitSecDesc() { PISECURITY_DESCRIPTOR psd; EXPLICIT_ACCESS_A ea; PACL pacl = NULL; DWORD Status; ea.grfAccessPermissions = GENERIC_ALL; ea.grfAccessMode = SET_ACCESS; ea.grfInheritance = NO_INHERITANCE; ea.Trustee.MultipleTrusteeOperation = NO_MULTIPLE_TRUSTEE; ea.Trustee.pMultipleTrustee = NULL; ea.Trustee.TrusteeForm = TRUSTEE_IS_NAME; ea.Trustee.TrusteeType = TRUSTEE_IS_UNKNOWN; ea.Trustee.ptstrName = "EVERYONE"; Status = SetEntriesInAclA(1, &ea, NULL, &pacl); if (Status != ERROR_SUCCESS) { return NULL; } psd = (PISECURITY_DESCRIPTOR)LocalAlloc(LPTR, SECURITY_DESCRIPTOR_MIN_LENGTH); if (psd) { InitializeSecurityDescriptor(psd, SECURITY_DESCRIPTOR_REVISION); Status = SetSecurityDescriptorDacl(psd, 1, pacl, 0); if (!Status) { LocalFree(psd); psd = NULL; } } if (!psd) { LocalFree(pacl); } return psd; } int main() { PISECURITY_DESCRIPTOR psd; SECURITY_ATTRIBUTES sa; HANDLE h; psd = InitSecDesc(); if (psd) { sa.nLength = sizeof (SECURITY_ATTRIBUTES); sa.lpSecurityDescriptor = psd; sa.bInheritHandle = FALSE; h = CreateFileA("c:\\22aa.txt", GENERIC_WRITE, 0, &sa, CREATE_ALWAYS, 0, 0); if (h != INVALID_HANDLE_VALUE) { MessageBoxA(0, "ok", "OK", 0); CloseHandle(h); } LocalFree(psd->Dacl); LocalFree(psd); } return 0; }