Автоматизация. Олицетворять установщик Windows из службы Windows - PullRequest
0 голосов
/ 02 марта 2012

В настоящее время я работаю над приложением 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...