Всем доброго дня.
Подскажите, как сменить права на отдельный ключ в реестре?
Желательно показать на примере, искал по форуму — ничего не нашел..
Вот такая ситуация..

хочу удалить первое правило на запрет
неужели никто не делал этого?
Здравствуйте, Аноним, Вы писали:
А>Всем доброго дня.
А>Подскажите, как сменить права на отдельный ключ в реестре?
А>Желательно показать на примере, искал по форуму — ничего не нашел..
А>Вот такая ситуация..
А>
А>хочу удалить первое правило на запрет
используем функцию RegGetKeySecurity для получения security descriptor для нужного ключа. Почле этого меняем список dacl. Для упрощения можно использовать класс CSecurityDesc из ATL. А потом вызываем метод RegSetKeySecurity
Здравствуйте, Диоксин, Вы писали:
Д>используем функцию RegGetKeySecurity для получения security descriptor для нужного ключа. Почле этого меняем список dacl. Для упрощения можно использовать класс CSecurityDesc из ATL. А потом вызываем метод RegSetKeySecurity
Да использую... только видимо не так...
long ll = reg.Open(HKEY_LOCAL_MACHINE, _T("SYSTEM\\CurrentControlSet\\Services\\MyService"), KEY_QUERY_VALUE); // возвращается 0
CSecurityDescriptor sd;
sd.InitializeFromThreadToken();
SetLastError(0);
ll = reg.SetKeySecurity(DACL_SECURITY_INFORMATION, sd); // тоже 0
reg.Close();
но реально ничего не меняется, смотрю права на ветку через regedit
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Диоксин, Вы писали:
Д>>используем функцию RegGetKeySecurity для получения security descriptor для нужного ключа. Почле этого меняем список dacl. Для упрощения можно использовать класс CSecurityDesc из ATL. А потом вызываем метод RegSetKeySecurity
А>Да использую... только видимо не так...
А>А>long ll = reg.Open(HKEY_LOCAL_MACHINE, _T("SYSTEM\\CurrentControlSet\\Services\\MyService"), KEY_QUERY_VALUE); // возвращается 0
А>CSecurityDescriptor sd;
А>sd.InitializeFromThreadToken();
А>SetLastError(0);
А>ll = reg.SetKeySecurity(DACL_SECURITY_INFORMATION, sd); // тоже 0
А>reg.Close();
А>
А>но реально ничего не меняется, смотрю права на ветку через regedit
Вы ведь ничего и не меняете:
CSecurityDesc sd;
CDacl dacl;
bool bDefaulted = false;
bool bGetDACL = sd.GetDacl(&dacl,NULL,&bDefaulted);
if(bGetDACL)
{
UINT cAces = dacl.GetAceCount();
for(UINT i = 0;i < cAces;++i)
{
CSid s;
BYTE nAceType;
dacl.GetAclEntry(i,&s,NULL,&nAceType,NULL,NULL);
if(s == Sids::Admins() && ACCESS_DENIED_ACE_TYPE == nAceType)
{
dacl.RemoveAce(i);
break;
}
}
}
sd.SetDacl(dacl,bDefaulted);
sd.MakeSelfRelative();
reg.SetKeySecurity(DACL_SECURITY_INFORMATION, sd.GetPSECURITY_DESCRIPTOR())
Здравствуйте, Диоксин, Вы писали:
Д>Вы ведь ничего и не меняете:
Д>Д>CSecurityDesc sd;
Д>CDacl dacl;
Д>bool bDefaulted = false;
Д>bool bGetDACL = sd.GetDacl(&dacl,NULL,&bDefaulted);
Д>if(bGetDACL)
Д>{
Д> UINT cAces = dacl.GetAceCount();
Д> for(UINT i = 0;i < cAces;++i)
Д> {
Д> CSid s;
Д> BYTE nAceType;
Д> dacl.GetAclEntry(i,&s,NULL,&nAceType,NULL,NULL);
Д> if(s == Sids::Admins() && ACCESS_DENIED_ACE_TYPE == nAceType)
Д> {
Д> dacl.RemoveAce(i);
Д> break;
Д> }
Д> }
Д>}
Д>sd.SetDacl(dacl,bDefaulted);
Д>sd.MakeSelfRelative();
Д>reg.SetKeySecurity(DACL_SECURITY_INFORMATION, sd.GetPSECURITY_DESCRIPTOR())
Д>
Спасибо большое, но уже подсказали использовать метод, описанный тут —
http://rsdn.ru/forum/winapi/4317879.1.aspxАвтор: ononim
Дата: 23.06.11
вроде пока работает