繁体   English   中英

如何使用PowerShell cmdlet配置32位IIS网站或应用程序

[英]How to configure 32-bit IIS websites or applications using PowerShell cmdlets

我正在尝试更改ASP.NET临时文件的位置,以便可以在发布新版本期间清理它们。

因为很难找到特定网站的ASP.NET临时文件的位置,所以我决定在C:\\Windows\\Microsoft.NET\\Framework C:\\Windows\\Microsoft.NET\\Framework64位置下的虚拟目录应用程序只需将文件移动到磁盘上的特定位置即可进行清理,这样会更容易。

您可以通过修改system.web/compilation配置部分中的tempDirectory属性来执行此操作。

我们使服务器的构建和发布过程自动化,因此看起来很容易将代码添加到配置和发布脚本中。

但是在测试过程中,我发现32位应用程序的位置没有改变。

我使用的代码是:

Set-WebConfigurationProperty -pspath 'MACHINE/WEBROOT' -location 'MyWebSite' -filter 'system.web/compilation' -name 'tempDirectory' -value 'E:\Temporary ASP.NET Files\MyWebSite' -Clr v2.0

该代码可以正常工作,并将条目写入以下根Web.config文件: C:\\Windows\\Microsoft.NET\\Framework64\\v2.0.50727\\CONFIG\\web.config

例如

<location path="MyWebSite">
  <system.web>
    <compilation tempDirectory="E:\Temporary ASP.NET Files\MyWebSite" />
  </system.web>
</location>

请注意,如果没有-Clr v2.0参数,则将值写入C:\\Windows\\Microsoft.NET\\Framework64\\v4.0.30319\\Config\\web.config的CLR 4.0配置文件中。

您还可以在IIS配置编辑器中看到该条目: IIS配置编辑器显示指定的临时路径

问题是应用程序池设置为“启用32位应用程序”,因此该属性将被忽略。

如果我将上面显示的位置元素从C:\\Windows\\Microsoft.NET\\Framework64\\v2.0.50727\\CONFIG\\web.config手动移动到C:\\Windows\\Microsoft.NET\\Framework\\v2.0.50727\\CONFIG\\web.config

所做的更改有效,并且ASP.NET临时文件的确移动到了网站编译发生时指定的位置。

问题不是关于ASP.NET临时文件,而是一个更普遍的问题,即您打算在PowerShell中还是在IIS中配置32位应用程序? 我似乎无法做到这一点。 有许多32位应用程序仍需要配置。

还请注意,出于良好的原因,我选择使用根web.config来存储此值:

  1. ApplicationHost.config无法存储system.web配置
  2. 临时文件的位置在设计时不是已知的,而是由托管服务器配置确定的。 因此,无法在web.config文件中为应用程序本身指定此设置。

感谢您对这个问题的启发。

有两种解决方法。

  1. 使用32位appcmd.exe。 这是例子。

%windir%\\ syswow64 \\ cmd.exe%windir%\\ syswow64 \\ inetsrv \\ appcmd.exe设置配置-section:appSettings / +“ [key ='test',value ='test']” / commit:webroot / clr: 4.0

  1. 直接在Powershell上使用MWA。 这是例子。

$ iis =新对象Microsoft.Web.Administration.ServerManager $ wcm =新对象-TypeName Microsoft.Web.Administration.WebConfigurationMap -ArgumentList“ C:\\ Windows \\ Microsoft.NET \\ Framework \\ v4.0.30319 \\ CONFIG \\ machine。 config“,” C:\\ Windows \\ Microsoft.NET \\ Framework \\ v4.0.30319 \\ CONFIG \\ web.config“ $ iis.GetWebConfiguration($ wcm,$ null).GetSection(” appSettings“)。SetAttributeValue(” file“, “ test3”)$ iis.CommitChanges()

经过实验之后,使用此处提供的答案中的某些信息以及脱机对话,我可以得出结论,即无法使用Microsoft WebAdministration PowerShell cmdlet编辑32位根web.config文件。

似乎cmdlet进行了硬编码,只能查看配置文件的64位版本。 IIS管理器的行为方式相同。 为什么是这种情况对我来说是莫名其妙的。

使用某些cmdlet编辑64位Clr 2.0网站和应用程序时,我也发现了很多问题。 Clr参数并非在所有cmdlet上都存在,即使在它所在的cmdlet中也似乎并不总是有效。

因此,我决定放弃WebAdministration cmdlet,直接使用“ Microsoft.Web.Administration.dll”程序集和Microsoft.Web.Administration.ServerManager对象。

