2012-07-16 114 views
3

我想知道如何以编程方式重新启动IIS 6.0 SMTP服务器。如何以编程方式启动IIS 6.0 SMTP虚拟服务器?

我安装的SMTP服务器偶尔会崩溃。我几天没有注意到这一点,但对于做这件事来说,已经太迟了。

我想每隔30分钟设置一次计划任务,以测试SMTP服务器是否正在运行,如果不是,计划任务会自动启动备份。

我找到了一种方法来检查SMTP服务器是否启动并正在运行,但是我还没有想出如何在程序崩溃时重新启动进程。

这样被张贴在这里:Testing SMTP server is running via C#

任何帮助将是辉煌!

谢谢。我开发C#中的控制台应用程序来检查它是否运行,所以任何代码示例都会很好。

+0

“我已经找到一种方法来检查,如果SMTP服务器启动并运行”。哪一个?可能答案并不是很远 – 2012-07-16 21:21:00

+0

已更新此评论的问题。 – 2012-07-16 21:23:20

+0

你想远程或本地检查吗?你想从同一个域名进行测试吗? – 2012-07-16 21:24:28

回答

4

A ServiceController可以帮助你,因为它有启动和停止方法。看看msdn页面中的示例。

另一个样本取自ServiceControllerStatus Enumeration几乎是你所需要的(只需更换服务名称)。

ServiceController sc = new ServiceController("Telnet"); 
Console.WriteLine("The Telnet service status is currently set to {0}", 
        sc.Status.ToString()); 

if ((sc.Status.Equals(ServiceControllerStatus.Stopped)) || 
    (sc.Status.Equals(ServiceControllerStatus.StopPending))) 
{ 
    // Start the service if the current status is stopped. 

    Console.WriteLine("Starting the Telnet service..."); 
    sc.Start(); 
} 
else 
{ 
    // Stop the service if its status is not set to "Stopped". 

    Console.WriteLine("Stopping the Telnet service..."); 
    sc.Stop(); 
} 

// Refresh and display the current service status. 
sc.Refresh(); 
Console.WriteLine("The Telnet service status is now set to {0}.", 
        sc.Status.ToString()); 
2

也许我失去了一些东西,或者什么改变,但是当你在的Windows 2012R2安装SMTP服务,有没有为它专门服务。因此,对于最新版本的Windows,上述建议将无法使用。

幸运的是,有一种方法可以轻松完成。 Powershell:

([ADSI]'IIS://LOCALHOST/SMTPSVC/1').Start() #to start 
([ADSI]'IIS://LOCALHOST/SMTPSVC/1').Stop() #to ... you guess 

最奇怪的是你通过AD控制smtp服务,但它的工作原理。 当然这应该运行提升。 如果您有多个虚拟SMTP服务器,则可能需要先通过索引或某些属性(例如.ConnectionTimeout)来识别您的服务器。

+0

由于问题被标记为“C#”,有没有办法直接在C#中做到这一点? (除了从C#调用一行PowerShell,当然,我认为这很好,因为任何人仍然使用IIS 6.0的任何东西可能具有很高的公差级别:)) – 2017-07-31 15:55:31

+1

Sorta。看看这里:https://msdn.microsoft.com/en-us/library/aa746485(v=vs.85).aspx所以这个想法是,你'Type.GetTypeFromCLSID(“001677D0-FD16-11CE-ABC4 -02608C9E7553“)' - >投射到动态 - >做东西。以下是界面定义:https://msdn.microsoft.com/en-us/library/aa705985(v=vs.85).aspx?f=255&MSPPError=-2147217396或p/invoke:http://www.pinvoke。 net/default.aspx/Interfaces.IADsContainer还想走这条路吗? :) – 2017-08-01 12:59:00

0

在C#中,你可以这样写:

  enum StatusVirtualServerSMTP 
      { 
       Started = 2, 
       Stopped = 4 
      } 

      DirectoryEntry dir = new DirectoryEntry("IIS://localhost/SMTPSVC/1"); 

      if (Convert.ToInt32(dir.Properties["SERVERSTATE"].Value) == (int)StatusVirtualServerSMTP.Stopped) 
      { 
       dir.Properties["SERVERSTATE"].Value = (int)StatusVirtualServerSMTP.Started; 
       dir.CommitChanges(); 
      } 
相关问题