自动化。从Windows服务模拟Windows Installer

时间:2012-03-02 10:33:56

标签: c++ com windows-services windows-installer impersonation

我目前正在开发需要在当前用户帐户下部署一些模块的Windows应用程序。此应用程序由客户端应用程序(USER帐户)和Windows服务(SYSTEM帐户)组成。 IPC通过COM完成。 Windows服务负责部署。每个模块都捆绑在msi包中。

我的目的是在 USER 帐户下安装请求的包。

我使用Windows Installer(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);
...

这种方法很好用。但我希望使用Windows Installer Automation API,因为它允许我使用事务并可以让我控制安装过程。

但是我无法让这个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

0 个答案:

没有答案