Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Аватара для hasherfrog

Старый параноик


Сообщения: 2423
Благодарности: 85

Профиль | Отправить PM | Цитировать


ShaddyR, я очень скоренько наборосал...
Не все проблемы решены.

Код: Выделить весь код
Set Args = WScript.Arguments

' *******************************************

CONST FIELDS = 3
CONST PSNAME = 0
CONST PSNUMB = 1
CONST PSMAXN = 2

Dim thePsArray ( )
Dim nToWatch
nToWatch = 0

Function AddPsToWath( name, number )
 ReDim Preserve thePsArray ( FIELDS, nToWatch )
 thePsArray(PSNAME, nToWatch) = name
 thePsArray(PSNUMB, nToWatch) = number
 thePsArray(PSMAXN, nToWatch) = number
 addPsToWatch = nToWatch
 nToWatch = nToWatch + 1
End Function

' *******************************************

Sub ReadPsWatchFile(filename)
 Dim fso, f
' On Error Resume Next 
 Set fso = CreateObject("Scripting.FileSystemObject")
 Set f = fso.OpenTextFile(filename, 1, False)
 if Err.Number<>0 then
   call Error_(0)
 else
   while not f.atEndOfStream
     s = f.ReadLine
     ms = Split(s, " ", -1, vbBinaryComapre)
     s1 = ms(0)
     n2 = CInt(ms(1))
     n = AddPsToWath(s1, n2)
     Err.Clear
   wend
   f.Close
 end if 
End Sub

' *******************************************

Sub StartUpWatcher()

  strComputer = "."
  Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")

  Set colMonitoredProcesses = objWMIService. _        
    ExecNotificationQuery("select * from __InstanceCreationEvent" _ 
        & " within 1 where TargetInstance isa 'Win32_Process'")

  Set colMonitorProcessesd = objWMIService.ExecNotificationQuery _
   ("SELECT * FROM __InstanceDeletionEvent " & _ 
   "WITHIN 1 WHERE TargetInstance ISA 'Win32_Process' ")


  Do While 1
    Set objLatestProcess = colMonitoredProcesses.NextEvent

    For psn=0 to nToWatch-1
      If objLatestProcess.TargetInstance.Name = thePsArray(PSNAME, psn) Then
        thePsArray(PSNUMB, psn) = thePsArray(PSNUMB, psn) - 1 
'        Wscript.Echo "Num: "& thePsArray(PSNUMB, psn)
        If thePsArray(PSNUMB, psn) < 0 then
          Wscript.Echo "Вы запустили лишнюю копию программы "&  objLatestProcess.TargetInstance.Name  _
                     & " - разрешенный лимит только " & thePsArray(PSMAXN, psn)
          objLatestProcess.TargetInstance.Terminate
          thePsArray(PSNUMB, psn) = thePsArray(PSNUMB, psn) + 1 
        End If
      End If
    Next

  Loop
End Sub

' *******************************************

for i=0 to Args.count-1
 If Args(i) = "-f" Then	
  iaFilename = Args(i+1)
 End If
Next

If iaFilename<>"" Then
  Set fso = CreateObject("Scripting.FileSystemObject")
  If (fso.FileExists(iaFilename)) Then
    Call ReadPsWatchFile(iaFilename)
    If nToWatch=0 Then
      Wscript.Echo "File is empty."
    Else
      Call StartUpWatcher()
    End If
  Else
    Wscript.Echo "File exists not." 
  End If
Else
  Wscript.Echo "watcher.vbs -f filename" 
End If
Формат файла такой
Код: Выделить весь код
имяпрограммы1.exe n1
имяпрограммы2.exe n2
имяпрограммы3.exe n3
Запускается скрипт watcher.vbs -f filename

но вот по поводу 2.2) Нет возврата счетчика в обратное состояние, если одна из копий закрывается. - это я не могу сейчас сообразить. как сделать


И вообще не уверен, что это возможно :-|

Отправлено: 18:37, 06-07-2006 | #6