如何使用VBScript自动重新启动作为域管理员的可执行进程

时间:2014-07-15 21:28:02

标签: windows vbscript cmd basic

我需要一些帮助。所有变量都在下面。希望有人可以帮助阐明这个问题。

环境:

我在Windows域上运行的Windows Server 2003 VM框上运行专有处理软件。

基本上这个软件是可执行文件,它是从域帐户手动运行的(登录并手动打开桌面上的快捷方式)

问题/目的:

此软件作为命令提示符运行,并且每隔一段时间(几天)它就会在没有警告的情况下关闭。我们通过Nagios监控和VNC收到提醒,然后重新启动流程。此服务器正在生产中,这是不切实际的。我们正在尝试使用一个检查进程的脚本,如果它没有运行则启动它。

尝试过的解决方案 - 我们已经尝试了很多东西,只是为了记录:

  • 我们将此流程转换为Windows服务,由于软件的性质,它无法作为服务运行。

  • 我们尝试使用Nagios脚本重新启动服务,但是关键字服务此软件无法作为服务运行,因此这不是一个选项。

  • 我们尝试了一个名为ReStartMe的程序。它对我们没用;它崩溃了软件。

最有希望的解决方案:

我们在线找到了一个重启应用程序脚本,它确实重新启动了应用程序。但是,应用程序启动不当,停止,关闭,并再次重新启动。

我们认为这是因为应用程序在shell中启动,并且可能没有正确的用户权限来运行可执行文件。它不等同于在桌面上打开身份验证的用户。

此脚本的代码粘贴在下面。我们希望有人可以帮助我们解决这个问题。解决这个问题会给我们带来很多麻烦。

重新启动程序脚本:

set Service = GetObject ("winmgmts:")
set Shell = WScript.CreateObject("WScript.Shell")

'Name of the EXE file we want to watch
sEXEName = "processing.exe"

'Path of the folder it is in (Don't forget the trailing \)
sApplicationPath = "C:\process\"

'Loop until the system is shutdown or user logs out
while true
    bRunning = false

    'Look for our application. Set the flag bRunning = true
    'If we see that it is running

    for each Process in Service.InstancesOf ("Win32_Process")
        if Process.Name = sEXEName then
            bRunning=true
        End If
    next

    'Is our application running?

    if (not bRunning) then

        'No it is not, launch it
        Shell.Run Chr(34) & sApplicationPath & sEXEName & Chr(34)
    end if

    'Sleep a while so we do not hog the CPU
    WScript.Sleep(2000)
wend

1 个答案:

答案 0 :(得分:0)

尝试使用ShellExecute代替Run

If Not bRunning Then
  Set app = CreateObject("Shell.Application")
  app.ShellExecute Chr(34) & sApplicationPath & sEXEName & Chr(34), , _
                   sApplicationPath, , 1
End If

我可能会首先尝试批处理脚本。 start /wait processing.exe应该启动应用程序并等待它终止。如果可行(不适用于某些应用程序),您可以创建如下的批处理脚本:

@echo off

cd C:\process

:LOOP
start "" /wait processing.exe
ping -n 2 127.0.0.1 >nul 2>&1
goto LOOP

并使用用户启动文件夹中设置的“run as admin”标志创建该批处理脚本的快捷方式。这样程序应该以提升的权限自动启动,并且应该在崩溃时自动重新启动。 ping仅用于在重新启动之前添加一个短暂的延迟,以便在进程崩溃后给系统一些时间进行清理。