如何在WiX权限元素中指定AppPool身份?

3

我正在为.NET 4.0和IIS 7.5更新我们的一个安装程序,其中一个任务是将AppPool切换到使用其自己的身份。在使用WiX和IIS扩展时,我发现这相当简单,但是我遇到了两组额外的权限问题,主要是为了授予AppPool身份写入权限:

<Directory Id="LOGS_LOCATION" Name="logs">
    <!-- SourceDir\logs -->
    <Component Id="LogsFolder" Guid="{3A7C38C7-6604-4063-A425-D62427B21AEE}" KeyPath="yes" DiskId="1">
        <CreateFolder>
            <!-- SYSTEM account is automatically given access, but set other ACEs here to avoid Users having access -->
            <Permission User="Administrators" GenericAll="yes"/>
            <Permission User="[ASPNET_USER]" Domain="[ASPNET_DOMAIN]" GenericRead="yes" GenericWrite="yes" Read="yes" Delete="yes" DeleteChild="yes" Traverse="yes"/>
            <!-- IIS5: ASPNET, IIS6: NetworkService, IIS7: AppPool identity -->
        </CreateFolder>
    </Component>
</Directory>
ASPNET_USERASPNET_DOMAIN被定义为AppPoolNameIIS APPPOOL,其中AppPoolName完全匹配应用程序池的名称。

当我运行安装程序时,我收到一个1609错误,指出IIS APPOOL\AppPoolName不是有效的标识,安装失败了。我该如何将应用程序池标识指定给权限元素,以便Web应用程序可以写入日志目录?我需要使用不同的标识吗?

1个回答

7

这是一个有趣的问题。

当您创建一个Permission元素时,它会导致LockPermissions MSI表中的记录。根据MSDN所述,该表中的记录由InstallFilesCreateFoldersWriteRegistryValues操作提供。如果CreateFolder元素是父元素,则显然是CreateFolders操作。

与ApplicationPoolIdentity对应的安全帐户是在创建适当的AppPool时创建的。现在,ConfigureIIs操作在序列中比CreateFolders晚计划。将ConfigureIIs移动到CreateFolders之前显然没有任何意义。

我不确定这是否有效,但可以尝试以下步骤:

  • PermissionEx元素(从WiXUtilExtension中)替换Permission元素。它覆盖了Permission的功能,并增加了更多的灵活性(例如,不覆盖ACL,而是追加ACL)。

  • 如果还没有,请将SchedSecureObjects操作(负责处理PermissionEx内容的操作)移到ConfigureIIs操作(负责IIS内容的操作)之后。

现在设置权限时,适当的安全帐户应该已经存在。您还可以尝试更改引用方式,例如带或不带域部分。


有趣的是,我在 PermissionEx 中搜寻了一番,看看它是否可行,但没有找到任何明显的东西。 - alastairs
好的,我真的很困惑。在Wix 3.5中,如何安排SchedSecureObjects在ConfigureIIS之前进行?我已尝试了<Custom Action="ConfigureIIS" Before="SchedSecureObjects" />但是这一直在抱怨关于未解决的对CustomAction:ConfigureIIS的引用问题。我的wixproj文件中引用了WixUtilExtension和WixIIsExtension两个扩展。 - alastairs
2
一定是拼写错误了 - 应该是ConfigureIIs,最后一个's'不应该大写。 - Yan Sklyarenko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接