Installation WIX:如何在现有Web应用程序或网站上注册新的ISAPI扩展或脚本映射?

Installation WIX:如何在现有Web应用程序或网站上注册新的ISAPI扩展或脚本映射?,installation,wix,windows-installer,isapi,Installation,Wix,Windows Installer,Isapi,我见过元素,但因为它必须是的子元素,所以它似乎需要创建一个新的WebApplication。我不想那样 我想在现有网站上创建扩展(或脚本映射)。卸载时,网站应保留,但扩展(脚本映射条目)应删除 有人知道如何在WIX中做到这一点吗 如果我没有得到好的答案,我想我必须在InstallFinalize之前在脚本中完成它。我想不出在WIX中实现这一点的方法,所以我求助于自定义操作。我一直在写我所有的故事。我发现Javascript很容易使用,而且为此目的很健壮 但是我找不到从Javascript添加s

我见过元素,但因为它必须是的子元素,所以它似乎需要创建一个新的WebApplication。我不想那样

我想在现有网站上创建扩展(或脚本映射)。卸载时,网站应保留,但扩展(脚本映射条目)应删除

有人知道如何在WIX中做到这一点吗



如果我没有得到好的答案,我想我必须在InstallFinalize之前在脚本中完成它。

我想不出在WIX中实现这一点的方法,所以我求助于自定义操作。我一直在写我所有的故事。我发现Javascript很容易使用,而且为此目的很健壮

但是我找不到从Javascript添加scriptmap的方法,因为IIS元数据库更新需要使用VBArray数据类型,这在VBScript中受支持,但在Javascript中不受支持。哎呀

下面是VBScript中的代码

Function AddExtension_CA()

    VBSLogMessage("AddExtension_CA() ENTRY")
    Dim iis
    Set iis = GetObject("winmgmts://localhost/root/MicrosoftIISv2")

    dim siteName
    siteName = Session.Property("WEBSITE_NAME")

    VBSLogMessage "website name(" & siteName & ")"

    If (siteName <> "") Then
        Dim idir, dll
        idir = Session.Property("INSTALLDIR")
        dll = idir & "\MyIsapiExtension.dll"

        Dim query
        If (siteName <> "W3SVC") Then
            query = "SELECT * FROM IIsWebServerSetting WHERE Name = '" & siteName & "'"
        Else
            query = "SELECT * FROM IIsWebServiceSetting"
        End If

        Set results = iis.ExecQuery(query)
        Dim newMaps()   '' dynamically-sized Array

        '' two passes
        For t = 0 to 1
            Dim c
            c=0
            For Each item in results
                '' in pass 1, count them. 
                '' in pass 2, copy them.
                For i = 0 to Ubound(item.ScriptMaps)
                    If UCase(item.ScriptMaps(i).Extensions) <> ".IIRF" Then
                        If t = 1 Then
                            Set newMaps(c) = item.ScriptMaps(i)
                        End if
                        c = c+1
                    End If
                Next

                If t = 0 Then
                    ReDim Preserve newMaps(c)
                Else
                    VBSLogMessage("setting new filter")

                    Set newMaps(c) = iis.get("ScriptMap").SpawnInstance_()
                    newMaps(c).Extensions = ".iirf"
                    newMaps(c).ScriptProcessor= dll
                    newMaps(c).Flags = "1"
                    newMaps(c).IncludedVerbs = "GET,POST"
                    item.ScriptMaps = newMaps
                    item.Put_()
                End If
            Next
        Next

        VBSLogMessage("Allowing the DLL as an Extension")

        dim IIsWebServiceObj
        Set IIsWebServiceObj = GetObject("IIS://localhost/W3SVC")
        IIsWebServiceObj.AddExtensionFile dll, True, "GroupId", True, "Description of the Extension"
        Set IIsWebServiceObj = Nothing

    End If

    Set iis = Nothing

    VBSLogMessage("AddExtension_CA() EXIT")

    AddExtension_CA = 1   ' MsiActionStatus.Ok

