Смена прав на ключ реестра
От: Аноним  
Дата: 23.06.11 09:17
Оценка:
Всем доброго дня.

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

Вот такая ситуация..

хочу удалить первое правило на запрет
Re: Смена прав на ключ реестра
От: Аноним  
Дата: 23.06.11 10:39
Оценка:
неужели никто не делал этого?
Re: Смена прав на ключ реестра
От: Диоксин Украина  
Дата: 23.06.11 11:49
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Всем доброго дня.


А>Подскажите, как сменить права на отдельный ключ в реестре?

А>Желательно показать на примере, искал по форуму — ничего не нашел..

А>Вот такая ситуация..

А>
А>хочу удалить первое правило на запрет

используем функцию RegGetKeySecurity для получения security descriptor для нужного ключа. Почле этого меняем список dacl. Для упрощения можно использовать класс CSecurityDesc из ATL. А потом вызываем метод RegSetKeySecurity
Re[2]: Смена прав на ключ реестра
От: Аноним  
Дата: 23.06.11 12:42
Оценка:
Здравствуйте, Диоксин, Вы писали:

Д>используем функцию 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
Re[3]: Смена прав на ключ реестра
От: Диоксин Украина  
Дата: 24.06.11 10:51
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Диоксин, Вы писали:


Д>>используем функцию 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())
Re[4]: Смена прав на ключ реестра
От: Аноним  
Дата: 24.06.11 11:56
Оценка:
Здравствуйте, Диоксин, Вы писали:

Д>Вы ведь ничего и не меняете:


Д>
Д>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

вроде пока работает
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.