Delen via


Toegangscontroles uitvoeren

Een toegangscontrole bepaalt of een beveiligingsdescriptor een opgegeven set toegangsrechten verleent aan de client of thread die is geïdentificeerd door een toegangstoken. U kunt de beveiligingsfunctie AccessCheck- aanroepen vanuit WMI-clienttoepassingen of -providers die zijn geschreven in C++ of C#. Scripts en Visual Basic-toepassingen kunnen geen toegangscontroles uitvoeren met behulp van de hier beschreven methode.

Clienttoepassingen moeten een toegangscontrole uitvoeren om de identiteit van de callback te bepalen wanneer resultaten worden geretourneerd naar het ontvangstpunt dat wordt geleverd door de asynchrone aanroep van de client.

Wanneer providers de clienttoepassing of het script dat gegevens aanvraagt, niet kunnen imiteren, moeten ze toegangscontroles uitvoeren op de volgende situaties:

  • Bij toegang tot resources die niet worden beveiligd door toegangsbeheerlijsten (ACL).
  • Wanneer de client verbinding heeft gemaakt op het imitatieniveau van RPC_C_LEVEL_IDENTIFY.

Notitie

C++ en C#-toepassingen kunnen bepalen of toegangscontroles worden uitgevoerd door een afzonderlijk proces. Scripts en Visual Basic-toepassingen kunnen een registersleutel lezen of wijzigen om ervoor te zorgen dat WMI toegangscontroles uitvoert. Zie Beveiliging instellen voor een Asynchrone aanroepvoor meer informatie.

 

Voor het codevoorbeeld in dit onderwerp zijn de volgende verwijzingen en #include instructies vereist om correct te compileren.

#include <lmcons.h>
#define _WIN32_DCOM
#define SECURITY_WIN32
#include <wbemidl.h>
#include <security.h>
#include <safestr.h>
#pragma comment(lib, "wbemuuid.lib")
#pragma comment(lib, "Secur32.lib")

In het volgende codevoorbeeld ziet u hoe u kunt controleren of het beveiligingstoken van een clienttoepassingsthread machtigingen bevat die geschikt zijn voor een opgegeven beveiligingsdescriptor. De functie gebruikt de tekenreeks 'domein\gebruiker' en retourneert de SID. Als de aanroep mislukt, retourneert de functie NULL-, anders moet de aanroeper de geretourneerde aanwijzer vrij maken.

BYTE * GetSid(LPWSTR pwcUserName)
{
    DWORD dwSidSize = 0, dwDomainSize = 0;
    SID_NAME_USE use;

    // first call is to get the size
    BOOL bRet = LookupAccountNameW(

      NULL,            // system name
      pwcUserName,     // account name
      NULL,            // security identifier
      &dwSidSize,      // size of security identifier
      NULL,            // domain name
      &dwDomainSize,   // size of domain name
      &use             // SID-type indicator
      );    

    if(bRet == FALSE && ERROR_INSUFFICIENT_BUFFER 
        != GetLastError())\
        return NULL;

    BYTE * buff = new BYTE[dwSidSize];

    if(buff == NULL)
        return NULL;

    WCHAR * pwcDomain = new WCHAR[dwDomainSize];

    if(pwcDomain == NULL)

    {
        delete [] buff;
        return FALSE;
    }

    // Call to LookupAccountNameW actually gets the SID
    bRet = LookupAccountNameW(

      NULL,           // system name
      pwcUserName,    // account name
      buff,           // security identifier
      &dwSidSize,     // size of security identifier
      pwcDomain,      // domain name
      &dwDomainSize,  // size of domain name
      &use            // SID-type indicator
      );    

    delete [] pwcDomain;

    if(bRet == FALSE)
    {
        delete [] buff;
        return NULL;
    }

    return buff;
}

// This returns true if the caller is coming 
//   from the expected computer in the expected domain.

BOOL IsAllowed(LPWSTR pwsExpectedDomain, 
   LPWSTR pwsExpectedMachine)
{

    WCHAR wCallerName[UNLEN + 1];
    DWORD nSize = UNLEN + 1;

// Impersonate the caller and get its name

    HRESULT hr = CoImpersonateClient();
    if(FAILED(hr))

        return FALSE;

    BOOL bRet = GetUserNameExW(NameSamCompatible, 
       wCallerName, &nSize);

    CoRevertToSelf();

    if(bRet == FALSE)

        return FALSE;


    // take the expected domain and lan manager 
    //   style name and create a SID.  In actual
    // production code, it would be more efficient 
    //   to do this only when necessary

    WCHAR wExpectedName[UNLEN + 1];

    HRESULT hrCopyCat;
    hrCopyCat = StringCchCopy(wExpectedName,
        sizeof(pwsExpectedDomain)*sizeof(WCHAR)+1, 
        pwsExpectedDomain);
    if (FAILED(hrCopyCat))
    {
        return FALSE;
    }
    hrCopyCat = 
        StringCchCat(wExpectedName,sizeof(wExpectedName)
        + 2*sizeof(WCHAR)+1, L"\\");
    if (FAILED(hrCopyCat))
    {
        return FALSE;
    }
    hrCopyCat = StringCchCat(wExpectedName,sizeof(wExpectedName)
        + sizeof(pwsExpectedMachine)*sizeof(WCHAR)+1, 
        pwsExpectedMachine);
    if (FAILED(hrCopyCat))
    {
        return FALSE;
    }
    hrCopyCat = StringCchCat(wExpectedName,sizeof(wExpectedName)
        + sizeof(WCHAR)+1, L"$");
    if (FAILED(hrCopyCat))
    {
        return FALSE;
    }
  

    // convert the two names to SIDs and compare.  
    // Note that SIDs are used since 
    //   the format of the names might vary.  

    BYTE * pCaller = GetSid(wCallerName);

    if(pCaller == NULL)

        return FALSE;

    BYTE * pExpected = GetSid(wExpectedName);

    if(pExpected == NULL)
    {
        delete [] pCaller;

        return FALSE;
    }

    bRet = EqualSid((PSID)pCaller, (PSID)pExpected);

    delete [] pCaller;
    delete [] pExpected;

    return bRet;
}

Juiste registratie kiezen

WMI-beveiliging onderhouden

uw provider beveiligen

toegang tot WMI-naamruimten