End Function
函数AddExtension_CA()
VBSLogMessage(“AddExtension_CA()条目”)
模糊iis
设置iis=GetObject(“winmgmts://localhost/root/MicrosoftIISv2")
模糊站点名
siteName=Session.Property(“网站名称”)
VBSLogMessage“网站名称(&siteName&)”
如果是(siteName“”),则
Dim idir,dll
idir=Session.Property(“INSTALLDIR”)
dll=idir&“\MyIsapiExtension.dll”
模糊查询
如果(siteName“W3SVC”),则
query=“从iiswebserver设置中选择*,其中Name=”&siteName&“
其他的
query=“从IIsWebServiceSetting中选择*
如果结束
Set results=iis.ExecQuery(查询)
Dim newMaps()“”动态调整大小的数组
“两个通行证
对于t=0到1
dimc
c=0
对于结果中的每个项目
“”在过程1中,计算它们。
“”在过程2中,复制它们。
对于i=0到Ubound(item.ScriptMaps)
如果UCase(item.ScriptMaps(i).Extensions)“.IIRF”,那么
如果t=1,则
设置新映射(c)=项。脚本映射(i)
如果结束
c=c+1
如果结束
下一个
如果t=0,则
ReDim保留新地图(c)
其他的
VBSLogMessage(“设置新过滤器”)
Set newMaps(c)=iis.get(“ScriptMap”).SpawnInstance
新地图(c).Extensions=“.iirf”
newMaps(c).ScriptProcessor=dll
newMaps(c).Flags=“1”
newMaps(c).IncludedVerbs=“获取,发布”
item.ScriptMaps=newMaps
项目.放置()
如果结束
下一个
下一个
VBSLogMessage(“允许DLL作为扩展”)
dim iiSwebService北京
设置IIsWebServiceObj=GetObject(“IIS://localhost/W3SVC”)
IIsWebServiceObj.AddExtensionFile dll,True,“GroupId”,True,“扩展名说明”
设置IIsWebServiceObj=Nothing
如果结束
设置iis=Nothing
VBSLogMessage(“AddExtension_CA()退出”)
AddExtension_CA=1'MsiActionStatus。确定
端函数
以下是WIX代码:

<Fragment>
    <CustomAction Id="CA.AddExtension"
              BinaryKey="B.VBScript"
              VBScriptCall="AddExtension_CA"
              Execute="immediate"
              Return="check" />

    ....

....
另请参见:

.

我想不出在WIX中实现这一点的方法,所以我求助于自定义操作。我一直在写我所有的故事。我发现Javascript很容易使用,而且为此目的很健壮

但是我找不到从Javascript添加scriptmap的方法,因为IIS元数据库更新需要使用VBArray数据类型,这在VBScript中受支持,但在Javascript中不受支持。哎呀

下面是VBScript中的代码

Function AddExtension_CA()

    VBSLogMessage("AddExtension_CA() ENTRY")
    Dim iis
    Set iis = GetObject("winmgmts://localhost/root/MicrosoftIISv2")

    dim siteName
    siteName = Session.Property("WEBSITE_NAME")

    VBSLogMessage "website name(" & siteName & ")"

    If (siteName <> "") Then
        Dim idir, dll
        idir = Session.Property("INSTALLDIR")
        dll = idir & "\MyIsapiExtension.dll"

        Dim query
        If (siteName <> "W3SVC") Then
            query = "SELECT * FROM IIsWebServerSetting WHERE Name = '" & siteName & "'"
        Else
            query = "SELECT * FROM IIsWebServiceSetting"
        End If

        Set results = iis.ExecQuery(query)
        Dim newMaps()   '' dynamically-sized Array

        '' two passes
        For t = 0 to 1
            Dim c
            c=0
            For Each item in results
                '' in pass 1, count them. 
                '' in pass 2, copy them.
                For i = 0 to Ubound(item.ScriptMaps)
                    If UCase(item.ScriptMaps(i).Extensions) <> ".IIRF" Then
                        If t = 1 Then
                            Set newMaps(c) = item.ScriptMaps(i)
                        End if
                        c = c+1
                    End If
                Next

                If t = 0 Then
                    ReDim Preserve newMaps(c)
                Else
                    VBSLogMessage("setting new filter")

                    Set newMaps(c) = iis.get("ScriptMap").SpawnInstance_()
                    newMaps(c).Extensions = ".iirf"
                    newMaps(c).ScriptProcessor= dll
                    newMaps(c).Flags = "1"
                    newMaps(c).IncludedVerbs = "GET,POST"
                    item.ScriptMaps = newMaps
                    item.Put_()
                End If
            Next
        Next

        VBSLogMessage("Allowing the DLL as an Extension")

        dim IIsWebServiceObj
        Set IIsWebServiceObj = GetObject("IIS://localhost/W3SVC")
        IIsWebServiceObj.AddExtensionFile dll, True, "GroupId", True, "Description of the Extension"
        Set IIsWebServiceObj = Nothing

    End If

    Set iis = Nothing

    VBSLogMessage("AddExtension_CA() EXIT")

    AddExtension_CA = 1   ' MsiActionStatus.Ok

End Function
函数AddExtension_CA()
VBSLogMessage(“AddExtension_CA()条目”)
模糊iis
设置iis=GetObject(“winmgmts://localhost/root/MicrosoftIISv2")
模糊站点名
siteName=Session.Property(“网站名称”)
VBSLogMessage“网站名称(&siteName&)”
如果是(siteName“”),则
Dim idir,dll
idir=Session.Property(“INSTALLDIR”)
dll=idir&“\MyIsapiExtension.dll”
模糊查询
如果(siteName“W3SVC”),则
query=“从iiswebserver设置中选择*,其中Name=”&siteName&“
其他的
query=“从IIsWebServiceSetting中选择*
如果结束
Set results=iis.ExecQuery(查询)
Dim newMaps()“”动态调整大小的数组
“两个通行证
对于t=0到1
dimc
c=0
对于结果中的每个项目
“”在过程1中,计算它们。
“”在过程2中,复制它们。
对于i=0到Ubound(item.ScriptMaps)
如果UCase(item.ScriptMaps(i).Extensions)“.IIRF”,那么
如果t=1,则
设置新映射(c)=项。脚本映射(i)
如果结束
c=c+1
如果结束
下一个
如果t=0,则
ReDim保留新地图(c)
其他的
VBSLogMessage(“设置新过滤器”)
Set newMaps(c)=iis.get(“ScriptMap”).SpawnInstance
新地图(c).Extensions=“.iirf”
newMaps(c).ScriptProcessor=dll
newMaps(c).Flags=“1”
newMaps(c).IncludedVerbs=“获取,发布”
item.ScriptMaps=newMaps
项目.放置()
如果结束
下一个
下一个
VBSLogMessage(“允许DLL作为扩展”)
dim iiSwebService北京
设置IIsWebServiceObj=GetObject(“IIS://localhost/W3SVC”)
IIsWebServiceObj.AddExtensionFile dll,True,“GroupId”,True,“扩展名说明”
设置IIsWebServiceObj=Nothing
如果结束
设置iis=Nothing
VBSLogMessage(“AddExtension_CA()EXI