在 Windows 安装程序中,应该何时安排自定义操作来为 属性 生成值?

In Windows Installer, when should one schedule a custom action to generate a value for a property?

我要解决的问题是安装程序需要创建一个用户,该用户将用作 Windows 服务 运行 的身份。它适用于硬编码值。

接下来我想做的是在进行典型安装时通过生成加密强度高的密码来提供合理的默认值。没有人需要通过 RDP 或作为用户使用此凭据进行签名的用例。

我写了一个自定义操作来生成密码:

public class CustomActions
{
    [CustomAction]
    public static ActionResult GeneratePassword(Session session)
    {
        session.Log("Begin " + nameof(GeneratePassword));
        session["MY_PASSWORD"] = GenerateComplexPassword(24);
        session.Log("Completed " + nameof(GeneratePassword));
        return ActionResult.Success;
    }

    public static string GenerateComplexPassword(int length = 25)
    {
        // 
    }
}

Product.wxs中注册并引用了二进制文件。现在,我想查看生成的密码,因此它没有标记为隐藏或安全。一旦我让它工作,它就会出现。

<Wix>
    <Product>

        <Property Id="MY_USERNAME" Value="my-username" />
        <Property Id="MY_PASSWORD" Value=" " />  

        <Binary Id="MyCustomActions.CA.dll" src="$(var.CustomActions.TargetDir)\MyCustomActions.CA.dll" />

        <CustomAction Id="ValidateUsername"
                    Return="check"
                    Execute="immediate"
                    BinaryKey="MyCustomActions.CA.dll"
                    DllEntry="ValidateUsername" />

        <CustomAction Id="ValidatePassword"
                    Return="check"
                    Execute="immediate"
                    BinaryKey="MyCustomActions.CA.dll"
                    DllEntry="ValidatePassword" />

        <CustomAction Id="GeneratePassword"
                    Return="check"
                    Execute="immediate"
                    BinaryKey="MyCustomActions.CA.dll"
                    DllEntry="GeneratePassword" />

        <InstallExecuteSequence>
        <Custom Action="GeneratePassword" After="CostFinalize"></Custom>
        </InstallExecuteSequence>

    </Product>

    <Fragment>
        <Directory Id="TARGETDIR" Name="SourceDir">
            <!-- omitted -->
        </Directory>
    </Fragment>

    <Fragment>
        <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
        <!-- omitted -->
        </ComponentGroup>
    </Fragment>
</Wix>

当我 运行 安装程序时,日志中没有迹象表明 属性 MY_PASSWORD 已被自定义操作更新,或者自定义操作曾被调用过。

但是,我的 UI 确实显示调用了 ValidateUsernameValidatePassword 操作。

如何安排自定义操作,以便在显示对话框时,属性 已经设置好?

您可以启用日志并查看Custom element's condition is evaluated. In your case, the inner text being empty evaluates to false and therefor the action wont execute. Set the inner text to 1 to always evaluate to true, or use a condition如何满足您的需要。