Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> SetEntriesInAcl, Может, кто делал. 
:(
    Опции темы
NiJazz
  Дата 22.1.2004, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


Профиль
Группа: Экс. модератор
Сообщений: 2286
Регистрация: 10.8.2003
Где: Москва

Репутация: 1
Всего: 23



Мне нужно с помощью функции SetEntriesInAcl изменить доступ к файлу определённым пользователям.
Параметр pListOfExplicitEntries - указатель на массив из элементов типа EXPLICIT_ACCESS. То есть массив нужно использовать для работы с несколькими пользователями.
Кто-нибудь делал так, чтобы изменять права дотупа сразу нескольким пользователям?
Если да, то, пожалуйста, покажите этот участок кода, как заполнять массив. Спасибо.

У меня уже есть идейка, но текст уже написан. smile.gif
PM MAIL   Вверх
NiJazz
Дата 23.1.2004, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


Профиль
Группа: Экс. модератор
Сообщений: 2286
Регистрация: 10.8.2003
Где: Москва

Репутация: 1
Всего: 23



Цитата
Мне нужно с помощью функции SetEntriesInAcl изменить доступ к файлу определённым пользователям.

Это некорректно. На самом деле она просто меняет структуру списка ACL.

Если у меня есть массив указателей на структуру. В данном примере из двух. Зполняю его ручками, затем как входной параметр в функцию SetEnriesInAcl. После заполнения массива, функция выдаёт ошибку.
Насколько я помню, указатель на массив в С++ - это по сути его имя. Или я что-то не понимаю...
Вот код:
Код

#include <iostream.h>
//#include <windows.h>
#include <aclapi.h>


void main()
{
SID_IDENTIFIER_AUTHORITY SecurNTAuth = SECURITY_NT_AUTHORITY;

char        pFileName[128];
PACL     pOldAcl = NULL;
PACL        pNewAcl = NULL;
PSECURITY_DESCRIPTOR psd = NULL;
PSID              pAdminSid;
PSID     pUserSid;
PSID     pGuestSid;
PSID     pPowerUserSid;

PEXPLICIT_ACCESS     ea[2];


//////////////////////////////////////////////////////////////////////////
if (!AllocateAndInitializeSid(
      &SecurNTAuth,
      2,
      SECURITY_BUILTIN_DOMAIN_RID,
      DOMAIN_ALIAS_RID_ADMINS,
      0, 0, 0, 0, 0, 0,
      &pAdminSid))
{
 cout << "Error while allocating power user's SID: " << GetLastError() << endl;
}
//////////////////////////////////////////////////////////////////////////
if (!AllocateAndInitializeSid(
      &SecurNTAuth,
      2,
      SECURITY_BUILTIN_DOMAIN_RID,
      DOMAIN_ALIAS_RID_ADMINS,
      0, 0, 0, 0, 0, 0,
      &pGuestSid))
{
 cout << "Error while allocating power user's SID: " << GetLastError() << endl;
}
//////////////////////////////////////////////////////////////////////////

strcpy(pFileName, "c:\\my.txt");

//////////////////////////////////////////////////////////////////////////
if (GetNamedSecurityInfo(
          pFileName,
      SE_FILE_OBJECT,
         DACL_SECURITY_INFORMATION,
         NULL,
      NULL,
      &pOldAcl,
      NULL,
      &psd) != ERROR_SUCCESS)
{
 cout << "Couldn't get named security info: " << GetLastError() << endl;
}
//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////
ea[1] = (PEXPLICIT_ACCESS)malloc(sizeof(EXPLICIT_ACCESS));
ea[2] = (PEXPLICIT_ACCESS)malloc(sizeof(EXPLICIT_ACCESS));

ea[1]->grfAccessMode = SET_ACCESS;
ea[1]->grfAccessPermissions = GENERIC_WRITE;
ea[1]->grfInheritance = NO_INHERITANCE;//INHERIT_ONLY_ACE;
ea[1]->Trustee.MultipleTrusteeOperation = NO_MULTIPLE_TRUSTEE;
ea[1]->Trustee.pMultipleTrustee = NULL;
ea[1]->Trustee.TrusteeForm = TRUSTEE_IS_SID;
ea[1]->Trustee.TrusteeType = TRUSTEE_IS_GROUP;
//////////////////////////////////////////////////////////////////////////

ea[1]->Trustee.ptstrName = (LPTSTR)LocalAlloc(LMEM_FIXED, GetLengthSid(pAdminSid));
ea[1]->Trustee.ptstrName = (LPTSTR)pAdminSid;
// так присваивать или CopySid?
//CopySid(GetLengthSid(pSid), (PSID)ea.Trustee.ptstrName, pSid);
//cout << GetLengthSid(ea.Trustee.ptstrName) << endl;

//////////////////////////////////////////////////////////////////////////
ea[2]->grfAccessMode = SET_ACCESS;
ea[2]->grfAccessPermissions = GENERIC_READ;
ea[2]->grfInheritance = NO_INHERITANCE;//INHERIT_ONLY_ACE;
ea[2]->Trustee.MultipleTrusteeOperation = NO_MULTIPLE_TRUSTEE;
ea[2]->Trustee.pMultipleTrustee = NULL;
ea[2]->Trustee.TrusteeForm = TRUSTEE_IS_SID;
ea[2]->Trustee.TrusteeType = TRUSTEE_IS_GROUP;
//////////////////////////////////////////////////////////////////////////

ea[2]->Trustee.ptstrName = (LPTSTR)LocalAlloc(LMEM_FIXED, GetLengthSid(pGuestSid));
ea[2]->Trustee.ptstrName = (LPTSTR)pGuestSid;
 
//////////////////////////////////////////////////////////////////////////
               // При вызове функции выдаёт ошибку.
if (SetEntriesInAcl(
    2,
    *ea,
    pOldAcl,
    &pNewAcl) != ERROR_SUCCESS)
{
 cout << "Couldn't set entries in ACL: " << GetLastError() << endl;
}
//////////////////////////////////////////////////////////////////////////
cout << "Here" << endl;
//////////////////////////////////////////////////////////////////////////
if (SetNamedSecurityInfo(
    pFileName,
    SE_FILE_OBJECT,
    DACL_SECURITY_INFORMATION,
    NULL,
    NULL,
    pNewAcl,
    NULL) != ERROR_SUCCESS)
{
 cout << "Couldn't set named security info: " << GetLastError() << endl;
}
//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////
// Free mem
if (psd != NULL)
 LocalFree(psd);
if (pOldAcl != NULL)
 LocalFree(pOldAcl);
if (pNewAcl != NULL)
 LocalFree(pNewAcl);
if (pAdminSid != NULL)
 FreeSid(pAdminSid);
if (pUserSid != NULL)
 FreeSid(pUserSid);
free(ea[1]);
free(ea[2]);
//////////////////////////////////////////////////////////////////////////

return;
}

PM MAIL   Вверх
NiJazz
Дата 23.1.2004, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


Профиль
Группа: Экс. модератор
Сообщений: 2286
Регистрация: 10.8.2003
Где: Москва

Репутация: 1
Всего: 23



Если при вызове функции SetEntriesInAcl не ставить звёздочку перед ea, то выдаёт ошибку уже на этапе компиляции. Этого и не пойму. Сказали в MSDN, что указатель должен быть, а тут такая ерунда.
Если звёздочку поставить, то ошибка при запуске приложения обращения к памяти.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0496 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.