我目前正在开发需要在当前用户帐户下部署一些模块的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