0

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

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

  • 在 Web 服务器级别,解锁“模块”下的 StaticCompressionModule 和 DynamicCompressionModule 条目。
  • 在我的网站级别,删除这些模块。

很简单——只有两个步骤,肯定是可编写脚本的??我可以使用 appcmd 执行第二部分,如下所示:

appcmd delete module "DynamicCompressionModule" /app.name:"Default Web Site/mysite"

但是,如果我在没有步骤 1 的情况下尝试这样做,那只会给我一个锁冲突。问题是,我一生都无法弄清楚如何使用 Powershell 或 appcmd 在 Web 服务器级别解锁单个模块。这肯定是可能的吗?

其他人遇到这个并且有任何掘金要分享吗?

谢谢,艾尔。

4

3 回答 3

0

我认为最初的问题已经解决了,但是由于我在尝试通过搜索解决类似问题时遇到了这个问题,所以这个答案可能会对其他人有所帮助。基本上问题是,即使您解锁该modules部分并将其复制到<location>允许覆盖的位置,所有本机模块(至少在 IIS 8 中)都已lockItem="true"在​​其上设置。

如果您使用appcmd.exe 删除然后重新创建本机模块条目,APPROOTlockItem将消失。用于实现 StaticCompressionModule 的命令,例如:

appcmd set config -section:system.webServer/modules /-[name='StaticCompressionModule']
appcmd set config -section:system.webServer/modules /+[name='StaticCompressionModule']

请注意,这适用于本机模块,因为这name是它们除了lockItem(notypepreCondition) 之外的唯一属性。就我而言,我希望能够<clear />全部默认handlersmodules专门添加我基于模块的应用程序所需的内容:

@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

批处理文件中的假设是所有<add>元素modules都具有 atype并且未锁定或不锁定,已锁定并且只有 aname是重要的。如果有人试图做类似于我对 Web 应用程序所做的事情,我会尝试在http://christophercrooker.com上写博客。

于 2012-09-03T00:42:56.430 回答
0

我从来没有这样做过,但试一试(首先在测试环境中运行)

Import-Module WebAdministration

# at the web server level, unlock the StaticCompressionModule 
# and DynamicCompressionModule entries under 'modules'.
Set-WebConfigurationProperty //modules -Name Collection -Value @{name='StaticCompressionModule';lockItem='false'} -PSPath IIS:\
Set-WebConfigurationProperty //modules -Name Collection -Value @{name='DynamicCompressionModule';lockItem='false'} -PSPath IIS:\

# at my web site level, delete these modules
Disable-WebGlobalModule -PSPath 'IIS:\Sites\Default Web Site' -Name DynamicCompressionModule
于 2012-05-16T08:16:04.037 回答
0

以下是 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:\
    }
}
于 2018-04-10T15:38:46.963 回答