powershell - PowerShell 如何告诉我 IIS 属性的枚举类型?

标签 powershell iis

我正在使用 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 : Integrated 不是 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

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

最佳答案

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,您可以利用智能感知来确定有效的枚举值是什么:

enter image description here

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

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

这会给你:

Integrated
Classic

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

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

哪个会返回:

Microsoft.Web.Administration.ManagedPipelineMode

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

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

关于powershell - PowerShell 如何告诉我 IIS 属性的枚举类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37571351/

相关文章:

asp.net - 从网站自己的网页重新启动网站

PowerShell 比较运算符抛出错误值

iis - 访问注册表项 'Global' 被拒绝

powershell - Invoke-WebRequest中的SessionVariable参数

arrays - PowerShell:两个以上数组的交集

windows - 为什么在使用 XMLHttpRequest 对象发送 POST 请求时 Content-Length 为 0?

asp.net-mvc - Orchard CMS 中的 SignalR 聊天模块

Javascript 相对 URL 的解析方式因主机而异

mysql - Powershell将Mysql查询 "Select From"输出存储为字符串变量

powershell - 使用 PowerShell 获取上次 Windows 更新安装日期