Форумчанин
Регистрация: 02.06.2009
Сообщений: 218
|
Права доступа
Код:
int red(TCHAR *uName,LPTSTR fName)
{
LPVOID Ace = NULL;
PSECURITY_DESCRIPTOR pSd = NULL;
PSECURITY_DESCRIPTOR pnewSd = NULL;
ACL_SIZE_INFORMATION AclInfo;
PACL pAcl = NULL,npAcl = NULL,pacl = NULL;
PSID ppSidOwner;
LPVOID pUserSID = NULL;
DWORD cbUserSID = 0;
TCHAR* szDomain = NULL;
DWORD cbDomain = 0;
DWORD newSize = 0;
SID_NAME_USE snuType;
BOOL fAPISuccess;
fAPISuccess = LookupAccountName(NULL, uName, pUserSID, &cbUserSID, szDomain, &cbDomain, &snuType);
if (fAPISuccess)
return 0;
else
if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
{
printf(TEXT("LookupAccountName() failed. Error %d\n"), GetLastError());
return 0;
}
pUserSID = malloc(cbUserSID);
if (!pUserSID)
{
printf(TEXT("HeapAlloc() failed. Error %d\n"), GetLastError());
return 0;
}
szDomain = (TCHAR *) malloc(cbDomain * sizeof(TCHAR));
if (!szDomain)
{
printf(TEXT("HeapAlloc() failed. Error %d\n"), GetLastError());
return 0;
}
if(!LookupAccountName(NULL, uName, pUserSID, &cbUserSID, szDomain, &cbDomain, &snuType))
{
printf(TEXT("LookupAccountName() failed. Error %d\n"),GetLastError());
return 0;
}
GetNamedSecurityInfo(fName,SE_FILE_OBJECT,DACL_SECURITY_INFORMATION,&ppSidOwner,NULL,&pAcl,NULL,&pSd);
if(!GetAclInformation(pAcl,&AclInfo,sizeof(AclInfo),AclSizeInformation))
{
printf(TEXT("GetAclInformation() failed. Error %d\n"),GetLastError());
return 0;
}
newSize = AclInfo.AclBytesInUse + sizeof(ACCESS_ALLOWED_ACE) + GetLengthSid(pUserSID) - sizeof(DWORD);
npAcl = (PACL)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,newSize);
if(npAcl == NULL)
{
printf(TEXT("HeapAlloc(npAcl) failed. Error %d\n"),GetLastError());
return 0;
}
if(!InitializeAcl(npAcl, newSize, ACL_REVISION))
{
printf(TEXT("InitializeAcl failed. Error %d\n"),GetLastError());
return 0;
}
for(int i = 0 ; i < AclInfo.AceCount ; i++)
{
if(!GetAce(pAcl,i,&Ace))
{
printf(TEXT("GetAce() failed. Error %d\n"),GetLastError());
return 0;
}
if(!AddAce(npAcl,ACL_REVISION,MAX_L,Ace,((PACE_HEADER)Ace)->AceSize))
{
printf(TEXT("AddAce() failed. Error %d\n"),GetLastError());
return 0;
}
}
if(!AddAccessAllowedAce(npAcl,ACL_REVISION,GENERIC_ALL,pUserSID))
{
printf(TEXT("AddAccessAllowedAce() failed. Error %d\n"),GetLastError());
return 0;
}
//AddAccessDeniedAce тоже самое, но запрещающее
pnewSd = (PSECURITY_DESCRIPTOR)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,SECURITY_DESCRIPTOR_MIN_LENGTH);
if(pnewSd == NULL)
{
printf(TEXT("HeapAlloc(pnewSd) failed. Error %d\n"),GetLastError());
return 0;
}
if(!InitializeSecurityDescriptor(pnewSd,SECURITY_DESCRIPTOR_REVISION))
{
printf(TEXT("InitializeSecurityDescriptor() failed. Error %d\n"),GetLastError());
return 0;
}
if(!SetSecurityDescriptorDacl(pnewSd,TRUE,npAcl,FALSE))
{
printf(TEXT("GetSecurityDescriptorDacl() failed. Error %d\n"),GetLastError());
return 0;
}
if(!SetFileSecurity(fName,DACL_SECURITY_INFORMATION,pnewSd))
{
printf(TEXT("SetFileSecurity() failed. Error %d\n"),GetLastError());
return 0;
}
return 1;
}
Добрый день товарищи. Я столкнулся с такой проблемой как "рзрешения на файл неправильно упорядочены". Я читал в msdn'е, что функция AddAccessAllowedAce просто записывает в конец разрешения, но не сортирует, кароче весь косяк на этапе том, который я выделил красным цветом, не знаю как зделать, чтобы было все нормально, чтобы разрешить пользователю все привилегии для данного файла. Спасибо за помощь.
Последний раз редактировалось Olejik; 02.12.2009 в 17:52.
Причина: сделал ошибочку
|