Udostępnij za pośrednictwem


Określanie kontekstu instalacji

Aplikacja może wywoływać funkcje MsiEnumProducts lub MsiEnumProductsEx, aby wyliczyć produkty zainstalowane lub anonsowane w systemie. Ta funkcja może wyliczyć wszystkie produkty zainstalowane w kontekście instalacji na maszynę . Może on wyliczać produkty zainstalowane w kontekście poszczególnych użytkowników dla bieżącego użytkownika. Aplikacja może pobrać informacje o kontekście tych produktów, wywołując funkcje MsiGetProductInfoEx lub MsiGetProductInfo.

Instalator Windows może instalować produkty do uruchamiania z podwyższonym poziomem uprawnień (systemu) dla użytkowników niebędących administratorami. Wymaga to uprawnienia użytkownika administratora. Produkt instalowany z podwyższonym poziomem uprawnień jest nazywany "zarządzanym". Wszystkie zainstalowane produkty na maszynę są zarządzane. Zainstalowane produkty dla poszczególnych użytkowników są zarządzane tylko wtedy, gdy agent systemowy działający lokalnie wykonuje reklamę, podszywając się pod użytkownika. Jest to metoda używana do wdrażania oprogramowania za pomocą Zasad grupy . Aplikacje dla poszczególnych użytkowników zainstalowane wtedy, gdy zasady AlwaysInstallElevated są ustawione, nie są traktowane jako zarządzane. Wywołując MsiIsProductElevated, aplikacja może sprawdzić, czy dany produkt jest zarządzany.

W poniższym przykładzie pokazano, jak aplikacja określa kontekst przy użyciu MsiEnumProducts, MsiGetProductInfoi 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

Instalowanie pakietu z podwyższonymi uprawnieniami dla użytkownika, który nie jest administratorem

anonsowanie aplikacji Per-User do zainstalowania z podwyższonym poziomem uprawnień

Kontekst instalacji