Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Изменение доступа к файлу


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

Код

#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;
}

Автор: NiJazz 10.12.2003, 00:35
DOMAIN_ALIAS_RID_POWER_USERS - в данном случае Опытному пользователю стало иметь доступ к файлу c:\myfile.txt. Доступ неограниченный (GENERIC_ALL).

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

Автор: NiJazz 11.12.2003, 13:00
p0s0l, попробую. Я тоже долго сомневался с этим, просто потом забылось. Спасибо!

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


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

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


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

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


Автор: NiJazz 11.12.2003, 14:00
Вот нынешний код. Но всё равно не работает. 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;
}

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

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

Автор: NiJazz 11.12.2003, 17:35
Ars, а ты в MSDN посмотри. Я ж не знаю реализацию этих API.
К тому же прога вопит, если делать "правильные имена".

Автор: NiJazz 11.12.2003, 17:38
Остаётся дождаться, что pOsOl ответит. smile.gif

Автор: Ars 11.12.2003, 18:13
При чем тут реализация 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 она вообще не выставляет, а ты все это как то странно интерпретируешь в своей программе.

Автор: NiJazz 11.12.2003, 18:43
Ars, хм, это по привычке... Посмотрю. Заранее спасибо.

Автор: NiJazz 11.12.2003, 18:53
Ars, спасибо тебе, что внимание обратил. А ведь я и правда чувствовал, что всё, не мог понять, в чём проблема.
Иногда и дурацкая невнимательность может сослужить злую службу. smile.gif

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)