WIX-MSI: удаление пароля разрешено неудачно, если msiexec убит - PullRequest
1 голос
/ 28 марта 2019

У нас есть проект MSI WIX и DLL пользовательских действий. При удалении запускается пользовательское действие, запрашивающее у пользователя пароль и проверяющее пароль, чтобы разрешить удаление.

Пользовательское действие :

<CustomAction Id="CA_Uninstall"
              BinaryKey="BIN"
              DllEntry="ValidatePassword"
              Execute="immediate"
              Impersonate="yes"
              Return="check" />

Вызов настраиваемого действия :

<Custom Action="CA_ProtectUninstall" After="InstallInitialize">
<![CDATA[Uninstalling = "true"]]>
</Custom>

Настраиваемое действие Внутренне создает диалоговое окно MFC и проверяет пароль. Часть пользовательского действия :

    UINT er = ERROR_INSTALL_FAILURE;

    // launch MFC dialog and validates password
    int ret = dlg.DoModal(hParent);

    er = ret == IDOK ? ERROR_SUCCESS : ERROR_INSTALL_USEREXIT;
    return WcaFinalize(er);

Проблема: Это настраиваемое действие работает нормально и правильно проверяет пароль. При каждом удалении Windows запускает процесс msiexec.exe в контексте пользователя. Теперь есть 2 процесса msiexec.exe, один в системе, а другой в пользовательском контексте. Во время удаления, когда отображается диалоговое окно пароля, если пользователь убивает процесс msiexec из контекста пользователя, диалоговое окно пароля закрывается, и удаление завершается успешно без проверки пароля.

Может кто-нибудь помочь мне решить эту проблему? Пожалуйста, не стесняйтесь предложить любой лучший вариант для обработки удаления, защищенного паролем.

Удаление журналов для пользовательских действий :

MSI (s) (B4:A8) [16:21:20:873]: Doing action: CA_Uninstall
MSI (s) (B4:A8) [16:21:20:873]: Note: 1: 2205 2:  3: ActionText 
Action ended 16:21:20: InstallInitialize. Return value 1.
MSI (s) (B4:90) [16:21:20:885]: Invoking remote custom action. DLL: C:\WINDOWS\Installer\MSI4913.tmp, Entrypoint: ValidatePassword
Action start 16:21:20: CA_Uninstall.
MSI (s) (B4:90) [16:21:29:686]: Leaked MSIHANDLE (252) of type 790541 for thread 20604
MSI (s) (B4:90) [16:21:29:686]: Note: 1: 2769 2: CA_Uninstall 3: 1 
MSI (s) (B4:90) [16:21:29:686]: Note: 1: 2205 2:  3: Error 
MSI (s) (B4:90) [16:21:29:686]: Note: 1: 2228 2:  3: Error 4: SELECT `Message` FROM `Error` WHERE `Error` = 2769 
ValidatePassword:  ValidatePassword: UILevel=3
DEBUG: Error 2769:  Custom Action CA_Uninstall did not close 1 MSIHANDLEs.
The installer has encountered an unexpected error installing this package. This may indicate a problem with this package. The error code is 2769. The arguments are: CA_Uninstall, 1, 
...