【问题标题】:How to restart an executable process as a domain administrator automatically using VBScript如何使用 VBScript 以域管理员身份自动重启可执行进程
【发布时间】:2014-07-15 21:28:01
【问题描述】:

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

环境:

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

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

问题/目标:

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

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

  • 我们将此进程转换为 Windows 服务,但由于软件的性质,它不能作为服务运行。

  • 我们尝试使用 Nagios 脚本重启服务,但是关键字 service 这个软件不能作为服务运行,所以这不是一个选项。

  • 我们尝试了一个名为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

【问题讨论】:

  • 如果经过身份验证的用户运行脚本的方式与他或她运行应用程序的方式相同,那么这不是权限问题。可能与当前目录有关。尝试让脚本启动应用程序的快捷方式(与您手动启动应用程序相同的快捷方式)而不是可执行文件本身。

标签: windows vbscript cmd basic


【解决方案1】:

尝试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

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

【讨论】:

  • Ansgar,非常感谢您的及时回复,我已经添加了您的第一段代码,并同意创建批处理文件和设置作为启动时间是解决这个问题的方法脚本。
  • Ansgar,非常感谢您的及时回复,我已经添加了您的第一段代码,并同意创建批处理文件并将设置作为启动项是解决此问题的方法脚本,一旦脚本正常工作,我就会这样做
  • 1.以下链接上的此窗口出现两次:blogs.technet.com/blogfiles/kevinholman/WindowsLiveWriter/… 2. 如果我选择以“当前用户”身份运行并取消选择“以受限访问权限运行此程序”,则该过程将完美重新启动。 3. 正如我所说,运行方式打开两次并重复上述步骤以进行第二次运行,因为窗口打开了不必要的程序的第二个实例,这是不必要的。我不知道为什么会这样。
  • 到目前为止,您对脚本的建议修改似乎唯一的问题如下: 1. 我认为它会在打开两个“运行方式”窗口时尝试运行程序两次,它应该只运行一次。 2.“运行方式”窗口需要手动输入,我们的目标是使其成为自动化操作,因此如果有某种方法可以绕过此或验证“运行方式”提示并允许程序不受限制地运行,自动在脚本中那太好了。 Angsar,再次感谢您对此的帮助,非常感谢。
  • @virtual020:抱歉,我没有意识到您在 Windows Server 2003 上运行此程序。尝试不使用 "runas" 动词(请参阅更新的答案)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-08
  • 1970-01-01
  • 1970-01-01
  • 2013-09-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多