gpt4 book ai didi

powershell - 使用 Powershell 操纵 IIsWebVirtualDir 上的 IP 限制

转载 作者:行者123 更新时间:2023-12-02 22:35:36 26 4
gpt4 key购买 nike

在使用 Powershell 操纵 IIsWebVirtualDir(虚拟目录)上的 IP 限制时遇到问题。

但是,我有在 VBS 中执行此操作的代码,所以希望这将是一个简单的问题来获得帮助:)

VBS 中的代码:

 Sub Add2IPRList(WebsiteADSI, strIP2Add, strIP2AddSubnet)
Set WebRootObj = GetObject(WebsiteADSI) '"IIS://localhost/W3SVC/2/ROOT/TestVDIR"
set IPSecObj = WebRootObj.IPSecurity
If(IPSecObj.GrantByDefault)then
IPList = IPSecObj.IPDeny
Else
IPList = IPSecObj.IPGrant
End If

ReDim Preserve IPList (Ubound(IPList)+1) 'resize local copy of IPList array to CurrentSize+1
IPList(Ubound(IPList))=strIP2Add&","&strIP2AddSubnet 'add the entry to the end of the array


If(IPSecObj.GrantByDefault)then
IPSecObj.IPDeny = IPList
Else
IPSecObj.IPGrant = IPList
End If

WebRootObj.IPSecurity = IPSecObj
WebRootObj.SetInfo 'apply the setttings on the server.
set IPSecObj = Nothing
set WebRootObj = Nothing
End Sub

Powershell 中的尝试 1:对象返回,但属于奇怪的类型。

PS C:\> $vdir=[adsi]"IIS://localhost/W3SVC/2/ROOT/TestVDIR";([adsi]$vdir).IPSecurity;
System.__ComObject

Powershell 中的尝试 2:对象不返回

PS C:\> $VDir = Get-WmiObject -Namespace 'root\MicrosoftIISv2' -Class IIsWebVirtualDir |where ($_.name).contains("TestVDIR")};$VDir.IPSecurity;
PS C:\>

有人知道如何 1) 在 Powershell 中使用 ADSI 时处理 System.__ComObject 或 2) 知道如何通过 Powershell 中的 WMI 提供程序使用 IIS6 中的 IPSecurity 对象吗?

另外:

我找到了一种方法,可以使用以下代码拉取和修改与 W3SVC/2/ROOT/TestVDIR 关联的 IIsIPSecuritySetting 对象。

param([string]$computer, [string]$W3SVCPath, [string]$strIP2Add, [string]$strIP2AddSubnet)
<# $W3SVCPath = "W3SVC/2/ROOT/TestVDir" #>;
$IPSecurity = Get-WmiObject -Authentication PacketPrivacy -class IIsIPSecuritySetting -computername $computer -namespace 'root\MicrosoftIISv2' | where {($_.name).equals("$W3SVCPath")};
if($IPSecurity.GrantByDefault){$GD="Deny"}else{$GD="Grant"}
if($IPSecurity.GrantByDefault){$IPList=$IPSecurity.IPDeny;}else{$IPList=$IPSecurity.IPGrant;};
"IPSecurity.GrantByDefault=$GD($IPList)";
$IPList=$IPList+"$strIP2Add, $strIP2AddSubnet";
if($IPSecurity.GrantByDefault){$IPSecurity.IPDeny=$IPList;}else{$IPSecurity.IPGrant=$IPList;};
if($IPSecurity.GrantByDefault){$IPList=$IPSecurity.IPDeny;}else{$IPList=$IPSecurity.IPGrant;};
"($IPList)";

我似乎无法找到一种方法将对象设置回元数据库,以便应用更改。在 VBS 中,IPSecurity 对象始终直接在 WebRootObj 中引用,因此使用了 .setInfo() 函数。但是,由于我们直接使用 WMI 对象类,并且引用是在对象本身中设置的,所以我似乎找不到可以在 IIsIPSecuritySettings 类中设置它的函数。

由于在使用上面使用 WMI 的“Powershell 中的尝试 2”时,我无法在 WebRootObj 中找到对 IPSecurity 属性/对象的引用,因此我不确定下一步要朝哪个方向移动。

有什么想法吗?

最佳答案

这可能很棘手,但可以使用 System.DirectoryServices 来实现。我会给你两个例子,一个是将 GrantByDefault 的值设置为 true 或 false,另一个是向你展示如何将 IP 地址添加到 IPDenyIPGrant 列表。

1。设置 GrantByDefault

$iisObject = new-object System.DirectoryServices.DirectoryEntry("IIS://localhost/W3SVC/2/ROOT/TestVDIR")
$ipSec = $iisObject.Properties["IPSecurity"].Value

# We need to pass values as one element object arrays
[Object[]] $grantByDefault = @()
$grantByDefault += , $false # <<< We're setting it to false

$ipSec.GetType().InvokeMember("GrantByDefault", $bindingFlags, $null, $ipSec, $grantByDefault);

$iisObject.Properties["IPSecurity"].Value = $ipSec
$iisObject.CommitChanges()

2。将 IP 地址添加到 IPDenyIPGrant 列表

$iisObject = new-object System.DirectoryServices.DirectoryEntry("IIS://localhost/W3SVC/2/ROOT/TestVDIR")
$ipSec = $iisObject.Properties["IPSecurity"].Value
$bindingFlags = [Reflection.BindingFlags] "Public, Instance, GetProperty"
$isGrantByDefault = $ipSec.GetType().InvokeMember("GrantByDefault", $bindingFlags, $null, $ipSec, $null);

# to set an iplist we need to get it first
if($isGrantByDefault)
{
$ipList = $ipSec.GetType().InvokeMember("IPDeny", $bindingFlags, $null, $ipSec, $null);
}
else
{
$ipList = $ipSec.GetType().InvokeMember("IPGrant", $bindingFlags, $null, $ipSec, $null);
}

# Add a single computer to the list:
$ipList = $ipList + "10.0.0.1, 255.255.255.255"

# This is important, we need to pass an object array of one element containing our ipList array
[Object[]] $ipArray = @()
$ipArray += , $ipList

# Now update
$bindingFlags = [Reflection.BindingFlags] "Public, Instance, SetProperty"
if($isGrantByDefault)
{
$ipList = $ipSec.GetType().InvokeMember("IPDeny", $bindingFlags, $null, $ipSec, $ipArray);
}
else
{
$ipList = $ipSec.GetType().InvokeMember("IPGrant", $bindingFlags, $null, $ipSec, $ipArray);
}

$iisObject.Properties["IPSecurity"].Value = $ipSec
$iisObject.CommitChanges()

这是在 Windows 2003 上使用 PowerShell 2.0 测试的。

希望挽救您的一天还为时不晚。

关于powershell - 使用 Powershell 操纵 IIsWebVirtualDir 上的 IP 限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6549163/

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