Ställa in säkerhet på IWbemServices och andra proxyservrar
I C++ kan du ange säkerheten för hela processen genom att anropa CoInitializeSecurity innan du ansluter till WMI via IWbemLocator::ConnectServer. Du kan också ändra autentiseringsnivån, personifieringsnivån eller autentiseringstjänsten i ett anrop som hämtar en pekare till en WMI-proxy, till exempel IWbemServices eller IWbemCallResult. Genom att anropa CoSetProxyBlanket kan du också ändra autentiseringstjänsten (Kerberos, NTLM eller förhandla).
Skript och Visual Basic-program ställer endast in säkerhet på proxyservrar indirekt via anrop till SWbemServices och andra automatiseringsobjekt. Mer information om hur du ställer in och ändrar autentisering och personifiering i skript finns i Ange standardprocesssäkerhetsnivå med VBScript-.
Att ändra säkerhetsnivåer eller tjänster är främst ett problem när du ansluter till WMI på en fjärrdator som kör ett annat operativsystem. Mer information finns i Ansluta mellan olika operativsystem.
Ett klientprogram ansluter till en WMI-proxy med hjälp av en identitet. En identitet är ett dataobjekt som består av inställningar för användarnamn, lösenord och utfärdare. För ett WMI-klientprogram skapar anropet till IWbemLocator::ConnectServer-gränssnittet den första identiteten. Metoden ConnectServer tar identiteten i en uppsättning med tre parametrar, som du kan ställa in på NULL- för att ange den aktuella användaren. Du kan också ange en icke-NULL- parameter för att specificera en viss användare och domän. Om anropet lyckas returnerar ConnectServer en pekare genom vilken du kan komma åt en mängd olika fjärrprocesser, till exempel en WMI-tjänst eller Windows-operativsystemet direkt.
Liksom många COM-gränssnitt returnerar ConnectServer en pekare till en proxy. En proxy är ett dataobjekt som representerar en fjärrprocess, till exempel WMI eller en fjärrprovider. COM använder en proxy för att ge utvecklare åtkomst till fjärrdata som om data var lokala.
Följande WMI-gränssnitt använder proxyservrar:
IWbemServices (SWbemServices skriptobjekt)
IWbemRefresher (SWbemRefresher skriptobjekt)
WMI Refresher är ett specialfall eftersom det skickas en IWbemServices pekare, vars säkerhetsinställningar måste vara korrekt inställda. Mer information om hur du använder uppdateringsobjekt finns i Åtkomst till prestandadata i C++.
När du har fått en pekare till en fjärrprocess kan du göra en av två saker. Om du vet vad processen gör kan du välja att ställa in säkerheten på pekaren och komma åt processen normalt. Detta är fallet med de flesta pekare till en WMI-tjänst. Mer information finns i Ställa in säkerhetsnivåerna för en WMI-anslutning. Alternativt måste du komma åt ett annat COM-gränssnitt på proxyn, till exempel IUnknown::Release, via ett anrop till IUnknown-gränssnittet på proxyn.
Standardvärden och rekommendationer
Den distribuerade versionen av komponentobjektmodellen (DCOM) förhandlar om standardautentiseringstjänsten (Kerberos, NTLM eller Negotiate) och du kan inte ange standardautentiseringstjänsten med CoInitializeSecurity. Om du anger RPC_C_AUTHN_DEFAULT i parametern för autentiseringstjänsten för CoSetProxyBlanket kan DCOM välja lämplig tjänst. För fjärranslutningar är standardtjänsten Negotiate, som är den rekommenderade tjänsten för program som fungerar i både Kerberos- och icke-Kerberos-domäner. För lokala anslutningar är standardautentiseringstjänsten NT LAN Manager (NTLM).
I följande kodexempel visas standardautentiseringstjänsten som används.
// The pWbemServices variable is of type IWbemServices*
HRESULT hr = CoSetProxyBlanket(
pWbemServices, //Proxy
RPC_C_AUTHN_DEFAULT, //Authentication service
RPC_C_AUTHZ_DEFAULT, //Authorization service
COLE_DEFAULT_PRINCIPAL, //Server principal name used
// by authentication service
RPC_C_AUTHN_LEVEL_DEFAULT, //Authentication level
RPC_C_IMP_LEVEL_IMPERSONATE, //Impersonation level
COLE_DEFAULT_AUTHINFO, //Client identity
EOAC_DEFAULT //Capability flags
);
Kodexemplet i det här avsnittet kräver följande referens- och #include-instruktioner.
#define _WIN32_DCOM
#include <wbemidl.h>
#include <comdef.h>
#pragma comment(lib, "wbemuuid.lib")
För skriptning rekommenderar vi att du använder de standardvärden som DCOM väljer för fjärranrop. På den lokala datorn kan du inte ange en autentiseringstjänst för anrop till WMI. Mer information finns i Ställa in autentiseringstjänsten med VBScript- och konstruera en Moniker-sträng.