自定义操作安全性

安装程序默认使用用户权限运行自定义操作,以限制对系统的自定义操作的访问。 如果安装了托管应用程序,或者系统策略已为提升的权限指定,安装程序可以使用提升的权限运行自定义操作。

应使用 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 应用程序部署调用的安装过程中当前没有登录用户。

创建自己的自定义操作时,应始终使用安全方法创作自定义操作。 有关详细信息,请参阅 保护自定义操作指南