Сущность технологии СОМ. Библиотека программиста
Шрифт:
[object, uuid(EEDD23EO-8410-11CE-A1C3-08002B2B8D8F)]
interface IAccessControl : IUnknown {
// add access allowed rights for a list of users
// добавляем разрешенные права доступа для списка пользователей
HRESULT GrantAccessRights([in] PACTRL_ACCESSW pAccessList);
// explicitly set the access rights for a list of users
// явно устанавливаем права доступа для списка пользователей
HRESULT SetAccessRights([in] PACTRL_ACCESSW pAccessList
// users+rights
// пользователи + Права
);
// set the owner/group IDs of the descriptor
//
HRESULT Set0wner(
[in] PTRUSTEEW pOwner, // owner ID
// ID владельца
[in] PTRUSTEEW pGroup // group ID
// ID группы
);
// remove access rights for a list of users
// удаляем права доступа для списка пользователей
HRESULT RevokeAccessRights(
[in] LPWSTR lpProperty, // not used
// не используется
[in] ULONG cTrustees, // how many users
// сколько имеется пользователей
[in, size_is(cTrustees)] TRUSTEEW prgTrustees[] // users
// пользователи
);
// get list of users and their rights
// получаем список пользователей и их прав
HRESULT GetAllAccessRights(
[in] LPWSTR lpProperty, // not used
// не используется
[out] PACTRL_ACCESSW *ppAccessList, // users+rights
// пользователи + права
[out] PTRUSTEEW *ppOwner, // owner ID
// ID владельца
[out] PTRUSTEEW *ppGroup // group ID
// ID группы
);
// called by COM to allow/deny access to an object
// вызывается COM для разрешения/запрета доступа к объекту
HRESULT IsAccessAllowed(
[in] PTRUSTEEW pTrustee, // caller's ID
// ID вызывающей программы
[in] LPWSTR lpProperty, // not used
// не используется
[in] ACCESS_RIGHTS Rights, // COM_RIGHTS_EXECUTE
[out] BOOL *pbAllowed // yes/no!
// да/нет!
);
}
Этот интерфейс предназначен для того, чтобы разработчики могли создавать объекты контроля доступа на основе статических таблиц данных, преобразующих имена принципалов в права доступа. Интерфейс основывается на новом Windows NT 4.0 API защиты на базе опекуна (trustee), то есть пользователя, обладающего правами доступа к объекту. Основным типом данных, используемым этим API, является TRUSTEE:
typedef struct _TRUSTEE_W {
struct _TRUSTEE_W *pMultipleTrustee;
MULTIPLE_TRUSTEE_OPERATION MultipleTrusteeOperation;
TRUSTEE_FORM TrusteeForm;
TRUSTEE_TYPE TrusteeType;
switch_is(TrusteeForm)]
union {
[case(TRUSTEE_IS_NAME)]
LPWSTR ptstrName;
[case(TRUSTEE_IS_SID)]
SID *pSid;
};
} TRUSTEE_W, *PTRUSTEE_W, TRUSTEEW, *PTRUSTEEW;
Этот тип данных используется для описания принципала защиты. Первые два параметра, pMultipleTrustee и MultipleTrusteeOperation, позволяют вызывающей программе отличать настоящие регистрационные имена (logins – логины) от попыток заимствования прав. Пятый параметр, ptstrName/pSid, содержит либо идентификатор защиты NT (security identifier – SID), либо текстовое имя учетной записи, подлежащее идентификации. При этом третий параметр, TrusteeForm, указывает,
Для связывания опекуна с полномочиями, которые ему даны или в которых ему отказано, в Win32 API предусмотрен тип данных ACTRL_ACCESS_ENTRY:
typedef struct _ACTRL_ACCESS_ENTRYW {
TRUSTEE_W Trustee; // who?
// кто?
ULONG fAccessFlags; // allowed/denied?
// разрешено/запрещено?
ACCESSRIGHTS Access;// which rights?
// какие права?
ACCESSRIGHTS ProvSpecificAccess; // not used by COM
// в COM не используется
INHERIT_FLAGS Inheritance; // not used by COM
// в COM не используется
LPWSTR lpInheritProperty; // not used by COM
// в COM не используется
} ACTRL_ACCESS_ENTRYW, *PACTRL_ACCESS_ENTRYW;
а также тип данных для создания списков элементов для опекунов/полномочий:
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 [1] . Следующий фрагмент кода использует эту реализацию для создания объекта контроля доступа, разрешающего доступ для встроенной учетной записи SYSTEM и для пользователей в группе Sales\Managers, но запрещающего доступ для отдельного пользователя Sales\Bob:
1 Этот класс также реализует интерфейс IPersistStream. Его сериализованный формат распознается SCM с целью записи в элемент реестра AccessPermission во время саморегистрации.