自訂動作安全性

安裝程式預設會以使用者權限執行自訂動作,以限制對系統的自訂動作存取。 如果已安裝受控應用程式,或系統原則已針對提高許可權指定,安裝程式可能會以較高的權限執行自訂動作。

您應該使用 MsiHiddenProperties 屬性和 msidbCustomActionTypeHideTarget 來防止記錄自訂動作所使用的敏感性資訊。 如需 msidbCustomActionTypeHideTarget 的詳細資訊,請參閱 自訂動作隱藏目標選項

在設定 CustomActionData 屬性之後清除此屬性,以確保不再提供敏感性資料。 下列範例程式碼是立即 DLL 自訂動作所使用的程式碼片段,該動作會設定資料以供稱為 「MyDeferredCA」 的延後自訂動作使用:

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

UINT __stdcall MyImmediateCA(MSIHANDLE hInstall)
{
    // set up information for deferred custom action called MyDeferredCA
    const TCHAR szValue[] = TEXT("data");
    UINT uiStat = ERROR_INSTALL_FAILURE;
    if (ERROR_SUCCESS == MsiSetProperty(hInstall, TEXT("MyDeferredCA"), szValue))
    {
        uiStat = MsiDoAction(hInstall, TEXT("MyDeferredCA"));

        // clear CustomActionData property
        if (ERROR_SUCCESS != MsiSetProperty(hInstall, TEXT("MyDeferredCA"), TEXT("")))
            return ERROR_INSTALL_FAILURE;
    }

    return (uiStat == ERROR_SUCCESS) ? uiStat : ERROR_INSTALL_FAILURE;    
}

請注意,只有 延後執行自訂動作 可以使用 msidbCustomActionTypeNoImpersonate 屬性。 如需詳細資訊,請參閱 自訂動作In-Script執行選項

如果未針對自訂動作設定 msidbCustomActionTypeNoImpersonate 位,安裝程式會以使用者層級許可權執行自訂動作。 如需詳細資訊,請參閱 自訂動作In-Script執行選項

如果 msidbCustomActionTypeNoImpersonate 位已設定,且受控應用程式是以系統管理員許可權安裝,安裝程式可能會以較高的許可權執行自訂動作。 不過,如果使用者嘗試在沒有系統管理員許可權的情況下安裝受控應用程式,安裝程式會以使用者層級許可權執行應用程式,而不論 是否已設定 msidbCustomActionTypeNoImpersonate

請注意,即使未設定 msidbCustomActionTypeNoImpersonate 位,自訂動作仍可能會以系統許可權執行。 如果系統管理員使用 Windows 2000 在執行終端機伺服器角色服務的伺服器上為所有使用者安裝應用程式,且動作未以 msidbCustomActionTypeTSAware標示,就會發生這種情況。 如果沒有任何使用者內容時叫用安裝,自訂動作也可能以系統許可權執行。 例如,如果在 Windows 2000 應用程式部署叫用的安裝期間,目前沒有登入的使用者。

建立自己的自訂動作時,您應該一律使用安全方法來撰寫自訂動作。 如需詳細資訊,請參閱 保護自訂動作的指導方針