Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.12.2009, 15:38   #1
Olejik
Форумчанин
 
Регистрация: 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. Причина: сделал ошибочку
Olejik вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Права доступа к директории Linel PHP 7 04.12.2009 16:23
Права доступа L_M Операционные системы общие вопросы 1 19.07.2009 08:09
Права доступа usera Anna_fors Компьютерное железо 0 28.03.2008 14:06
нет права доступа Rio309 Общие вопросы Delphi 7 17.02.2008 09:38
Права доступа NTFS LinCoRe Windows 6 07.02.2008 21:24