1

如果我从命令提示符运行它,它工作正常。

psexec \ServerName cscript.exe iisapp.vbs /a AppName /r

我正在尝试对 C# 控制台应用程序做同样的事情。我正在使用下面的代码,但大多数情况下应用程序挂起并且没有完成,并且有几次它会抛出错误代码。我做错了吗?有谁知道我可以在哪里查找错误或错误代码?

static void RecycleAppPool(string sServer)
{
    Console.Clear();
    ProcessStartInfo p = new ProcessStartInfo("psexec.exe", "\\\\" + sServer + " cscript.exe iisapp.vbs /a <AppName> /r");
    p.RedirectStandardInput = true;
    p.UseShellExecute = false;
    Process.Start(p);
}

当它完成一个错误时,看起来像这样

“cscript.exe 退出,错误代码 -2147024664”

编辑

下面的代码运行良好

static void RecycleAppPool(string sServer)
{
    Console.Clear();
    ProcessStartInfo p = new ProcessStartInfo("psexec.exe");
    p.Arguments = @"\\" + sServer + @" cscript.exe iisapp.vbs /a AppName /r";
    p.UseShellExecute = false;
    Process.Start(p);
}
4

4 回答 4

0

Have you tried recycling using appcmd instead of iisapp.vbs?

And, in this thread they recycled a remote application pool using WMI.

于 2010-12-21T23:22:33.317 回答
0

VS2003/8/10:工具->错误查找。以十六进制粘贴错误代码。800700E8。这是“管道正在关闭”。不是很有帮助-我猜是重定向的一些问题。

你真的有 ProcessStartInfo 参数,还是被用来替换你的实际应用程序名称?

于 2010-12-21T22:50:34.983 回答
0

如果是 IIS7,那么您可以使用 C# 的 Web 管理命名空间:

using System;
using System.Xml.Serialization;
using Microsoft.Web.Administration;
using System.Linq;
using System.Runtime.InteropServices;

///...

var serverManager = ServerManager.OpenRemote(@"\\myiisserver");
var appPool = serverManager.ApplicationPools["my app pool name"];
appPool.Recycle();

您可以在此处了解有关Web Admin 命名空间的更多信息。到目前为止,它对我们来说效果很好。但必须安装在客户端和远程机器上。

于 2010-12-21T23:45:53.227 回答
0

在过去的 2 天里,我在网上找到的每一个解决方案都为此苦苦挣扎。我正在尝试在不同域的远程计算机上回收应用程序池。我尝试使用 PsExec 的第一种方法返回错误 3。我尝试了 DirectoryEntry,但权限也失败了,然后尝试使用 ServerManager 但同样的问题。最后,我转移到 WMI 并且它起作用了:

public static void RecycleIis4(string user, string password, string serverName = "LOCALHOST", string appPoolName = "DefaultAppPool")
{
    var processToRun = new[] { @"c:\Windows\system32\inetsrv\appcmd recycle APPPOOL " + appPoolName };
    var connection = new ConnectionOptions { Username = user, Password = password };
    var wmiScope = new ManagementScope(string.Format(@"\\{0}\root\cimv2", serverName), connection);
    var wmiProcess = new ManagementClass(wmiScope, new ManagementPath("Win32_Process"), new ObjectGetOptions());
    wmiProcess.InvokeMethod("Create", processToRun);
}

希望这可以帮助。

于 2020-01-20T04:42:56.243 回答