自定义操作安全性

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

应该使用 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 属性。 有关详细信息,请参阅自定义操作脚本内执行选项

如果没有为自定义操作设置 msidbCustomActionTypeNoImpersonate 位,安装程序将以用户级权限运行自定义操作。 有关详细信息,请参阅自定义操作脚本内执行选项

如果设置了 msidbCustomActionTypeNoImpersonate 位且正在使用管理员权限安装托管应用程序,则安装程序可能会以提升的权限运行自定义操作。 但是,如果用户试图在没有管理员许可的情况下安装托管应用程序,安装程序将以用户级别权限运行该应用程序,而不管是否设置了 msidbCustomActionTypeNoImpersonate。

请注意,即使未设置 msidbCustomActionTypeNoImpersonate 位,自定义操作也可以系统权限运行。 如果管理员使用 Windows 2000 在运行终端服务器角色服务的服务器上为所有用户安装该应用程序,而该操作未使用 msidbCustomActionTypeTSAware 进行标记,则会发生这种情况。 如果在没有用户上下文时调用安装,则自定义操作也可以以系统权限运行。 例如,在 Windows 2000 应用程序部署调用的安装过程中没有当前处于登录状态的用户。

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