В одной из предыдущих глав было отмечено, что элемент данных
typedef struct _COAUTHINFO {
DWORD dwAuthnSvc;
DWORD dwAuthzSvc;
LPWSTR pwszServerPrincName;
DWORD dwAuthnLevel;
DWORD dwImpersonationLevel;
COAUTHIDENTITY * pAuthIdentityData;
DWORD dwCapabilities;
} COAUTHINFO;
Эти элементы данных соответствуют параметрам
Следующий фрагмент кода осуществляет активационный вызов, используя структуру
void CreateSecretChimp(IApe *&rpApe) {
rpApe = 0;
// create a COAUTHINFO that specifies privacy
// создаем COAUTHINFO, которая определяет секретность
COAUTHINFO cai = { RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, 0, RPC_C_AUTHN_LEVEL_PKT_PRIVACY, RPC_C_IMP_LEVEL_IDENTIFY, 0, 0 };
// issue an activation call using the COAUTHINFO
// осуществляем активационный вызов с использованием COAUTHINFO
COSERVERINFO csi = { 0, 0, &cai, 0 };
IApeClass *pac = 0;
hr = CoGetClassObject(CLSID_Chimp, CLSCTX_ALL, &csi, IID_IApeClass, (void**)&pac);
assert(SUCCEEDED(hr));
// the activation call occurred with encryption,
// but рас is using automatic security settings
// активационный вызов произошел с шифрованием,
// но пакет использует автоматические установки защиты
hr = pac->CreateApe(&rpApe);
pac->Release();
return hr;
}
Важно отметить, что, поскольку структура
// encrypt calls on IApeClass reference
// зашифровываем вызовы на ссылку на IApeClass CoSetProxyBlanket(pac, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, 0, RPC_C_AUTHN_LEVEL_PKT_PRIVACY, RPC_C_IMP_LEVEL_ANONYMOUS, 0, EOAC_NONE);
// issue call to create object
// осуществляем вызов для создания объекта
pac->CreateApe(&rpApe);
// encrypt calls on IApe reference
// зашифровываем вызовы на ссылку на IApe
CoSetProxyBlanket(rpApe, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, 0, RPC_C_AUTHN_LEVEL_PKT_PRIVACY, RPC_C_IMP_LEVEL_ANONYMOUS, 0, EOAC_NONE);
Использование явного вызова
Контроль доступа
Как уже упоминалось ранее в этой главе, каждый процесс COM может защитить сам себя от несанкционированного доступа. COM рассматривает контроль доступа на двух уровнях: права запуска (launch permissions) и права доступа (access permissions). Права запуска используются, чтобы определить, какие пользователи могут запускать серверные процессы при осуществлении активационных вызовов к SCM. Права доступа определяют, какие пользователи могут обращаться к объектам процесса после того, как сервер уже запущен. Оба типа контроля доступа можно сконфигурировать при помощи DCOMCNFG.EXE, но только права доступа могут быть заданы программно на этапе выполнения (поскольку после того, как сервер запущен, уже слишком поздно отказывать пользователю в правах запуска). Вместо этого право запуска предоставляется диспетчеру управления сервнсами SCM во время активации.