我正在使用下面的代码(任何尝试了很多变化)在一个网页,应该杀死服务器上的进程:
Process scriptProc = new Process(); SecureString password = new SecureString(); password.AppendChar('p'); password.AppendChar('s'); password.AppendChar('s'); password.AppendChar('w'); password.AppendChar('d'); scriptProc.StartInfo.UserName = "mylocaluser"; scriptProc.StartInfo.Password = password; scriptProc.StartInfo.FileName = @"C:\WINDOWS\System32\WScript.exe"; scriptProc.StartInfo.Arguments = @"c:\windows\system32\killMyApp.vbs"; scriptProc.StartInfo.UseShellExecute = false; scriptProc.Start(); scriptProc.WaitForExit(); scriptProc.Close();
该VBS文件应该杀死一个不同的w3wp.exe进程,这往往会locking。 这是一个遗留的networking应用程序,我们将尽快取代,但在此期间,我们需要跛行,迫使应用程序在这种情况发生时closures。
我应该注意到,杀w3wp.exe不是IT专业人员做的事情。
发生什么事是,每次我运行杀死页面时,WScript.exe都在任务pipe理器中,并且永远不会消失。
进程WScript.exe(和我尝试其他人这样一个psexec.exe)正在作为一个本地用户与pipe理员权限运行(我尝试了其他types的用户,包括域pipe理员)从IIS运行时,但它运行时从服务器上的命令行。
是的,是的。 networking服务是最好的用户级帐户,AFAIK IIRC只能杀死它启动的进程。
如果任务正在服务器本身上运行,最简单的方法可能是要求对页面进行Windows集成身份validation,并使用ACL,以便只有pipe理员和系统可以读取它。
这将确保只有pipe理员可以login到该页面,并且对于谁杀死了该进程有一点责任心。
还有一个想法:是否确认KillMyProcess.vbs在与cscript killmyprocess.vbs交互执行时可以可靠地工作?
我意识到这并不直接回答你的问题。 但是,将IIS和手动用户干预排除在外是不是更有意义呢? 除了一个实际的监测工具(SCOM,Nagios等),我想你可以编写一个脚本,通过任务调度程序定期运行在有问题的服务器上,可以检测应用程序是否挂起并采取适当的行动。
为什么要等到有人真正注意到问题,然后又要抽出时间来解决问题呢? 只是自动解决问题,直到你可以摆脱旧的应用程序。