Yükleme Bağlamı Belirleme
Bir uygulama, sistemde yüklü veya tanıtılan ürünleri listelemek için MsiEnumProductsveya MsiEnumProductsEx işlevlerini çağırabilir. Bu işlev, makine başınayükleme bağlamında yüklü olan tüm ürünleri numaralandırabilir. Geçerli kullanıcının kullanıcı başına bağlamında yüklü olan ürünleri numaralandırabilir. Uygulama, MsiGetProductInfoEx veya MsiGetProductInfoişlevleriniçağırarak bu ürünlerin bağlamı hakkında bilgi alabilir.
Windows Installer, yönetici olmayan kullanıcılar için yükseltilmiş (sistem) ayrıcalıklarıyla çalışacak ürünleri yükleyebilir. Bunun için yönetici kullanıcının izni gerekir. Yükseltilmiş ayrıcalıklarla yüklenen bir ürüne "yönetilen" adı verilir. Makine başına yüklenen tüm ürünler yönetilir. Kullanıcı başına yüklenen ürünler, yalnızca yerel sistem aracısı bir kullanıcıyı taklit ederken bir reklam gerçekleştirirse yönetilir. Bu, Grup İlkesiaracılığıyla yazılım dağıtımı tarafından kullanılan yöntemdir. AlwaysInstallElevated ilkeleri etkinleştirildiğinde kullanıcı başına yüklenen uygulamalar yönetilen olarak kabul edilmez. bir uygulama, MsiIsProductElevatedçağırarak belirli bir ürünün yönetilip yönetilmediğini denetleyebiliyor.
Aşağıdaki örnek, MsiGetProductInfove MsiIsProductElevatedMsiEnumProductskullanarak uygulamanın bağlamı nasıl belirlediğini gösterir.
#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;
}
İlgili konular
-
Yönetici Olmayan bir için Yükseltilmiş Ayrıcalıklarla Paket Yükleme
-
Yükseltilmiş Ayrıcalıklarla Yüklenecek Per-User Bir Uygulamayı Tanıtma