使用CimObjectconfigurationRelayIPList会中断Windows SMTP服务器

我正在尝试使用PowerShellconfigurationWindows Server 2012 SMTP服务器。

我探讨了使用IISSmtpServerSettings CimObject。

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

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

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

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

对此: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 

你所看到的变化是微不足道的。 值正在从null更改为空string。 对于驱动程序,固件或接口(wmi,cim,自定义小程序)来说,通过这种方式进行轻微的数据更改并不罕见。

虽然我不能在你的情况下指出一个特定的代码行,但我可以告诉你这种情况发生的最可能的方式。 开发人员设置其代码以避免使用空variables的情况并不是闻所未闻的。 要对对象进行任何types的工作,它必须被序列化和实例化。 当这种情况下,属性被赋值,空值被转换为空值。 相信与否与空白是完全不同的一个纲领性立场。

不应该有危险或不利的后果。 你看到的失败最有可能归因于尚未被发现的东西。 也许错误消息或日志可能有帮助? 当然,如果你有他们张贴。

用CimInstance加“”来解决原来的问题。

但是,我设法通过切换到WmiObject来实现这个function:

 # 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