Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Запрет на повторный запуск процесса (http://forum.oszone.net/showthread.php?t=259644)

sergeypele 29-04-2013 16:23 2141724

Запрет на повторный запуск процесса
 
Добрый день, помогите плиз.
есть такой скрипт Нужно чтобы отслеживал процесс, если запущен, то запрещал повторный запуск
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" _
& strComputer & "\root\cimv2")

Set colProcesses = objWMIService.ExecQuery( _
"Select Name From Win32_Process " _
& "Where Name = 'cashserv.exe'")

If colProcesses.Count = 0 Then
Set objShell = Wscript.CreateObject("Wscript.Shell")
Set objEnv = objShell.Environment("Process")
objShell.Run """" + objEnv("") + "cashserv.exe"""
Else
MsgBox "Программы уже запущена. Для перезапуска закройте ее.", 48, "Внимание"
End If

DmitriiV 30-04-2013 12:55 2142215

Пример сценария, который позволяет запускать указанный процесс либо в количестве, не большем, чем количество таких процессов на момент запуска сценария, либо в единственном экземпляре.
читать дальше »
Код:

Dim objWMI, objCollection, objItem
Dim strComputer, strProcess, intLimit
Dim objDict, strHandle, strTemp

strComputer = "."
strProcess = "myprocess.exe"
Set objDict = CreateObject("Scripting.Dictionary")
Set objWMI = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set objCollection = objWMI.ExecQuery("SELECT Handle FROM Win32_Process WHERE Name='" & strProcess & "'")
If objCollection.Count = 0 Then
    intLimit = 1
Else
    For Each objItem In objCollection
        objDict.Add objItem.Handle, True
    Next
    intLimit = objDict.Count
End If
Set objCollection = objWMI.ExecNotificationQuery("SELECT * FROM __InstanceOperationEvent " _
        & "WITHIN 1 WHERE TargetInstance ISA 'Win32_Process' AND TargetInstance.Name='" & strProcess & "'")
On Error Resume Next
Do
    Set objItem = objCollection.NextEvent
    Select Case objItem.Path_.Class
        Case "__InstanceCreationEvent"
            strTemp = objItem.TargetInstance.Handle
            If objDict.Count < intLimit Then
                objDict.Add strTemp, True
            Else
                objWMI.Get("Win32_Process.Handle='" & strTemp & "'").Terminate
                If Err.Number <> 0 Then Err.Clear
            End If
        Case "__InstanceDeletionEvent"
            strTemp = objItem.TargetInstance.Handle
            If objDict.Exists(strTemp) Then
                objDict.Remove strTemp
            End If
    End Select
Loop
Set objItem = Nothing
Set objCollection = Nothing
Set objWMI = Nothing
Set objDict = Nothing
WScript.Quit 0


sergeypele 06-05-2013 14:10 2145304

Спасибо огромное, то что надо!!!!


Время: 22:59.

Время: 22:59.
© OSzone.net 2001-