В настоящее время я работаю над приложением Windows, которому необходимо развернуть некоторые модули под учетной записью текущего пользователя.Это приложение состоит из клиентского приложения (учетная запись USER) и службы Windows (учетная запись SYSTEM).IPC осуществляется через COM.Служба Windows отвечает за развертывание.Каждый модуль входит в пакет msi.
Я собираюсь установить запрошенный пакет под учетной записью USER .
Я использую установщик Windows (msiexec.exe) дляустановите пакеты следующим образом:
// Windows service's routine:
...
// Being impersonated as client:
token_t primary = PrimaryToken::FromCurrentThread();
...
::CreateProcessAsUserW(primary, pathMsiExec.c_str(), cmdLine.c_str(), ...)
...
WaitForProcess(msi);
...
Этот подход работает очень хорошо.Но я хочу задействовать API автоматизации установщика Windows , поскольку он позволяет мне использовать транзакции и может дать мне контроль над процессом установки.
Но я не могу заставить этот APIработа подражала.Следующий код может прояснить проблему:
// Windows service's routine:
// Being impersonated
ATL::CComQIPtr<WindowsInstaller::Installer> installerInstance;
GUID clsid;
check(::CLSIDFromProgID(L"WindowsInstaller.Installer", &clsid));
check(installerInstance.CoCreateInstance(clsid));
// Allow delegation of impersonation token
check(::CoSetProxyBlanket(
installerInstance
, RPC_C_AUTHN_DEFAULT
, RPC_C_AUTHZ_DEFAULT
, NULL
, RPC_C_AUTHN_LEVEL_DEFAULT
, RPC_C_IMP_LEVEL_DELEGATE
, NULL
, EOAC_DYNAMIC_CLOAKING))
installerInstance->InstallProduct(path, props)
//
Несмотря на то, что я делегирую маркер олицетворения клиента, установщик Windows всегда устанавливает пакеты под системной учетной записью.
Может кто-нибудь дать мне совет, какзаставить его работать правильно?ОС Windows 7, MSI v5.0