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




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


STDMETHODIMP_(ULONG) AddRef(void) { return 2; } STDMETHODIMP_(ULONG) Release(void) { return 1; }

// IAccessControl methods // методы IAccessControl

STDMETHODIMP GrantAccessRights(ACTRL_ACCESSW *) { return E_NOTIMPL; } STDMETHODIMP SetAccessRights(ACTRL_ACCESSW *) { return E_NOTIMPL; } STDMETHODIMP SetOwner(PTRUSTEEW, PTRUSTEEW) { return E_NOTIMPL; } STDMETHODIMP RevokeAccessRights(LPWSTR, ULONG, TRUSTEEW[]) { return E_NOTIMPL; } STDMETHODIMP GetAllAccessRights(LPWSTR, PACTRL_ACCESSW_ALLOCATE_ALL_NODES *, PTRUSTEEW *, PTRUSTEEW *) { return E_NOTIMPL; } // this is the only IAccessControl method called by COM // это единственный метод IAccessControl, вызванный COM STDMETHODIMP IsAccessAllowed( PTRUSTEEW pTrustee, LPWSTR lpProperty, ACCESS_RIGHTS AccessRights, BOOL *pbIsAllowed) { // verify that trustee contains a string // удостоверяемся, что опекун содержит строку if (pTrustee == 0 pTrustee->TrusteeForm != TRUSTEE_IS_NAME) return E_UNEXPECTED; // look for X or x and grant/deny based on presence // ищем "X" или "x" и в зависимости от его наличия // предоставляем или запрещаем *pbIsAllowed = wcsstr(pTrustee->ptstrName, L"x") != 0 wcsstr(pTrustee->ptstrName, L"X") != 0; return S_OK; } }

Если экземпляр вышеприведенного класса C++ зарегистрирован c CoInitializeSecurity:

XOnly xo; // declare an instance of the C++ class // объявляем экземпляр класса C++ hr = CoInitializeSecurity(static_cast<IAccessControl*>(&xo), -1, 0, 0, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IDENTIFY, 0, EOAC_ACCESS_CONTROL, // use IAccessControl // используем IAccessControl 0); assert(SUCCEEDED(hr));

то от пользователей, не имеющих "x" в именах своих учетных записей, никакие поступающие вызовы не будут приняты. Поскольку имя опекуна содержит в качестве префикса имя домена, этот простой тест также предоставит доступ учетным записям пользователей, принадлежащих к доменам, содержащим "x" в своих именах. Хотя этот тест доступа вряд ли будет слишком полезен, он демонстрирует технологию использования специального объекта IAccessControl с CoInitializeSecurity.

1

Этот класс также реализует интерфейс IPersistStream. Его сериализованный формат распознается SCM с целью записи в элемент реестра AccessPermission во время саморегистрации.




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