我正在尝试使用 PowerShell 配置 Windows Server 2012 SMTP 服务器。
我尝试使用 IISSmtpServerSettings CimObject。
我得到了对象,应用了我的更改(允许本地主机中继发件人列表)并且脚本退出时没有错误。
但是,现在我无法启动 SMTP 服务器。
仔细检查我更改前后的 Cim 对象后,发现我的 SecureBindings 设置也发生了变化。
来自:SecureBindings:{SecureBinding(IP =“”,端口)}
对此:SecureBindings:{SecureBinding(IP =“”,Port =“”)}
我尝试设置 SecureBindings 设置,但收到错误“适配器无法设置属性“SecureBindings”的值
所以我的问题是,我该如何
- 首先阻止我的脚本影响 SecureBindings
- 将 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