在脚本中删除IIS7中的模块

在脚本中删除IIS7中的模块,iis,powershell,iis-7,appcmd,Iis,Powershell,Iis 7,Appcmd,我有一个安装了WSU的Windows2008x64服务器,因此,使用32位应用程序池的坏网站。此问题是由于IIS的applicationHost.config文件中定义了压缩方案造成的。我们现在已经用一种相当肮脏的方式解决了这个问题,通过在32位版本的suscomp.dll上进行复制,但我相信一定有更好的方法 我可以在IIS7 GUI中以另一种方式解决它,如下所示: appcmd delete module "DynamicCompressionModule" /app.name:"Defaul

我有一个安装了WSU的Windows2008x64服务器,因此,使用32位应用程序池的坏网站。此问题是由于IIS的applicationHost.config文件中定义了压缩方案造成的。我们现在已经用一种相当肮脏的方式解决了这个问题,通过在32位版本的suscomp.dll上进行复制,但我相信一定有更好的方法

我可以在IIS7 GUI中以另一种方式解决它,如下所示:

appcmd delete module "DynamicCompressionModule" /app.name:"Default Web Site/mysite"
  • 在web服务器级别,解锁“模块”下的StaticCompressionModule和DynamicCompressionModule条目
  • 在我的网站级别,删除这些模块
足够简单-只有两个步骤,必须是脚本,当然??我可以使用appcmd完成第二部分,如下所示:

appcmd delete module "DynamicCompressionModule" /app.name:"Default Web Site/mysite"
但是,如果我尝试在没有步骤1的情况下执行此操作,那么这只会导致锁冲突。问题是,我一辈子都不知道如何使用Powershell或appcmd在web服务器级别解锁单个模块。这肯定是可能的吗

还有谁遇到过这个问题,有什么可以分享的吗

谢谢,
Al.

我从未这样做过,但尝试了一下(先在测试环境中运行)


我假设原来的问题已经解决了,但由于我在试图通过搜索解决类似问题时遇到了这个问题,也许这个答案会帮助其他人。基本上,问题是,即使您解锁
模块
部分并将其复制到允许覆盖的
中,所有本机模块(至少在IIS 8中)都设置了
lockItem=“true”

如果使用appcmd.exe删除,然后在Approt
lockItem
上重新创建本机模块条目,则该条目将消失。为StaticCompression模块实现该功能的命令,例如:

appcmd set config -section:system.webServer/modules /-[name='StaticCompressionModule']
appcmd set config -section:system.webServer/modules /+[name='StaticCompressionModule']
请注意,这适用于本机模块,因为
名称
是它们除了
锁定项
(无
类型
前提条件
)之外的唯一属性。在我的例子中,我希望能够
所有默认
处理程序
模块
,并专门为基于模块的应用程序添加所需的内容:

@echo off
setlocal
set iis=%SystemRoot%\System32\inetsrv\appcmd.exe
set iisx=%iis% /commit:apphost
set ws=config -section:system.webServer
%iisx% unlock %ws%/handlers
%iisx% unlock %ws%/modules
for /f "tokens=3 delims== " %%a in ('%iis% list %ws%/modules ^| find /v "type=" ^| find "add"') do %iisx% set %ws%/modules /-[name='%%~a'] && %iisx% set %ws%/modules /+[name='%%~a']
endlocal

批处理文件中的假设是,这里的所有
都是IIS7上的托管模块和本机模块(也适用于IIS 10)的实际工作方式,以及如何检查它们是否已解锁。我存储了一个要解锁的模块名数组,这些模块名在每次检查中都会循环使用

#need IIS module
Import-Module WebAdministration

#checking to see if module is locked, same for managed and native    
foreach($module in $modules)
{    
    $lock = Get-WebConfigurationLock -Filter "system.webServer/modules/add[@name='$module']" -PSPath IIS:\
    $isLocked = $lock -neq $null
}


#unlocking is different between managed and native modules, so I have a function to check what type the module is
function Is-ManagedModule([string]$ModuleName) {
    $Precondition = Get-WebConfigurationProperty -filter //modules -Name Collection[name="$ModuleName"] -PSPath IIS:\ | Select -ExpandProperty Precondition
    return $Precondition -eq "managedHandler"
}

#and then actually doing the unlock
foreach ($module in $modules)
{
    if (Is-ManagedModule $module)
    {
        #Unlocks managed modules
        Set-WebConfigurationProperty -Filter //modules -Name Collection -Value @{name="$module";lockItem='false'} -PSPath IIS:\
    }
    else
    {
        #Unlocks native modules
        Remove-WebConfigurationLock -Filter "system.webServer/modules/add[@name='$module']" -PSPath IIS:\
    }
}

在执行appcmd删除模块之前,您是否尝试过appcmd解锁配置部分:system.webServer/modules?是的,David,我解锁了模块配置部分..感谢上面的命令。但是,Set-WebConfiguration属性命令似乎不起作用。它们不会出错,但是如果我转到IIS管理器,我可以看到模块仍然被锁定。如果我运行Disable-WebGlobalModule命令,就会出现锁冲突。如果它能给我一些锁上东西的指示,那就真的很方便了!我以前没有使用过这个管理单元,因为我认为它在32位powershell提示符下不起作用(我的需要这样做),看起来我可能错了。我在我的Windows 7机器上运行了这些管理单元,它们似乎工作正常。对不起,我帮不了什么忙。谢伊,非常感谢你的帮助。令人恼火的接近…:)这看起来应该是可行的,但它没有:(有人找到其他脚本吗?