以下是我编写的一些功能可能会有所帮助:

    function Get-MWAConfigObjects
    {
        <#
                .SYNOPSIS
                Returns object to manage IIS configuration in root web.config
                .DESCRIPTION
                The objects returned allow viewing or editing or configuration. Parameters open the appropriate version, either 32 or 64 bit for the appropriate version of the ManagedRunTime. https://msdn.microsoft.com/en-us/library/microsoft.web.administration.servermanager(v=vs.90).aspx
Ensure that you call CommitChanges to save any changes made.
                .EXAMPLE
                $MWA = Get-MWAConfigObjects -ManagedRunTimeVersion v2.0 -Architecture 32               $MWA.Configuration.GetSection('system.web/compilation','MyWebSite/MyApplication').SetAttributeValue('tempDirectory', 'C:\NewPath')
                $MWA.ServerManager.CommitChanges()             
        #>
        [cmdletbinding(positionalbinding = $false)]
        param(
            [Parameter(Mandatory = $True)][string][ValidateSet('v2.0','v4.0')] $ManagedRunTimeVersion,
            [Parameter(Mandatory = $True)][string][ValidateSet(32,64)] $Architecture
        )

        $assemblyPath = $(Join-Path -Path $([System.Environment]::GetFolderPath('System')) -ChildPath $(Join-Path -Path 'inetsrv' -ChildPath 'Microsoft.Web.Administration.dll'))
        If (Test-Path -Path $assemblyPath -PathType Leaf)
        {
            $null = [System.Reflection.Assembly]::LoadFrom($assemblyPath)
            $iis = New-Object -TypeName Microsoft.Web.Administration.ServerManager
            $wcm = New-Object -TypeName Microsoft.Web.Administration.WebConfigurationMap -ArgumentList $(Get-ConfigFilePath -Type machine -ManagedRunTimeVersion $ManagedRunTimeVersion -Architecture $Architecture), $(Get-ConfigFilePath -Type web -ManagedRunTimeVersion $ManagedRunTimeVersion -Architecture $Architecture)
            $configuration = $iis.GetWebConfiguration($wcm, $null)

            $object = New-Object -TypeName PSObject
            $object | Add-Member -MemberType NoteProperty -Name ServerManager -Value $iis
            $object | Add-Member -MemberType NoteProperty -Name Configuration -Value $configuration
            Write-Output -InputObject  $object
        }
        else
        {
            Throw "Cannot validate existence of required assembly 'Microsoft.Web.Administration.dll' at ""$assemblyPath"""
        }
    }

    function Get-ConfigFilePath
    {
        [CmdletBinding(PositionalBinding = $false)]
        param
        (
            [Parameter(Mandatory = $True)][string][ValidateSet('web','machine')] $Type, 
            [Parameter(Mandatory = $True)][string][ValidateSet('v2.0','v4.0')] $ManagedRunTimeVersion, 
            [Parameter(Mandatory = $True)][string][ValidateSet(32,64)] $Architecture
        )

        $ErrorActionPreference = 'stop'

        switch ($ManagedRunTimeVersion)
        {
            'v2.0'
            {
                switch ($Architecture)
                {
                    32
                    {
                        $path = $(Join-Path -Path $([System.Environment]::GetFolderPath('Windows')) -ChildPath "Microsoft.NET\Framework\v2.0.50727\CONFIG\$Type.config")
                        break
                    }
                    64
                    {
                        $path = $(Join-Path -Path $([System.Environment]::GetFolderPath('Windows')) -ChildPath  "Microsoft.NET\Framework64\v2.0.50727\CONFIG\$Type.config")
                        break
                    }
                }

                break;
            }
            'v4.0'
            {
                switch ($Architecture)
                {
                    32
                    {
                        $path = $(Join-Path -Path $([System.Environment]::GetFolderPath('Windows')) -ChildPath "Microsoft.NET\Framework\v4.0.30319\CONFIG\$Type.config")
                        break
                    }
                    64
                    {
                        $path = $(Join-Path -Path $([System.Environment]::GetFolderPath('Windows')) -ChildPath  "Microsoft.NET\Framework64\v4.0.30319\CONFIG\$Type.config")
                        break
                    }
                }

                break;
            }
        }

        If (Test-Path -Path $path -PathType Leaf)
        {
            Write-Output -InputObject $path
        }
        else
        {
            Throw "Cannot validate configuration file at path ""$path"""
        }
    }

我希望这可以帮助别人。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM