Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Диоксин, Вы писали:
Д>>используем функцию 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())