Назад | Перейти на главную страницу

Обновление ограничений ретрансляции SMTP в IIS с помощью Powershell

Я пытаюсь обновить ограничения ретрансляции виртуального SMTP-сервера IIS 6, чтобы разрешить только 127.0.0.1. Для этого я обновляю следующую настройку.

Я могу сделать это вручную, но я бы хотел сделать это из PowerShell.

$settings = get-wmiobject -namespace root\MicrosoftIISv2 -computername localhost -Query "Select * from IIsSmtpServerSetting"
$settings.RelayIpList += @(127,0,0,1)
$settings.Put()

Если я запрашиваю параметр в PowerShell, добавленное мной значение присутствует, но не обновляется в пользовательском интерфейсе. Я использую правильную настройку? Или мне что-то еще не хватает?

Надеюсь, это кому-то поможет.

Я обнаружил, что вы можете сделать что-то подобное только для обновления relayIPList, ниже приведен пример добавления 127.0.0.1 в пустой список IP-адресов реле:

$SmtpConfig = Get-WMIObject -Namespace root/MicrosoftIISv2 -ComputerName localhost -Query "Select * From IisSmtpServerSetting"

$RelayIpList = @( 24, 0, 0, 128, 32, 0, 0, 128, 60, 0, 0, 128, 68, 0, 0, 128, 1, 0, 0, 0, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 76, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 127, 0, 0, 1 )

$SmtpConfig.RelayIPList = $RelayIPList

$SmtpConfig.Put()

* Обратите внимание на пробелы в массиве. Они должны быть там, чтобы гарантировать, что это байтовый массив (он не будет работать, даже если вы используете строгий тип для создания байтового массива без пробелов). Также не пытайтесь изменить содержимое массива

Итак, следующее не сработает:

[Byte[]]$RelayIpList = @(24,0,0,128,32,0,0,128,60,0,0,128,68,0,0,128,1,0,0,0,76,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,2,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,76,0,0,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,127,0,0,1)

либо это будет:

[Byte[]]$RelayIPList = @( 24, 0, 0, 128, 32, 0, 0, 128, 60, 0, 0, 128, 68, 0, 0, 128, 1, 0, 0, 0, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 76, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 127, 0, 0, 1 )
$IPs | ForEach-Object { $RelayIPList = $RelayIPList + ($_.split('.')) }

Это на самом деле возможно и сложнее, чем можно было бы подумать. В этом объекте списка IP-адресов волшебного ретранслятора жестко запрограммированы некоторые длины коллекции.

Вот часть моего сценария, который я использовал после того, как разобрался с этой странностью.

param(
    [Parameter(ValueFromRemainingArguments=$true)][object[]]$AllowedIPs
)

$SMTPServerWmi = Get-WmiObject IISSmtpServerSetting -namespace "ROOT\MicrosoftIISv2" | Where-Object { $_.name -like "SmtpSVC/1" }
$SMTPServerWmi.RelayIpList = @(24,0,0,128,
32,0,0,128,
60,0,0,128,
68,0,0,128,
1,0,0,0,
76,0,0,0,
0,0,0,0,
0,0,0,0,
1,0,0,0,
$AllowedIPs.Count,0,0,0,
2,0,0,0,
($AllowedIPs.Count + 1),0,0,0,
4,0,0,0,
0,0,0,0,
76,0,0,128,
0,0,0,0,
0,0,0,0,
0,0,0,0,
0,0,0,0,
255,255,255,255) + $AllowedIPs.ForEach({ $_.Split(".")})

$SMTPServerWmi.Put()

Если эти значения неверны, пользовательский интерфейс может отображать ваши IP-адреса и много случайного мусора, сбоя или поломки, так что вы не сможете использовать его для удаления элементов из списка с помощью пользовательского интерфейса.

Если вам нужно перейти с одного сервера на другой, это еще проще

#Copy the relay list from one server and migrate it to another
$COMP1 = Get-WMIObject -Namespace root/MicrosoftIISv2 -ComputerName server1 -Query "Select * From IisSmtpServerSetting"

$COMP2 = Get-WMIObject -Namespace root/MicrosoftIISv2 -ComputerName server2 -Query "Select * From IisSmtpServerSetting"
$COMP2.RelayIpList = $comp1.RelayIpList
$COMP2.Put()