使用 CimObject 配置 RelayIPList 会破坏 Windows SMTP 服务器

使用 CimObject 配置 RelayIPList 会破坏 Windows SMTP 服务器

我正在尝试使用 PowerShell 配置 Windows Server 2012 SMTP 服务器。

我尝试使用 IISSmtpServerSettings CimObject。

我得到了对象,应用了我的更改(允许本地主机中继发件人列表)并且脚本退出时没有错误。

但是,现在我无法启动 SMTP 服务器。

仔细检查我更改前后的 Cim 对象后,发现我的 SecureBindings 设置也发生了变化。

来自:SecureBindings:{SecureBinding(IP =“”,端口)}

对此:SecureBindings:{SecureBinding(IP =“”,Port =“”)}

我尝试设置 SecureBindings 设置,但收到错误“适配器无法设置属性“SecureBindings”的值

所以我的问题是,我该如何

  1. 首先阻止我的脚本影响 SecureBindings
  2. 将 SecureBindings 设置为不会导致 SMTP 服务器启动失败的值

我的脚本如下所示:

$ErrorActionPreference = "Stop"
$error.Clear()

# Get Cim object
$smtpInstance = Get-CimInstance -Namespace root/MicrosoftIISv2 -ClassName IIsSmtpServerSetting -Filter "Name = 'SmtpSvc/1'"

# Set relay IP of 127.0.0.1
$relayIPs = @( 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 )

# Set relay IP list
$smtpInstance.RelayIpList = $relayIPs

# Save changes
Set-CimInstance -CimInstance $smtpInstance -PassThru

答案1

您看到的更改并不重要。值从 null 更改为空字符串。驱动程序、固件或接口(wmi、cim、自定义小程序)以这种方式进行轻微数据更改并不罕见。

虽然我无法指出您遇到的具体代码行,但我可以告诉您最有可能发生这种情况的方式。开发人员设置代码以禁止使用空变量的情况并非闻所未闻。要对对象进行任何类型的操作,必须对其进行序列化和实例化。在这种情况下,属性将被分配其值,并且空值将转换为空值。信不信由你,从编程的角度来看,空值和空值完全不同。

那里应该不会有任何危险或不良后果。您看到的故障很可能是由尚未发现的某些原因引起的。也许错误消息或日志可能会有所帮助?如果有的话,一定要发布它们。

答案2

我无法通过 CimInstance 添加值“”来解决原始问题。

但是,我确实通过切换到 WmiObject 成功地实现了这个功能:

# Get Wmi object
$smtpInstance = Get-WmiObject -Namespace root\MicrosoftIISv2 -ComputerName localhost -Query "Select * From IisSmtpServerSetting"

# Set relay IP of 127.0.0.1
$relayIPs = @( 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 )

# Set relay IP list
$smtpInstance.RelayIpList = $relayIPs

# Save changes
$smtpInstance.Put() | Out-Null

相关内容