gpt4 book ai didi

powershell - Powershell:动态收集数据类型以进行IIS配置元素验证

转载 作者:行者123 更新时间:2023-12-03 00:13:03 25 4
gpt4 key购买 nike

我正在尝试在Powershell cmdlet中动态使用Microsoft.Web.Administration命名空间。

有没有一种方法可以将变量添加到Namespace.Class声明中。

我使用的是 namespace [Microsoft.Web.Administration],它的类为[Microsoft.Web.Administration.ApplicationPool],在它的“回收”下具有一个属性,您可以使用GetProperty方法进行访问。

[Microsoft.Web.Administration.ApplicationPool].GetProperty("Recycling")

如果使用此方法吐出上面的PropertyType
[Microsoft.Web.Administration.ApplicationPool].GetProperty("Recycling").PropertyType.FullName

你得到这个结果,

Microsoft.Web.Administration.ApplicationPoolRecycling



这是另一类。我现在想在cmdlet中动态访问此类。如何从代码中访问此类,我希望代码动态发现对象的新类,然后访问该类。但我找不到实现此目的的方法。

我正在尝试的伪代码
[System.Reflection.Assembly]::LoadFrom( "C:\windows\system32\inetsrv\Microsoft.Web.Administration.dll" )
$appPoolProperty = [Microsoft.Web.Administration.ApplicationPool].GetProperty($Property)
$subClassName = $appPoolProperty.PropertyType.FullName

#This is the step I'm lost on
$subClass = New-Object $subClassName

所以我不确定是否有一种方法可以将对象的TypeName作为字符串值放入,而且我似乎找不到找到将变量转换为其他变量的方法。抱歉,如果这是补救措施,我是一名地下室代码开发人员,并且在学习过程中不断学习。

编辑:根据Mathias在下面的评论中的要求,概述了我要实现的目标。

我有一个脚本,可以自动配置许多IIS组件。目前,我正在尝试将验证添加到我创建的cmdlet Set-AppPoolConfiguration中,该配置允许将配置输入到配置AppPool的cmdlet中(用于在整个分布式Web环境中部署网站/ weapplications) 。利用Microsoft.Web.Administration内部的详细信息,我可以获取枚举值以及AppPool的许多配置组件的类型。这节省了我的时间,而不必在数据类型中进行硬编码,并且可以动态地发现它们并在选择特定配置元素时对值进行验证。

例如。如果需要配置AppPool回收计划,则需要针对TimeSpan数据类型对其进行验证。如果不是TimeSpan数据类型,则将其添加到ScheduleCollection时会出现问题。因此,我试图在尝试添加提供的值之前对其进行验证。

由于有许多AppPool配置元素,因此我不想创建大量的开关或if / elseif链来检查每个配置元素并静态指示要验证的数据类型。我希望类本身可以动态提供此信息以简化代码。

通过简单地访问命名空间中的属性链,我可以获得大多数这些数据类型。例如,如果您想知道QueueLength需要什么类型,请使用以下命令:
[Microsoft.Web.Administration.ApplicationPool].GetProperty("QueueLength").PropertyType.Name

然后您将获得Int64。

这对于获取枚举也非常有用。
[Microsoft.Web.Administration.ApplicationPool].GetProperty("ManagedPipelineMode").PropertyType.GetEnumNames()

但是,尝试使用Schedule进行操作时会遇到一个小问题,因为它返回ScheduleCollection。对于集合中的任何配置元素都是如此。
[Microsoft.Web.Administration.ApplicationPool].GetProperty("Recycling").PropertyType.GetProperty('PeriodicRestart').PropertyType.GetProperty('Schedule').PropertyType.Name

但是,只能从Schedule类中访问有关ScheduleCollection内部的计划项的知识。我的代码当前检查它是否是一个集合,如果是,则试图访问该集合/类并获取所需的信息。要找出时间表是一个TimeSpan,您必须访问它的特定类实例:
[Microsoft.Web.Administration.Schedule].GetProperty('Time').PropertyType.Name

现在,AppPools很简单,通常只编辑一个收集组,因此采用硬编码,因为如果您尝试设置新的回收时间表,那么TimeSpan没什么大不了的,但是当我们移动时到WebSite / WebApplication配置,为集合的每个配置元素静态声明数据类型变得更加繁琐,并且根据所选的配置元素动态地发现这些数据变得更加有用。

这是我最初的方法,为清楚起见,我仅将以上内容包括在内。我将退后一步,再看看如何进行攻击,因为这似乎并不像我希望的那么容易,我将在此处发布解决方案。

最佳答案

您可以从类型文字中检索构造函数并按如下方式调用它:

$type = [Microsoft.Web.Administration.ApplicationPoolRecycling]
$ctor = $type.GetConstructor('NonPublic,Instance',$null,@(),$null)
$appPoolRecyclingInstance = $ctor.Invoke($null)

关于powershell - Powershell:动态收集数据类型以进行IIS配置元素验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44466733/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com