Delen via


Installatiecontext bepalen

Een toepassing kan de functies MsiEnumProducts of MsiEnumProductsEx aanroepen om producten te inventariseren die op het systeem zijn geïnstalleerd of geadverteerd. Met deze functie kunt u alle producten opsommen die zijn geïnstalleerd in de installatiecontext per machine. Het kan de producten inventariseren die zijn geïnstalleerd in de context per gebruiker voor de huidige gebruiker. De toepassing kan informatie over de context van deze producten ophalen door de functies MsiGetProductInfoEx of MsiGetProductInfo aan te roepen.

Windows Installer kan producten installeren die moeten worden uitgevoerd met verhoogde bevoegdheden (systeembevoegdheden) voor niet-beheerdersgebruikers. Hiervoor is de machtiging van een beheerder vereist. Een product dat is geïnstalleerd met verhoogde bevoegdheden, wordt 'beheerd' genoemd. Alle producten die per machine zijn geïnstalleerd, worden beheerd. Producten die per gebruiker zijn geïnstalleerd, worden alleen beheerd als een lokale systeemagent een advertentie uitvoert tijdens het imiteren van een gebruiker. Dit is de methode die wordt gebruikt door softwaredistributie via Groepsbeleid. Per-gebruikerstoepassingen die zijn geïnstalleerd terwijl het AlwaysInstallElevated-beleid is ingesteld, worden niet beschouwd als beheerd. Door MsiIsProductElevatedaan te roepen, kan een toepassing controleren of een bepaald product wordt beheerd.

In het volgende voorbeeld ziet u hoe een toepassing context bepaalt met behulp van MsiEnumProducts, MsiGetProductInfoen MsiIsProductElevated.

#ifndef UNICODE
#define UNICODE
#endif //UNICODE

#ifndef _WIN32_MSI
#define _WIN32_MSI 200
#endif //_WIN32_MSI

#include <stdio.h>
#include <windows.h>
#include <msi.h>
#pragma comment(lib, "msi.lib")

const int cchGUID = 38;

UINT DetermineContextForAllProducts()
{
    WCHAR wszProductCode[cchGUID+1] = {0};
    WCHAR wszAssignmentType[10] = {0};
    DWORD cchAssignmentType = 
            sizeof(wszAssignmentType)/sizeof(wszAssignmentType[0]);
    DWORD dwIndex = 0;

    DWORD cchProductName = MAX_PATH;
    WCHAR* lpProductName = new WCHAR[cchProductName];
    if (!lpProductName)
    {
        return ERROR_OUTOFMEMORY;
    }

    UINT uiStatus = ERROR_SUCCESS;

    // enumerate all visible products
    do
    {
        uiStatus = MsiEnumProducts(dwIndex,
                          wszProductCode);
        if (ERROR_SUCCESS == uiStatus)
        {
            cchAssignmentType = 
                sizeof(wszAssignmentType)/sizeof(wszAssignmentType[0]);
            BOOL fPerMachine = FALSE;
            BOOL fManaged = FALSE;

            // Determine assignment type of product
            // This indicates whether the product
            // instance is per-user or per-machine
            if (ERROR_SUCCESS == 
                MsiGetProductInfo(wszProductCode,INSTALLPROPERTY_ASSIGNMENTTYPE,wszAssignmentType,&cchAssignmentType))
            {
                if (L'1' == wszAssignmentType[0])
                    fPerMachine = TRUE;
            }
            else
            {
                // This halts the enumeration and fails. Alternatively the error
                // could be logged and enumeration continued for the
                // remainder of the products
                uiStatus = ERROR_FUNCTION_FAILED;
                break;
            }

            // determine the "managed" status of the product.
            // If fManaged is TRUE, product is installed managed
            // and runs with elevated privileges.
            // If fManaged is FALSE, product installation operations
            // run as the user.
            if (ERROR_SUCCESS != MsiIsProductElevated(wszProductCode,
                                         &fManaged))
            {
                // This halts the enumeration and fails. Alternatively the error
                // could be logged and enumeration continued for the
                // remainder of the products
                uiStatus = ERROR_FUNCTION_FAILED;
                break;
            }

            // obtain the user friendly name of the product
            UINT uiReturn = MsiGetProductInfo(wszProductCode,INSTALLPROPERTY_PRODUCTNAME,lpProductName,&cchProductName);
            if (ERROR_MORE_DATA == uiReturn)
            {
                // try again, but with a larger product name buffer
                delete [] lpProductName;

                // returned character count does not include
                // terminating NULL
                ++cchProductName;

                lpProductName = new WCHAR[cchProductName];
                if (!lpProductName)
                {
                    uiStatus = ERROR_OUTOFMEMORY;
                    break;
                }

                uiReturn = MsiGetProductInfo(wszProductCode,INSTALLPROPERTY_PRODUCTNAME,lpProductName,&cchProductName);
            }

            if (ERROR_SUCCESS != uiReturn)
            {
                // This halts the enumeration and fails. Alternatively the error
                // could be logged and enumeration continued for the
                // remainder of the products
                uiStatus = ERROR_FUNCTION_FAILED;
                break;
            }

            // output information
            wprintf(L" Product %s:\n", lpProductName);
            wprintf(L"\t%s\n", wszProductCode);
                        wprintf(L"\tInstalled %s %s\n", 
                fPerMachine ? L"per-machine" : L"per-user",
                fManaged ? L"managed" : L"non-managed");
        }
        dwIndex++;
    }
    while (ERROR_SUCCESS == uiStatus);

    if (lpProductName)
    {
        delete [] lpProductName;
        lpProductName = NULL;
    }

    return (ERROR_NO_MORE_ITEMS == uiStatus) ? ERROR_SUCCESS : uiStatus;
}

MsiEnumProducts

MsiGetProductInfo

MsiGetProductInfoEx

MsiIsProductElevated

installeren van een pakket met verhoogde bevoegdheden voor een niet-beheerder

reclame maken voor een Per-User-toepassing die moet worden geïnstalleerd met verhoogde bevoegdheden

Installatiecontext