【问题标题】:Restarting IIS programmatically以编程方式重新启动 IIS
【发布时间】:2013-09-30 20:51:30
【问题描述】:

我需要从 C#/.NET 应用程序重新启动 IIS。这似乎是一个微不足道的问题,但到目前为止我还没有成功,this question 的答案都没有奏效。

我是机器上的本地管理员。

我试过这个:

var process = new Process
{
   StartInfo =
   {
       Verb = "runas",
       WorkingDirectory = @"C:\Windows\System32\",
       FileName = @"issreset.exe"
   }
};
process.Start();

但这会引发Win32Exception - cannot find the file specified.,我也尝试了各种组合,将整个路径放入FileName,并使用UseShellExecute,但这些选项都没有帮助。

我也试过通过命令行调用它:

var process = new Process
{
   StartInfo =
   {
       Verb = "runas",
       WindowStyle = ProcessWindowStyle.Hidden,
       FileName = @"cmd.exe",
       Arguments = "/C iisreset"
   }
};
process.Start();

这可行,但它提供了一个 UAC 提示,我无法拥有该提示,因为此应用程序将在没有用户干预的情况下运行。

还有什么我可以尝试的吗?

【问题讨论】:

  • 我想你想要iisreset.exe,而不是iisreset。您需要文件扩展名。
  • 你是对的。这是我在写这个问题时的一个错字。我试过了。
  • 如果您将UseShellExecute 设置为true,第一个将起作用。否则,FileName 必须是完整路径。没有办法绕过 UAC,这有点意思。你可以在那台机器上关闭它。
  • 您的第一个 sn-p 代码对我来说很好用。您确定这是您尝试过的代码吗?您确定 IIS 已安装且文件存在吗?
  • 这不会绕过 UAC,但它只会提示输入密码:runas /user:Administrator iisreset 作为第二个进程的参数。

标签: c# .net iis process uac


【解决方案1】:

或者(更简洁)您可以只使用ServiceController 类随后停止和启动 iis 服务。
不过,您可能仍需要提升权限……模仿可能会解决这个问题; "impersonate an account with higher privileges." 用于重启服务。

可以在此处找到如何启动/停止(和重新启动)Windows 服务的一个很好的示例: Start, Stop and Restart Windows Service (C#)

【讨论】:

【解决方案2】:

在解决方案资源管理器中右键单击项目名称->添加->新建项目->应用程序清单文件。

在里面编辑

    <requestedPrivileges>
       <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
    </requestedPrivileges>

这应该可以解决您的问题。

【讨论】:

    【解决方案3】:

    文件名错误。试试FileName = @"iisreset.exe"

    【讨论】:

      【解决方案4】:

      您遇到的异常很可能是由于您尝试运行此应用程序的用户没有管理权限。

      如果您以管理员帐户运行您的应用程序,那么它应该会自动以管理权限启动 iisreset,而不会出现 UAC 提示或错误。

      您应该如何以管理员身份运行您的流程是一个单独的问题。最常见的方法是创建应用程序清单:

      http://msdn.microsoft.com/en-us/library/ms235229.aspx

      【讨论】:

      • 特权最终成为这里的问题。谢谢。
      【解决方案5】:

      另一个启动 IIS 的选项:

      string serviceName = "W3SVC"; //W3SVC refers to IIS service
      ServiceController service = new ServiceController(serviceName);
      service.Start();
      service.WaitForStatus(ServiceControllerStatus.Running);// Wait till the service started and is running
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多