Сущность технологии COM




Контроль доступа - часть 5


а также тип данных для создания списков элементов для опекунов/полномочий:

typedef struct _ACTRL_ACCESS_ENTRY_LISTW { ULONG cEntries; [size_is(cEntries)] ACTRL_ACCESS_ENTRYW *pAccessList; } ACTRL_ACCESS_ENTRY_LISTW, *PACTRL_ACCESS_ENTRY_LISTW;

И наконец, в Win32 предусмотрено еще два дополнительных типа данных, которые позволяют связывать элементы списков доступа с именованными признаками.

typedef struct _ACTRL_PROPERTY_ENTRYW { LPWSTR lpProperty; // not used by COM // не используется в COM ACTRL_ACCESS_ENTRY_LISW *pAccessEntryList; ULONG fListFlags; // not used by COM // не используется в COM } ACTRL_PROPERTY_ENTRYW, *PACTRL_PROPERTY_ENTRYW;

typedef struct _ACTRL_ALISTW { ULONG cEntries; [size_is(cEntries)] ACTRL_PROPERTY_ENTRYW *pPropertyAccessList; } ACTRL_ACCESSW, *PACTRL_ACCESSW;

Хотя в настоящее время COM не использует возможности контроля по каждому признаку, заключенному в этих двух типах данных, тип данных ACTRL_ACCESSW все же используется в интерфейсе IAccessControl для представления списков контроля доступа. Дело в том, что этот интерфейс широко используется также в службе директорий Windows NT 5.0, где требуется контроль доступа по каждому признаку.

В COM предусмотрена реализация интерфейса IAccessControl (CLSID_DCOMAccessControl), которую вызывающие программы могут заполнять явными именами учетных записей и правами доступа, используя типы данных контроля доступа NT 4.0. Следующий фрагмент кода использует эту реализацию для создания объекта контроля доступа, разрешающего доступ для встроенной учетной записи SYSTEM и для пользователей в группе Sales\Managers, но запрещающего доступ для отдельного пользователя Sales\Bob:

HRESULT CreateAccessControl(IAccessControl * &rpac) { rpac = 0; // create default access control object // создаем объект контроля доступа по умолчанию HRESULT hr = CoCreateInstance(CLSID_DCOMAccessControl, 0, CLSCTX_ALL, IID_IaccessControl, (void**)&rpac); if (SUCCEEDED(hr)) { // build list of users/rights using NT4 security data types // создаем списов пользователей/прав, используя типы данных защиты из NT4 ACTRL_ACCESS_ENTRYW rgaae[] = { { { 0, NO_MULTIPLE_TRUSTEE, TRUSTEE_IS_NAME, TRUSTEE_IS_USER, L"Sales\\Bob" }, ACTRL_ACCESS_DENIED, COM_RIGHTS_EXECUTE, 0, NO_INHERITANCE, 0 }, { { 0, NO_MULTIPLE_TRUSTEE, TRUSTEE_IS_NAME, TRUSTEE_IS_GROUP, L"Sales\\Managers" }, ACTRL_ACCESS_ALLOWED, COM_RIGHTS_EXECUTE, 0, NO_INHERITANCE, 0 }, { { 0, NO_MULTIPLE_TRUSTEE, TRUSTEE_IS_NAME, TRUSTEE_IS_USER, L"NT AUTHORITY\\SYSTEM" }, ACTRL_ACCESS_ALLOWED, COM_RIGHTS_EXECUTE, 0, NO_INHERITANCE, 0 } }; ACTRL_ACCESS_ENTRY_LISTW aael = { sizeof(rgaae)/sizeof(*rgaae), rgaae }; ACTRL_PROPERTY_ENTRYW ape = { 0, &aael, 0 }; ACTRL_ACCESSW aa = { 1, &ape }; // present list of users+rights to Access Control object // представляем список пользователей + прав объекту контроля доступа hr = rpac->SetAccessRights(&aa); } return hr; }




Содержание  Назад  Вперед