【问题标题】:How can PowerShell tell me the enum type of an IIS property?PowerShell 如何告诉我 IIS 属性的枚举类型?
【发布时间】:2016-06-02 01:18:34
【问题描述】:

我正在使用 PowerShell 和 IIS,并在 PowerShell 选择表示类型的方式上遇到了一些有趣的问题。

如果我跑了

Import-Module -Force WebAdministration
Get-ItemProperty -Path "IIS:\AppPools\DefaultAppPool" -Name "managedPipelineMode"

它会尽职尽责地打印出来

Integrated

但如果我尝试将该属性设置为

Set-ItemProperty -Path "IIS:\AppPools\DefaultAppPool" -Name "managedPipelineMode" -Value "Integrated"

我得到了例外:Set-ItemProperty : Integratedis not a valid value for Int32.。很公平。我从谷歌上知道这种类型实际上是一个 Microsoft.Web.Administration.ManagedPipelineMode 枚举,所以我需要做这样的事情才能让它工作:

Add-Type -Path C:\Windows\system32\inetsrv\Microsoft.Web.Administration.dll
$t = [Type]"Microsoft.Web.Administration.ManagedPipelineMode"
Set-ItemProperty -Path "IIS:\AppPools\DefaultAppPool" -Name "managedPipelineMode" -Value ([int]("Integrated" -As $t))

这很公平,但我的问题是:如何在不使用 Google 的情况下确定属性的枚举类型?

PowerShell 确信该属性是一个字符串:

(Get-ItemProperty -Path "IIS:\AppPools\DefaultAppPool" -Name "managedPipelineMode").GetType()

IsPublic IsSerial Name                                     BaseType                                                                                                                      
-------- -------- ----                                     --------                                                                                                                      
True     True     String                                   System.Object 

或者有时它认为它是一个由字符串支持的 NoteProperty:

(Get-Item "IIS:\AppPools\DefaultAppPool") | Get-Member -Name "startMode"

   TypeName: Microsoft.IIs.PowerShell.Framework.ConfigurationElement#system.applicationHost/applicationPools#add

Name      MemberType   Definition                      
----      ----------   ----------                      
startMode NoteProperty System.String startMode=OnDemand

但我不知道如何获取实际的枚举类型。如果我能做到这一点,我可以更加灵活地将值写入这些属性。就目前而言,我必须确保每次设置这些属性之一时,我都必须花时间在 Google 上(这是假设我什至可以找到正确的枚举类型;有些更难追踪)。

【问题讨论】:

    标签: powershell iis


    【解决方案1】:

    PowerShell 确信该属性是一个字符串

    这是真的。这是因为该属性的父对象不是您可能期望的Microsoft.Web.Administration.ApplicationPool 类型,而是Microsoft.IIs.PowerShell.Framework.ConfigurationElement 类型。你可以通过执行(Get-Item -Path "IIS:\AppPools\DefaultAppPool").GetType().FullName来看到。

    我相信ConfigurationElement 对象只是 IIS 使用的配置文件中 XML 节点的包装对象。在这种情况下,每个属性都对应于 XML 配置文件中的一个值,因此其类型为 string。对于您示例中的特定路径,它看起来像是在使用 'C:\Windows\System32\inetsrv\config\applicationHost.config' 的配置文件。

    如果您使用的是 PowerShell ISE,您可以利用智能感知来确定有效的枚举值是什么:

    否则,你可以使用Enum类的静态GetNames方法:

    [Enum]::GetNames([Microsoft.Web.Administration.ManagedPipelineMode])
    

    这会给你:

    综合
    经典

    如果你知道该属性是一个枚举,但你不知道究竟是什么类型的枚举,你可以这样做:

    [Microsoft.Web.Administration.ApplicationPool].GetProperty("ManagedPipelineMode").PropertyType.FullName
    

    哪个会返回:

    Microsoft.Web.Administration.ManagedPipelineMode

    如果你不知道枚举类型并且不关心枚举类型是什么,你只想知道有效的枚举值是什么,你可以这样做:

    [Enum]::GetNames([Microsoft.Web.Administration.ApplicationPool].GetProperty("ManagedPipelineMode").PropertyType)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多