在 Wix 工具集中创建网站时如何设置 IIS AppPool 身份的权限?

How to set permission for IIS AppPool identity when creating website in Wix Toolset?

我正在编写 Wix 工具集安装程序以在 Windows Server 2016 上的 IIS 中安装 Angular + asp.net 核心应用程序。我创建了一个新网站和一个新应用程序池.我想在新创建的网站文件夹路径上授予对应用程序池标识的完全权限。 我按照此处给出的步骤操作:https://www.codeproject.com/Articles/115036/Creating-WIX-Installer-for-ASP-NET-Web-Application?所以我有 3 个文件:

我在 IISConfiguration.wxs 中设置了网站和权限。

<DirectoryRef Id="WEBSITE">    
        <Component Id="WebSiteSiteNameCmp" Guid="{ED376FD7-D4DB-4675-8BF4-1DCC1AF1C66B}" KeyPath="yes" >
            <iis:WebSite Id="WebSiteName"
                  Description='WebSiteName'
                  Directory="WEBSITE"
                  AutoStart="no"
                  ConfigureIfExists="yes"
                  StartOnInstall="no" >
              <iis:WebAddress Id="WebSiteAdressHttps" Port="443" IP="*" Secure="yes"/>
              <iis:WebAddress Id="WebSiteAdressHttp" Port="80" IP="*" Secure="no"/>
              <iis:WebDirProperties Id="WebSiteProperties" AnonymousAccess="yes"
                BasicAuthentication="no" WindowsAuthentication="no" />
              <iis:WebApplication Id="WebSiteNameSite" Name="WebSite" WebAppPool="WebSiteAppPool" />
            </iis:WebSite>
        </Component>

        <!-- Configuring app pool -->
        <Component Id="WebSiteAppPoolCmp" Guid="{009052A8-19AE-452e-AE34-6DC8E929DA08}"
        KeyPath="yes" Permanent="yes"  Win64="yes">
        <iis:WebAppPool Id="WebSiteAppPool" Name="WebSiteAppPoolName" ManagedPipelineMode="integrated" />
        </Component>
        <Component Id="WebSitePermissionCmp" Guid="{4425EFB0-A580-44B7-9C04-54EBD2E4ECB1}">
             <CreateFolder> 
               <util:PermissionEx User="IIS AppPool\WebSiteAppPoolName" GenericAll="yes"/> 
             </CreateFolder> 
         </Component>
    </DirectoryRef>

但随后安装程序回滚,因为在尝试设置文件夹权限时尚未创建 AppPool。我的日志中有以下错误:

 ExecSecureObjects: Error 0x80070534: failed to get sid for account: IIS AppPool\WebSiteAppPoolName.

"good"时如何设置权限?

我终于使用 icalcs 的自定义操作解决方案来管理新创建的应用程序池的权限。这是我在 Setup.wxs 中添加的内容:

<CustomAction Id='AppPoolPermission' Directory='WEBSITE' 
ExeCommand='"[SystemFolder]icacls.exe" "[INSTALLDIR]." /grant "IIS AppPool\WebSiteAppPoolName:(OI)(CI)F" /T' Return='check'/>   

<InstallExecuteSequence>
  <Custom Action='AppPoolPermission' After='InstallFinalize' />
</InstallExecuteSequence>

我还从 IISConfiguration.wxs 中删除了 WebSitePermissionCmp。 这不是理想的解决方案,但对我来说它有效。我不知道这是否可以仅使用 WIX 而无需自定义操作来实现。

另一个 post 关于这个问题:How to specify the AppPool Identity in a WiX Permission Element? 我不完全理解答案,但它似乎也在使用自定义操作。