Megosztás a következőn keresztül:


A telepítési környezet meghatározása

Az alkalmazások meghívhatják az MsiEnumProducts vagy MsiEnumProductsEx függvényeket a rendszeren telepített vagy meghirdetett termékek számbavételéhez. Ez a függvény számba tudja sorolni a gépenkénti telepítési környezetben telepített összes terméket. Az aktuális felhasználó felhasználónkénti környezetében telepített termékeket számba tudja sorolni. Az alkalmazás a MsiGetProductInfoEx vagy MsiGetProductInfo függvény meghívásával lekérheti a termékek környezetével kapcsolatos információkat.

A Windows Installer olyan termékeket telepíthet, amelyeket emelt szintű (rendszerszintű) jogosultságokkal futtathat a nem rendszergazdai felhasználók számára. Ehhez rendszergazdai felhasználó engedélyére van szükség. Az emelt szintű jogosultságokkal telepített terméket "felügyeltnek" nevezzük. A gépenként telepített összes termék kezelése történik. A felhasználónként telepített termékek csak akkor kezelhetők, ha egy helyi rendszerügynök hirdetést végez a felhasználó megszemélyesítésével. Ez a módszer a szoftverek csoportházirend általi telepítésére szolgál . A AlwaysInstallElevated házirendek beállításakor telepített felhasználónkénti alkalmazások nem tekinthetők felügyeltnek. A MsiIsProductElevatedmeghívásával az alkalmazás ellenőrizheti, hogy egy adott termék felügyelt-e.

Az alábbi minta bemutatja, hogyan határozza meg egy alkalmazás a környezetet MsiEnumProducts, MsiGetProductInfoés MsiIsProductElevatedhasználatával.

#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

Csomag telepítése emelt szintű jogosultságokkal nem rendszergazdai felhasználók számára

Emelt szintű jogosultságokkal telepíthető Per-User-alkalmazás hirdetése

telepítési környezet