使用 IIS6 运行 kill 进程。可执行文件挂起

使用 IIS6 运行 kill 进程。可执行文件挂起

我正在网页中使用以下代码(已尝试多种变体),该代码旨在终止服务器上的某个进程:

    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 等),否则我认为您可以编写一个脚本,通过有问题的服务器上的任务调度程序定期运行该脚本,该脚本可以检测应用程序是否挂起并采取适当的措施。

为什么要等到有人真正注意到问题,然后还要花时间自己修复呢?只需自动解决问题,直到您可以摆脱遗留应用程序。

相关内容