0

我需要以管理员身份而不是系统身份运行我的安装程序,因为它需要使用 Windows 身份验证连接到 SQL Server 数据库。根据我的研究,我需要将 MSIUSEREALADMINDETECTION 属性设置为“1”

我认为这些安装程序属性具有十六进制表示,如博客 http://blogs.msdn.com/b/astebner/archive/2007/05/28/2958062.aspx中所示

var msidbCustomActionTypeInScript = 0x00000400;
var msidbCustomActionTypeNoImpersonate = 0x00000800

设置值的脚本可在此处获得,但它不会为您提供 MSIUSEREALADMINDETECTION 的十六进制表示。有谁知道 MSIUSEREALADMINDETECTION 的十六进制表示?或者有更好的解决方案然后编辑安装程序构建后?

4

2 回答 2

1

您可以在您的计算机上的 Windows SDK 目录中找到此类标识符的定义。您没有提到 VS 版本,开始查找 c:\program files (x86)\microsoft sdks\windows\xx\include。如果你有 VS2012+ 然后从 Windows Kits 开始寻找。您对 MsiDefs.h 文件感兴趣。它包含:

// properties related to UAC
#define IPROPNAME_MSI_UAC_DEPLOYMENT_COMPLIANT TEXT("MSIDEPLOYMENTCOMPLIANT")
#define IPROPNAME_MSI_USE_REAL_ADMIN_DETECTION TEXT("MSIUSEREALADMINDETECTION")

还:

// execution scheduling flags               // default is execute whenever sequenced
msidbCustomActionTypeFirstSequence    = 0x00000100,  // skip if UI sequence already run
msidbCustomActionTypeOncePerProcess   = 0x00000200,  // skip if UI sequence already run in same process
msidbCustomActionTypeClientRepeat     = 0x00000300,  // run on client only if UI already run on client
msidbCustomActionTypeInScript         = 0x00000400,  // queue for execution within script
msidbCustomActionTypeRollback         = 0x00000100,  // in conjunction with InScript: queue in Rollback script
msidbCustomActionTypeCommit           = 0x00000200,  // in conjunction with InScript: run Commit ops from script on success

// security context flag, default to impersonate as user, valid only if InScript
msidbCustomActionTypeNoImpersonate    = 0x00000800,  // no impersonation, run in system context

您可以从中看出 MSIUSEREALADMINDETECTION 不是用数字表示的,它是一个属性的名称。您可以使用MsiSetProperty()设置属性值。有关此 MSDN 部分中的属性的更多信息

于 2013-08-10T12:46:06.930 回答
1

比编辑安装程序后期构建更好的解决方案是切换到另一个工具,例如 Windows Installer XML,它不会将您从底层 Windows Installer 功能中隐藏起来。

FWIW,当我必须进行构建后清理时,我倾向于创建转换,然后在构建后步骤中将转换应用于 MSI。这样,随着我的要求发生变化,我只需更新转换,而不必更改我的任何后期构建代码。

至于 MSIUSEREALADMINDETECTION 属性的十六进制值......你想多了。它是 1。您提到的另外 2 个是自定义操作的位掩码列中使用的常量,这就是它们具有十六进制值的原因……因此它们可以在逻辑上为或。

于 2013-08-10T10:36:17.357 回答