我正在网页中使用以下代码(已尝试多种变体),该代码旨在终止服务器上的某个进程:
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 进程,该进程往往会锁定。这是一个遗留的 Web 应用程序,我们很快就会替换它,但与此同时,我们需要小心谨慎,并在发生这种情况时强制关闭该应用程序。
我应该指出,终止 w3wp.exe 并不是 IT 专业人员会做的事情。
发生的情况是,每次我运行终止页面时,WScript.exe 都会出现在任务管理器中,并且它永远不会消失。
当从 IIS 运行时,进程 WScript.exe(我还尝试了其他进程,例如 psexec.exe)以具有管理员权限的本地用户身份运行(我还尝试了其他类型的用户,包括域管理员),但从服务器上的命令行运行时它可以正常工作。
答案1
是的,应该。网络服务充其量只是一个用户级帐户,据我所知,IIRC 只能终止它启动的进程。
如果任务在服务器本身上运行,最简单的方法可能是要求对页面进行 Windows 集成身份验证,并对其进行 ACL 以便只有管理员和系统可以读取它。
这将确保只有管理员可以登录该页面,并且对于谁终止了该进程有一定的责任。
此外,还有一个想法:您是否已确认 KillMyProcess.vbs 在与之交互执行时可靠地工作cscript killmyprocess.vbs
?
答案2
我知道这实际上并没有直接回答您的问题。但是,将 IIS 和手动用户干预排除在外不是更有意义吗?除非有实际的监控工具(SCOM、Nagios 等),否则我认为您可以编写一个脚本,通过有问题的服务器上的任务调度程序定期运行该脚本,该脚本可以检测应用程序是否挂起并采取适当的措施。
为什么要等到有人真正注意到问题,然后还要花时间自己修复呢?只需自动解决问题,直到您可以摆脱遗留应用程序。