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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Изменение доступа к файлу 
:(
    Опции темы
NiJazz
  Дата 10.12.2003, 00:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


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

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



Если кому интересно и кто занимался этим, помогите, пож-та. Есть пара мест в коде, что вызывают сомнения (но не больше). Но дело в том, что доступ к файлу не меняется после прогона программы.
Эта прога должна смотреть, кому можно работать с файлом (каждому - свой вид работы, то есть чтение, запуск, запись. Это можно посмотреть в свойствах файла (папки) во вкладке Безопасность).
А потом менять доступ разным группам (это задаётся непосредственно в коде - простой вариант).
Почему?

Код

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

#define NUM_OF_ACES   4;

void main()
{
SID_IDENTIFIER_AUTHORITY SecurNTAuth = SECURITY_NT_AUTHORITY;

char      pFileName[50];
PACL      pOldAcl = NULL;
PACL      pNewAcl = NULL;
PSECURITY_DESCRIPTOR  psd = NULL;
PSID      pSid;

EXPLICIT_ACCESS    ea;
 

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

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

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

//////////////////////////////////////////////////////////////////////////
ea.grfAccessMode = GRANT_ACCESS;
ea.grfAccessPermissions = GENERIC_ALL;
ea.grfInheritance = INHERIT_ONLY_ACE;
ea.Trustee.MultipleTrusteeOperation = NO_MULTIPLE_TRUSTEE;
ea.Trustee.pMultipleTrustee = NULL;
ea.Trustee.TrusteeForm = TRUSTEE_IS_SID;
ea.Trustee.TrusteeType = TRUSTEE_IS_GROUP;
//////////////////////////////////////////////////////////////////////////

ea.Trustee.ptstrName = (LPTSTR)LocalAlloc(LMEM_FIXED, GetLengthSid(pSid));
ea.Trustee.ptstrName = (LPTSTR)pSid;
//CopySid(GetLengthSid(pSid), (PSID)ea.Trustee.ptstrName, pSid);
//cout << GetLengthSid(ea.Trustee.ptstrName) << endl;
 
//////////////////////////////////////////////////////////////////////////
if (SetEntriesInAcl(
    1,
    &ea,
    pOldAcl,
    &pNewAcl) != ERROR_SUCCESS)
{
 cout << "Couldn't set entries in ACL: " << GetLastError() << endl;
}
//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////
if (!SetNamedSecurityInfo(
     pFileName,
     SE_FILE_OBJECT,
     DACL_SECURITY_INFORMATION,
     NULL,
     NULL,
     pNewAcl,
     NULL))
{
 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 (pSid != NULL)
 LocalFree(pSid);
//////////////////////////////////////////////////////////////////////////

return;
}

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


Jazz coder
****


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

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



DOMAIN_ALIAS_RID_POWER_USERS - в данном случае Опытному пользователю стало иметь доступ к файлу c:\myfile.txt. Доступ неограниченный (GENERIC_ALL).
PM MAIL   Вверх
p0s0l
Дата 11.12.2003, 07:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 2
Всего: 112



Я вместо INHERIT_ONLY_ACE поставил NO_INHERITANCE и всё стало работать. Может быть надо и не это значение, но свинья тут зарылась...
Также если убрать вызов GetNamedSecurityInfo, а в вызове SetEntriesInAcl вместо pOldAcl поставить NULL, то хуже от этого работать не будет, но это так, к слову...



--------------------
С уважением, г-н Посол.
PM   Вверх
NiJazz
Дата 11.12.2003, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


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

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



p0s0l, попробую. Я тоже долго сомневался с этим, просто потом забылось. Спасибо!
PM MAIL   Вверх
NiJazz
Дата 11.12.2003, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


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

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



Цитата
Также если убрать вызов GetNamedSecurityInfo, а в вызове SetEntriesInAcl вместо pOldAcl поставить NULL, то хуже от этого работать не будет, но это так, к слову...


Но какже тогда со старыми правами? Ведь вызов SetEntriesInAcl как раз и обновляет pOldAcl на pNewAcl, дополняя информацию.

Цитата
Я вместо INHERIT_ONLY_ACE поставил NO_INHERITANCE и всё стало работать. Может быть надо и не это значение, но свинья тут зарылась


Я тоже так сделал. Не сработало. sad.gif

А ты попробуй отнять у всех права на доступ к файлу.
И ещё странность: GetNamedSecurityInfo как имя файла принимает, например, "C:\myfle.txt", что противоречит Си-шному способу. А если сделать "C:\\myfile.txt", то вопит. Такой странный путь описан в MSDN.


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


Jazz coder
****


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

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



Вот нынешний код. Но всё равно не работает. sad.gif

Код
#include <iostream.h>
#include <windows.h>
#include <aclapi.h>


void main()
{
SID_IDENTIFIER_AUTHORITY SecurNTAuth = SECURITY_NT_AUTHORITY;

char          pFileName[50];
PACL       pOldAcl = NULL;
PACL       pNewAcl = NULL;
PSECURITY_DESCRIPTOR   psd = NULL;
PSID          pSid;

EXPLICIT_ACCESS     ea;


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

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

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

//////////////////////////////////////////////////////////////////////////
ea.grfAccessMode = SET_ACCESS;
ea.grfAccessPermissions = GENERIC_ALL;
ea.grfInheritance = NO_INHERITANCE;//INHERIT_ONLY_ACE;
ea.Trustee.MultipleTrusteeOperation = NO_MULTIPLE_TRUSTEE;
ea.Trustee.pMultipleTrustee = NULL;
ea.Trustee.TrusteeForm = TRUSTEE_IS_SID;
ea.Trustee.TrusteeType = TRUSTEE_IS_GROUP;
//////////////////////////////////////////////////////////////////////////

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

//////////////////////////////////////////////////////////////////////////
if (SetEntriesInAcl(
       1,
    &ea,
    pOldAcl,
    &pNewAcl) != ERROR_SUCCESS)
{
 cout << "Couldn't set entries in ACL: " << GetLastError() << endl;
}
//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////
if (!SetNamedSecurityInfo(
     pFileName,
     SE_FILE_OBJECT,
     DACL_SECURITY_INFORMATION,
     NULL,
     NULL,
     pNewAcl,
     NULL))
{
 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 (pSid != NULL)
 FreeSid(pSid);
//////////////////////////////////////////////////////////////////////////

return;
}

PM MAIL   Вверх
Ars
Дата 11.12.2003, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 28.8.2003
Где: Московская обл.

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



Цитата
И ещё странность: GetNamedSecurityInfo как имя файла принимает, например, "C:\myfle.txt", что противоречит Си-шному способу. А если сделать "C:\myfile.txt", то вопит. Такой странный путь описан в MSDN.

Глупость! Погляди в дебагере, что у тебя в pFileName после выполнения strcpy(pFileName, "c:\myfile.txt");. Уверен, что "c:myfile.txt". И это имя файла?!!
Погляди внимательно, что возвращают ф-ции GetNamedSecurityInfo, SetNamedSecurityInfo и какие у тебя условия проверки их невыполнения


--------------------
Есть многое на свете, друг Горацио,
С чем очень долго можно прое..!
PM MAIL   Вверх
NiJazz
Дата 11.12.2003, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


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

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



Ars, а ты в MSDN посмотри. Я ж не знаю реализацию этих API.
К тому же прога вопит, если делать "правильные имена".
PM MAIL   Вверх
NiJazz
Дата 11.12.2003, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


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

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



Остаётся дождаться, что pOsOl ответит. smile.gif
PM MAIL   Вверх
Ars
Дата 11.12.2003, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 28.8.2003
Где: Московская обл.

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



При чем тут реализация API? Ты на свою реализацию погляди!
Код
if (!GetNamedSecurityInfo(
     pFileName,
     SE_FILE_OBJECT,
     DACL_SECURITY_INFORMATION,
     NULL,
     NULL,
     &pOldAcl,
     NULL,
     &psd))
{
cout << "Couldn't get named security info: " << GetLastError() << endl;
}

В этом куске при успешном выполнении функции будет вылазить надпись
Цитата
Couldn't get named security info:

А все потому, что GetNamedSecurityInfo возвращает 0 при успешном выполнении и код ошибки, отличный от нуля в противном случае, а значение LastError она вообще не выставляет, а ты все это как то странно интерпретируешь в своей программе.


--------------------
Есть многое на свете, друг Горацио,
С чем очень долго можно прое..!
PM MAIL   Вверх
NiJazz
Дата 11.12.2003, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


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

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



Ars, хм, это по привычке... Посмотрю. Заранее спасибо.
PM MAIL   Вверх
NiJazz
Дата 11.12.2003, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


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

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



Ars, спасибо тебе, что внимание обратил. А ведь я и правда чувствовал, что всё, не мог понять, в чём проблема.
Иногда и дурацкая невнимательность может сослужить злую службу. smile.gif
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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