Verificatie instellen met C++
Een van de belangrijkste taken van IWbemLocator::ConnectServer voor WMI is het retourneren van een aanwijzer naar een IWbemServices proxy. Via de IWbemServices proxy hebt u toegang tot de mogelijkheden van de WMI-infrastructuur. De aanwijzer naar de IWbemServices proxy heeft echter de identiteit van het clienttoepassingsproces en niet de identiteit van het IWbemServices--proces. Als u probeert toegang te krijgen tot IWbemServices met de aanwijzer, kunt u daarom een code ontvangen die wordt geweigerd, zoals E_ACCESSDENIED. Om de fout 'Toegang geweigerd' te voorkomen, moet u de identiteit van de nieuwe aanwijzer instellen met een aanroep naar de CoSetProxyBlanket interface.
Een provider kan de beveiliging voor een naamruimte zo instellen dat er geen gegevens worden geretourneerd, tenzij u pakketprivacy (PktPrivacy) gebruikt in uw verbinding met die naamruimte. Dit zorgt ervoor dat gegevens worden versleuteld wanneer deze het netwerk kruisen. Als u een lager verificatieniveau probeert in te stellen, krijgt u een bericht dat de toegang is geweigerd. Zie voor meer informatie Namespace-beveiligingsdescriptoren instellen.
Zie Het standaardniveau voor procesbeveiliging instellen met VBScript-voor meer informatie over het instellen van verificatie in scripts.
Beveiliging instellen op een externe IUnknown-interface
In sommige situaties is meer toegang tot een server nodig dan alleen een aanwijzer naar een proxy. Soms moet u mogelijk een beveiligde verbinding maken met de IUnknown interface van de proxy. Met IUnknownkunt u het externe systeem opvragen voor interfaces en andere benodigde technieken.
Wanneer een proxy zich op een externe computer bevindt, delegeert de server alle aanroepen naar de IUnknown interface van de proxy naar de IUnknown interface. Als u bijvoorbeeld QueryInterface aanroept op een proxy en de aangevraagde interface geen deel uitmaakt van de proxy, verzendt de proxy de aanroep naar de externe server. Op zijn beurt controleert de externe server op de juiste interfaceondersteuning. Als de server de interface wel ondersteunt, zorgt COM voor het marshallen van een nieuwe proxy terug naar de client, zodat de toepassing de nieuwe interface kan gebruiken.
Er treden problemen op als de client geen toegangsmachtigingen heeft voor de externe server, maar de referenties gebruikt van een gebruiker die dat wel doet. In dit geval mislukt elke poging om toegang te krijgen tot QueryInterface op de externe server. De definitieve release op de proxy mislukt ook, omdat de huidige gebruiker geen toegang heeft tot de externe server. Een symptoom hiervan is een vertraging van een of twee seconden voordat de clienttoepassing de definitieve proxyrelease faalt. De fout treedt op omdat COM heeft geprobeerd toegang te krijgen tot de externe server met behulp van de standaardbeveiligingsinstellingen van de huidige gebruiker, die niet de gewijzigde referenties bevatten die toegang tot de server in de eerste plaats hebben toegestaan. Voor meer informatie, zie Het instellen van de beveiliging op IWbemServices en andere proxies.
Gebruik CoSetProxyBlanket om de beveiligingsverificatie expliciet in te stellen op de aanwijzer die is geretourneerd door IUnknownom de mislukte verbinding te voorkomen. Met CoSetProxyBlanketkunt u ervoor zorgen dat de externe server de juiste verificatie-id ontvangt.
In het volgende codevoorbeeld ziet u hoe u CoSetProxyBlanket- gebruikt voor toegang tot een externe IUnknown interface.
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;
Notitie
Wanneer u beveiliging instelt op de IUnknown interface van een proxy, maakt COM een kopie van de proxy die niet kan worden vrijgegeven totdat u CoUninitializeaanroept.
Verwante onderwerpen