прочитать эти установки для отдельного интерфейсного заместителя. В качестве параметров, о которых вызывающая программа не беспокоится, могут быть переданы нулевые указатели. Метод

Все параметры методов
typedef struct _COAUTHIDENTITY {
OLECHAR *User;
// user account name
// имя учетной записи пользователя
ULONG UserLength;
// wcslen(User)
// длина имени пользователя
OLECHAR *Domain;
// Domain/Machine name
// имя домена/машины
ULONG DomainLength;
// wcslen(Domain)
// длина имени домена
OLECHAR *Password;
// cleartext password
// пароль открытым текстом
ULONG PasswordLength;
// wcslen(Password)
// длина пароля
ULONG Flags;
// must be SEC_WINNT_AUTH_IDENTITY_UNICODE
// должно быть SEC_WINNT_AUTH_IDENTITY_UNICODE
} COAUTHIDENTITY;
Эта структура позволяет клиентам делать вызовы методов COM как любым принципалам защиты,
Чаще всего метод
HRESULT Encrypt(IApe *pApe) {
IClientSecurity *pcs = 0;
// ask proxy manager for IClientSecurity interface
// запрашиваем интерфейс IClientSecurity у администратора заместителей
HRESULT hr = pApe->QueryInterface(IID_IClientSecurity, (void**)&pcs);
if (SUCCEEDED(hr)) {
hr = pcs->SetBlanket(pApe, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, 0, RPC_C_AUTHN_LEVEL_PKT_PRIVACY, RPC_C_IMP_LEVEL_IDENTIFY, 0, EOAC_NONE);
pcs->Release();
}
return hr;
}
В идеале вызывающая программа передаст этой функции скопированный интерфейсный заместитель. В противном случае с целью проведения операции копирования эту функцию можно было бы изменить следующим образом:
HRESULT DupeAndEncrypt(IApe *pApe, IApe * &rpSecretApe) {
rpSecretApe = 0;
IClientSecurity *pcs = 0;
// ask proxy manager for IClientSecurity interface
// запрашиваем интерфейс IClientSecurity у администратора заместителей
HRESULT hr = pApe->QueryInterface(IID_IClientSecurity, (void**)&pcs);
if (SUCCEEDED(hr)) {
hr = pcs->CopyProxy(pApe, (IUnknown**)&rpSecretApe);
if (SUCCEEDED(hr))
hr = pcs->SetBlanket (rpSecretApe, RPC_AUUTHN_WINNT, RPC_C_AUTHZ_NONE, 0, RPC_С_AUTHN_LEVEL_PKT_PRIVACY, RPC_C_IMP_LEVEL_IDENTIFY, 0, EOAC_NONE);
pcs->Release();
}
return hr;
}
Для удобства в COM API предусмотрены оберточные функции вокруг каждого из трех методов
// get security settings for interface proxy pProxy
// получаем установки защиты для интерфейсного заместителя
pProxy HRESULT CoQueryProxyBlanket([in] IUnknown *pProxy, [out] DWORD *pAuthnSvc, [out] DWORD *pAuthzSvc, [out] OLECHAR **pServerPrincName, [out] DWORD *pAuthnLevel, [out] DWORD *pImpLevel, [out] void **pAuthInfo, [out] DWORD *Capabilities);
// change security settings for interface proxy pProxy
// изменяем установки защиты для интерфейсного заместителя
pProxy HRESULT CoSetProxyBlanket([in] IUnknown *pProxy, [in] DWORD AuthnSvc, [in] DWORD AuthzSvc, [in] OLECHAR *pServerPrincName, [in] DWORD AuthnLevel, [in] DWORD ImpLevel, [in] void *pAuthInfo, [in] DWORD Capabilities);
// duplicate an interface proxy