Nastavení ověřování pomocí C++
Jednou z hlavních úloh IWbemLocator::ConnectServer pro rozhraní WMI je vrácení ukazatele na IWbemServices proxy. Prostřednictvím IWbemServices proxy můžete získat přístup k možnostem infrastruktury rozhraní WMI. Ukazatel na IWbemServices proxy má identitu procesu klientské aplikace, a ne identitu procesu IWbemServices. Proto pokud se pokusíte získat přístup k IWbemServices ukazatelem, můžete obdržet kód odepřený přístup, například E_ACCESSDENIED. Chcete-li se vyhnout chybě odepření přístupu, musíte nastavit identitu nového ukazatele voláním CoSetProxyBlanket rozhraní.
Zprostředkovatel může v oboru názvů nastavit zabezpečení tak, aby se nevracela žádná data, pokud v připojení k danému oboru názvů nepoužíváte ochranu soukromí paketů (PktPrivacy). Tím se zajistí, že se data šifrují, protože překračují síť. Pokud se pokusíte nastavit nižší úroveň ověřování, zobrazí se zpráva o odepření přístupu. Další informace naleznete v tématu Nastavení popisovačů zabezpečení oboru názvů.
Další informace o nastavení ověřování ve skriptování naleznete v tématu Nastavení výchozí úrovně zabezpečení procesu pomocí jazyka VBScript.
Nastavení zabezpečení na vzdáleném rozhraní IUnknown
V některých situacích se vyžaduje více přístupu k serveru, než jen ukazatel na proxy server. Někdy možná budete muset získat zabezpečené připojení k rozhraní proxy serveru IUnknown. Pomocí IUnknownmůžete dotazovat vzdálený systém na rozhraní a další nezbytné techniky.
Pokud je proxy umístěn ve vzdáleném počítači, server deleguje všechna volání na IUnknown rozhraní proxy na IUnknown rozhraní. Pokud například voláte QueryInterface na proxy serveru a požadované rozhraní nebylo součástí proxy serveru, proxy odešle volání vzdálenému serveru. Vzdálený server zase zkontroluje odpovídající podporu rozhraní. Pokud server podporuje rozhraní, COM zařizuje nový proxy server pro klienta, aby aplikace mohla používat nové rozhraní.
K problémům dochází v případě, že klient nemá přístupová oprávnění ke vzdálenému serveru, ale používá přihlašovací údaje uživatele, který to dělá. V takovém případě všechny pokusy o přístup QueryInterface na vzdáleném serveru selžou. Konečné vydání proxy serveru selže také, protože aktuální uživatel nemá přístup ke vzdálenému serveru. Příznakem tohoto je jedna nebo dvě sekundy prodlevy, než klientská aplikace selže při konečném uvolnění proxy. K chybě dochází, protože se com pokusil o přístup ke vzdálenému serveru pomocí výchozího nastavení zabezpečení aktuálního uživatele, které nezahrnují změněné přihlašovací údaje, které povolily přístup k serveru na prvním místě. Další informace naleznete v tématu Nastavení zabezpečení pro služby IWbemServices a další proxy servery.
Chcete-li se vyhnout neúspěšnému připojení, použijte CoSetProxyBlanket explicitně nastavit ověřování zabezpečení u ukazatele vráceného z IUnknown. Pomocí CoSetProxyBlanketmůžete zajistit, aby vzdálený server obdržel správnou identitu ověřování.
Následující příklad kódu ukazuje, jak použít CoSetProxyBlanket pro přístup ke vzdálenému rozhraní IUnknown.
SEC_WINNT_AUTH_IDENTITY_W* pAuthIdentity =
new SEC_WINNT_AUTH_IDENTITY_W;
ZeroMemory(pAuthIdentity, sizeof(SEC_WINNT_AUTH_IDENTITY_W));
pAuthIdentity->User = new WCHAR[32];
StringCbCopyW(pAuthIdentity->User,sizeof(L"MyUser"),L"MyUser");
pAuthIdentity->UserLength = wcslen(pAuthIdentity->User);
pAuthIdentity->Domain = new WCHAR[32];
StringCbCopyW(pAuthIdentity->Domain,sizeof(L"MyDomain"),L"MyDomain");
pAuthIdentity->DomainLength = wcslen(pAuthIdentity->Domain);
pAuthIdentity->Password = new WCHAR[32];
pAuthIdentity->Password[0] = NULL;
pAuthIdentity->PasswordLength = wcslen( pAuthIdentity->Password);
pAuthIdentity->Flags = SEC_WINNT_AUTH_IDENTITY_UNICODE;
IWbemServices* pWbemServices = 0;
// Set proxy security
hr = CoSetProxyBlanket(pWbemServices,
RPC_C_AUTHN_DEFAULT,
RPC_C_AUTHZ_NONE,
COLE_DEFAULT_PRINCIPAL,
RPC_C_AUTHN_LEVEL_DEFAULT,
RPC_C_IMP_LEVEL_IMPERSONATE,
pAuthIdentity,
EOAC_NONE
);
if (FAILED(hr))
{
cout << "Count not set proxy blanket. Error code = 0x"
<< hex << hr << endl;
pWbemServices->Release();
return 1;
}
// Set IUnknown security
IUnknown* pUnk = NULL;
pWbemServices->QueryInterface(IID_IUnknown, (void**) &pUnk);
hr = CoSetProxyBlanket(pUnk,
RPC_C_AUTHN_DEFAULT,
RPC_C_AUTHZ_NONE,
COLE_DEFAULT_PRINCIPAL,
RPC_C_AUTHN_LEVEL_DEFAULT,
RPC_C_IMP_LEVEL_IMPERSONATE,
pAuthIdentity,
EOAC_NONE
);
if (FAILED(hr))
{
cout << "Count not set proxy blanket. Error code = 0x"
<< hex << hr << endl;
pUnk->Release();
pWbemServices->Release();
delete [] pAuthIdentity->User;
delete [] pAuthIdentity->Domain;
delete [] pAuthIdentity->Password;
delete pAuthIdentity;
return 1;
}
// cleanup IUnknown
pUnk->Release();
//
// Perform a bunch of operations
//
// Cleanup
pWbemServices->Release();
delete [] pAuthIdentity->User;
delete [] pAuthIdentity->Domain;
delete [] pAuthIdentity->Password;
delete pAuthIdentity;
Poznámka
Když nastavíte zabezpečení na IUnknown rozhraní proxy, COM vytvoří kopii proxy, kterou nelze uvolnit, dokud nezavoláte CoUninitialize.
Související témata