iisreset 以编程方式覆盖服务器列表

iisreset over a list of servers programmatically

我想通过 C# 代码以编程方式对具有执行此操作的帐户的服务器列表执行 iisreset。

对于本地机器来说很容易做到这一点,例如这是一个示例代码:

    // using ...
using System.Diagnostics;

public class YourForm : Form
{
   // ...

   private void yourButton_Click(object sender, EventArgs e)
   {
      Process.Start(@"C:\WINDOWS\system32\iisreset.exe", "/noforce");
   }

   // ...
}

另外:

    using System.ServiceProcess;

using (ServiceController controller = new ServiceController())
{
controller.MachineName = “My local or remote computer name”;
controller.ServiceName = “IIS Service Name”; // i.e “w3svc”

if (controller.Status != ServiceControllerStatus.Running)
{
// Start the service
controller.Start();

Log.Debug(“IIS has been started successfully, now checking again for webservice availability”);

}
else
{
// Stop the service
controller.Stop();

// Start the service
controller.Start();

Log.Debug(“IIS has been restarted successfully”);

}

}

但是如何对多个服务器执行此操作。

您可能需要 impersonator 才能执行上述代码。

我认为 impersonator 中使用的用户名和密码应该具有该服务器的管理员权限(您拥有)。

您可能还需要远程访问机器然后执行您的代码。

posthere, here and 可能对你有帮助。

如果我想到更有用的东西,会更新这个 post。

编辑:

您可以尝试以下步骤:

  1. 使用重新启动 IIS 的代码创建 windows 服务
  2. 在所有需要重置 IIS 的服务器上部署此服务
  3. 保持此服务关闭
  4. 远程访问此服务(远程访问服务的代码在上面的 post 之一中给出)
  5. 启动和停止服务。这将执行重置 IIS 的代码。给出了此代码 here

希望对您有所帮助。

考虑到无需提供 iisreset 命令的完整路径,您的第一个代码片段应该可以完美运行。

实际上,从 CMD 或 运行 工具调用 IISRESET 时不需要完整路径。所以,这是同一个调用。

关于用户权限,有2种做法

  1. 您可以将所需用户作为参数传递给 Process.Start

    Process.Start("iisreset", "server1", "admin", "admin password", "domain");

  2. 您可以像在代码中那样调用 Process.Start,然后确保 运行 您的应用程序有合适的用户

我在下面试过,效果很好

    static void Main(string[] args)
    {            
        string[] servers = LoadServersFromFile(); 

        foreach (string server in servers)
        {
            Process.Start("iisreset", server.Trim());
        }            
    }

    private static string[] LoadServersFromFile()
    {
        //just listed all servers comma separated in a text file, change this to any other approach fits for your case
        TextReader reader = new StreamReader("Servers.txt");
        return reader.ReadToEnd().Split(',');
    }