1

Тема: VBS/WMI: Ограничение времени работы избранных процессов

Идея пришла в голову !!! Всё думал, думал как сделать так, чтобы сына ограничивало в играх по продолжительности, но только его, т.к. все сидим под одной учёткой. Сегодня пришла идея - надо подсчитывать время работы любых (из списка) процессов (накопительно в течении одних суток) и при достижении ограничения суммарного времени работы заданных процессов "убивать" запущенный процесс и делать "защиту от запуска" этих процессов (по списку) !!!

У кого какие идеи по оптимальному алгоритму реализации ?

Времени не хватает... :-(

2

Re: VBS/WMI: Ограничение времени работы избранных процессов

Самое первое что пришло, и самое простое . Это используя Tasklist проверить живой ли процесс у нас, и сделать счетчик времени. А по достижении конкретного значения использовать Taskkill. Но конечно всё зависит от того какой уровень знаний у пользователя. Обойти защиту можно легко

3

Re: VBS/WMI: Ограничение времени работы избранных процессов

VBScript: слежение за существованием процесса - очень близкий к вашему запросу пример. Остается лишь добавить фиксирование по времени моментов запуска игры и закрытия. Но вот чтоб счётчик не обнулялся при перезагрузке компьютера, вам постоянно придётся куда-нибудь записывать промежуточные результаты.

OFF: Экий вы находчивый отец, однако

Евген пишет:

...все сидим под одной учёткой.

Первое что мне пришло в голову в роли сына - это разнюхать, где же папин волшебный таймер. и уверен, в ходе собственного расследования я бы рано или поздно нашёл папин рубильник, даже если бы не знал про WScript.

Стремление - залог успеха

4

Re: VBS/WMI: Ограничение времени работы избранных процессов

ИМХО - очень странное решение. http://i.smiles2k.net/aiwan_smiles/mda.gif Есть причины не создавать вторую учётку ? Вроде бы мелкософт для таких целей и делал эту технологию ? А в политиках можно много чего понастраивать.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

5 (изменено: Евген, 2010-04-20 18:47:17)

Re: VBS/WMI: Ограничение времени работы избранных процессов

Счётчик времени по процессам предлагаю вести в реесте - ИМХО, хорошее местечко...
а вот со слежением частично подходит решение... (ИМХО - рефрешер рулит)
надо ведь будет убить процесс при исчерпании лимита времени...:rolleyes: (какую-нить скруточку со словарём надо будет сделать и в Key хранить имена процессов, а в Item - время работы, или сразу к реестру обращаться - так даже вернее будет если электричество вдруг кончиться )
а с политиками - как-то не дружу...

--------------------------------------------
вот время свободное появиться - как нацарапаю решение

Времени не хватает... :-(

6

Re: VBS/WMI: Ограничение времени работы избранных процессов

Евген пишет:

- надо ведь будет убить процесс при исчерпании лимита времени...

К примеру вот вам скрипт-убийца Блокнота:

Set objService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\CIMV2")
If Err.Number <> 0 Then
    WScript.Echo Err.Number & ": " & Err.Description
    WScript.Quit
End If
For Each objProc In objService.ExecQuery("SELECT * FROM Win32_Process WHERE Name = 'notepad.exe'")
    objProc.Terminate
Next
Стремление - залог успеха

7 (изменено: Евген, 2010-04-20 18:55:14)

Re: VBS/WMI: Ограничение времени работы избранных процессов

Убить процесс, отследить начало появления процесса - не проблема, даже варианты решения есть, ещё выбрать лучший можно, вот как быть со смешанным учётом времени в реестре - вот это интереснее !!!

Времени не хватает... :-(

8

Re: VBS/WMI: Ограничение времени работы избранных процессов

Примерная реализация. Только есть один минус - после перезагрузки скрипт пропадет и можно будет снова запустить игру. Нужно будет поставить метку для таких случаев.

Set WshShell  = CreateObject("Wscript.Shell")
Dim InfoTime, StartTime, EndGame, Game

Game = "notepad.exe"

InfoTime  = InputBox("Введите количество игровых минут", "Game's killer", "60") ' час времени на игру
Set oWmi  = GetObject("WinMgmts:{impersonationLevel=impersonate}!//./root/cimv2")

WScript.Sleep 60000 ' Время, чтобы успеть включить игру (1 минута)
StartTime = Now
WshShell.RegWrite "HKCU\Test\StartTime", StartTime, "REG_SZ"
WshShell.RegWrite "HKCU\Test\InfoTime", InfoTime, "REG_SZ"
EndGame = False ' Завершена игра или еще нет. False - не завершена

While (True)
    Call IsTheEndOfGame()
    
    If EndGame<>True Then ' Все еще играем?
        InfoTime = CLng(WshShell.RegRead("HKCU\Test\InfoTime"))
        If ( InfoTime < 0) Then
            Call KillGame()
        Else
            InfoTime = InfoTime + DateDiff("n",now,WshShell.RegRead("HKCU\Test\StartTime"))
            WshShell.RegWrite "HKCU\Test\InfoTime", InfoTime, "REG_SZ"
        End If 
    Else
        ' Вдруг выход из игры, а время еще есть
        Call WaitGame()
    End If 
    
    WScript.Sleep 15000 ' пауза на 15 секунд
Wend 

Sub IsTheEndOfGame()
    EndGame = True
    For Each Process In oWmi.ExecQuery("SELECT * FROM Win32_Process")
        If Process.Name=Game Then 
            s = Process.Name
            EndGame = False
        End If     
    Next
End Sub 

Sub KillGame()
    For Each Process In oWmi.ExecQuery("SELECT * FROM Win32_Process")
        If Process.Name=Game Then 
            ' Выдаем окошко с предупреждением, что время истекло.
            ' (Чтобы можно было сохранить достижения в игре. Иначе обидно будет)
            Window = WshShell.Popup("Через минуту игра закончится, сохранись!",10,"Game's killer",16)
            WScript.Sleep 50000
            Process.Terminate ' Завершаем работу игрушки            
        End If     
    Next
End Sub 

Sub WaitGame()
    For Each Process In oWmi.ExecQuery("SELECT * FROM Win32_Process")
        If Process.Name<>Game Then 
            EndGame = False
        End If     
    Next
End Sub
В основе всего лежит простота.

9

Re: VBS/WMI: Ограничение времени работы избранных процессов

Felix Faria, у меня вопрос к процедуре WaitGame(). Догадываясь по названию, полагаю вы хотите обработать там время простоя (когда игра не запущена в данное время). Но мне кажется процедура WaitGame() в данном виде не имеет смысла или во всяком случае составлена некорректно (объясните пожалуйста задумку к этой процедуре). И когда игра временно закрыта, у вас после нового запука игры подсчет запаса времени InfoTime ведется между настоящим временем Now и StartTime, а не с момента последнего закрытия игры. Как раз вместо процедуры WaitGame() следовало бы вставить процедуру фиксации момента закрытия игры (содержащая строку NowClosedFiks = Now), чтоб при возобновлении игры подсчёт запаса InfoTime продолжался не между настоящим временем Now и StartTime, а между NowClosedFiks и StartTime.

Стремление - залог успеха

10

Re: VBS/WMI: Ограничение времени работы избранных процессов

Сейчас на уроке информатики сижу и понимаю, что ночью лучше не программировать
Lucky, с вами согласен насчет бессмысленности процедуры  WaitGame(). Смысл процедуры был в том, что если вдруг игрок завершил игру раньше (а время для игры еще осталось), то время, отведенное для игры, не тратилось бы (переменная EndGame). Но про то, что я поставил строку “EndGame = True” в процедуре IsTheEndOfGame() я совсем забыл :sorry:
Домой приду, постараюсь написать уже нормально весь скрипт с учетом всех замечаний. Пока остается такой вариант:

Set WshShell  = CreateObject("Wscript.Shell")
Dim InfoTime, StartTime, EndGame, Game

Game = "notepad.exe"

InfoTime  = InputBox("Введите количество игровых минут", "Game's killer", "60") ' час времени на игру
Set oWmi  = GetObject("WinMgmts:{impersonationLevel=impersonate}!//./root/cimv2")

WScript.Sleep 60000 ' Время, чтобы успеть включить игру (1 минута)
StartTime = Now
WshShell.RegWrite "HKCU\Test\StartTime", StartTime, "REG_SZ"
WshShell.RegWrite "HKCU\Test\InfoTime", InfoTime, "REG_SZ"
EndGame = False ' Завершена игра или еще нет. False - не завершена

While (True)
    Call IsTheEndOfGame()
    
    If EndGame<>True Then ' Все еще играем?
        InfoTime = CLng(WshShell.RegRead("HKCU\Test\InfoTime"))
        If ( InfoTime < 0) Then
            Call KillGame()
        Else
            InfoTime = InfoTime + DateDiff("n",now,WshShell.RegRead("HKCU\Test\StartTime"))
            WshShell.RegWrite "HKCU\Test\InfoTime", InfoTime, "REG_SZ"
        End If 
    End If 
    
    WScript.Sleep 15000 ' пауза на 15 секунд
Wend 

Sub IsTheEndOfGame()
    EndGame = True
    For Each Process In oWmi.ExecQuery("SELECT * FROM Win32_Process")
        If Process.Name=Game Then 
            s = Process.Name
            EndGame = False
        End If     
    Next
End Sub 

Sub KillGame()
    For Each Process In oWmi.ExecQuery("SELECT * FROM Win32_Process")
        If Process.Name=Game Then 
            ' Выдаем окошко с предупреждением, что время истекло.
            ' (Чтобы можно было сохранить достижения в игре. Иначе обидно будет)
            Window = WshShell.Popup("Через минуту игра закончится, сохранись!",10,"Game's killer",16)
            WScript.Sleep 50000
            Process.Terminate ' Завершаем работу игрушки            
        End If     
    Next
End Sub
В основе всего лежит простота.

11

Re: VBS/WMI: Ограничение времени работы избранных процессов

Ошибки исправил и немного доработал. Получилось так: первый скрипт нужен для того, чтобы задать доступное время игры (не забудьте изменить пути реестра и название процесса игры), а второй скрипт (следует поместить в автозагрузку, чтобы работало и после перезагрузки) как раз и следит за тем, чтобы процесс длился заданное время. Замечу сразу один минус - если знать, где расположен первый скрипт, то можно запросто продлить себе время (желательно сделать какую-нибудь защиту на такой случай, но пока у меня нормальных идей нету ).
#1

Set WshShell  = CreateObject("Wscript.Shell")
InfoTime  = InputBox("Введите количество игровых минут", "Game's killer", "60") ' час времени на игру
StartTime = Now
WshShell.RegWrite "HKCU\Test\StartTime", StartTime, "REG_SZ"
WshShell.RegWrite "HKCU\Test\InfoTime", InfoTime*60, "REG_SZ" ' время хранится в секундах

#2

Dim InfoTime, StartTime, EndGame, Game

Game = "notepad.exe" ' Имя процесса игры

Set WshShell = CreateObject("Wscript.Shell")
Set oWmi  = GetObject("WinMgmts:{impersonationLevel=impersonate}!//./root/cimv2")

While (True) ' Запускаем постоянный цикл
    ' Тут проверяем на случай, если будут попытки запустить игру, а время уже истекло
    While (WshShell.RegRead("HKCU\Test\InfoTime")<=0)  
        Call KillAnyEffortsOfRestart() : WScript.Sleep 10000 ' Пауза
    Wend 
    
    WScript.Sleep 10000 : WshShell.RegWrite "HKCU\Test\StartTime", Now, "REG_SZ"
    
    While (WshShell.RegRead("HKCU\Test\InfoTime")>0)
        Call IsTheEndOfGame()
        
        If EndGame=False Then ' Все еще играем?
           InfoTime = CLng(WshShell.RegRead("HKCU\Test\InfoTime"))
            If (InfoTime>0) Then ' Запас времени есть, но потихоньку уменьшаем
                InfoTime = InfoTime + DateDiff("s",now,WshShell.RegRead("HKCU\Test\StartTime"))
                WshShell.RegWrite "HKCU\Test\InfoTime", InfoTime, "REG_SZ"            
            End If  
        End If 
        WshShell.RegWrite "HKCU\Test\StartTime", Now, "REG_SZ" ' обновляем время        
        WScript.Sleep 15000 ' Пауза
    Wend 
    
    Call KillGame() ' Время истекло, пора выключать игру
Wend 

Sub IsTheEndOfGame()
    EndGame = True
    For Each Process In oWmi.ExecQuery("SELECT * FROM Win32_Process")
        If Process.Name=Game Then 
            EndGame = False
        End If     
    Next
End Sub 

Sub KillGame()
    For Each Process In oWmi.ExecQuery("SELECT * FROM Win32_Process")
        If Process.Name=Game Then 
            ' Выдаем окошко с предупреждением, что время истекло.
            ' (Чтобы можно было сохранить достижения в игре. Иначе обидно будет)
            Window = WshShell.Popup("Через минуту игра закончится, сохранись!",10,"Game's killer",16)
        On Error Resume Next    
            WScript.Sleep 50000 : Process.Terminate ' Завершаем работу игрушки            
        End If     
    Next
End Sub

Sub KillAnyEffortsOfRestart()
    For Each Process In oWmi.ExecQuery("SELECT * FROM Win32_Process")
        If Process.Name=Game Then 
            Process.Terminate ' Завершаем работу игрушки
        End If     
    Next
End Sub
В основе всего лежит простота.

12 (изменено: Евген, 2010-04-23 17:35:10)

Re: VBS/WMI: Ограничение времени работы избранных процессов

Коллеги, позвольте внести значимое замечание !!!
Процессов должно быть несколько, т.е. если вернее - то ничем не ограниченное количество,
призываю всех повзрослеть и делать универсальные алгоритмы...
т.е. имена процессов заносить либо в текстовый файлик для считывания, либо в массив (Array)
соответственно и учёт времени вести при любом из запущенных процессов из списка в любое время (основываясь на наличии работающего процесса), отсюда и при истечении времени запрещать запуск (основываясь на событии InstanceCreationEvent). Лимит времени должен распостраняться в пределах одних суток, и при смене суток - должен выдаваться снова в разрешённом количестве.

Думаю с таким описанием задача предельно ясна.

Было бы ещё очень здорово учесть в алгоритме использование спящего режима... (т.е. учитывать текущие сутки не при запуске скрипта, а обновлять это значение ч/з интервал)

Времени не хватает... :-(

13

Re: VBS/WMI: Ограничение времени работы избранных процессов

И, гм-гм , какое значение времени брать за начало суток? Или дитё пока малое, и в полночь уже спит?

14

Re: VBS/WMI: Ограничение времени работы избранных процессов

alexii пишет:

И, гм-гм , какое значение времени брать за начало суток? Или дитё пока малое, и в полночь уже спит?

Учитывая призывы Евген об универсальности, это должно быть обозначено отдельной переменной
Dim PeriodStart = 4 'Период начинается с 4:00 утра по местному

15

Re: VBS/WMI: Ограничение времени работы избранных процессов

лучше постоянный получатель событий и сервис или дривер

если тривиально скриптами постоянно висящими то синк конечно

да, в реестр лучше писать не через вин32, а через НТ, тогда хакерам придется подолее повозиться с поиском ключей и нахождением методов их чтения и замены

Я конечно далек от мысли... (с)

16 (изменено: Евген, 2010-04-24 13:21:49)

Re: VBS/WMI: Ограничение времени работы избранных процессов

alexii пишет:

И, гм-гм , какое значение времени брать за начало суток? Или дитё пока малое, и в полночь уже спит?

ИМХО как есть 00:00:00 - лучше всего !!!  в 23:15 всяко-разно дрыхнет

smaharbA пишет:

...тогда хакерам придется подолее повозиться с поиском ключей и нахождением методов их чтения и замены

Коллеги, боже упаси...   я изначально хотел сделать это только от детей, которых и так можно выгнать из-за компьютера, а не от хакеров...  у которых БУК под одеялом ночью...:lol:

Времени не хватает... :-(

17 (изменено: Lucky, 2010-04-24 18:59:37)

Re: VBS/WMI: Ограничение времени работы избранных процессов

Учёл некоторые замечания... Теперь скрипт отличает "сегодня" от "завтра", читает список процессов (игр) из текствого файла game.txt, находящегося в рабочем каталоге скрипта (каждую игру нужно вводить отдельной строкой без лишних символов).
#1

Set WshShell  = CreateObject("Wscript.Shell")
InfoTime0  = InputBox("Введите количество игровых минут", "Game's killer", "60") ' час времени на игру
StartTime = Now
WshShell.RegWrite "HKCU\Test\StartTime", StartTime, "REG_SZ"
WshShell.RegWrite "HKCU\Test\InfoTime0", InfoTime0*60, "REG_SZ" ' заданный запас времени, хранится в секундах
WshShell.RegWrite "HKCU\Test\InfoTime", InfoTime0*60, "REG_SZ" ' время хранится в секундах
WshShell.RegWrite "HKCU\Test\today", day(now), "REG_SZ"

#2

Dim InfoTime, StartTime, EndGame, Game, FSO, Games, InfoTime0
Set FSO = CreateObject("Scripting.FileSystemObject")
Set WshShell  = CreateObject("Wscript.Shell")

Games = Split(FSO.OpenTextFile("games.txt",1).ReadAll(),vbcrlf) 'в каждой строке по игре
today = WshShell.RegRead("HKCU\Test\today")+0
if today<>day(now) then
 msgbox today&" "&day(now)
 InfoTime0 = CLng(WshShell.RegRead("HKCU\Test\InfoTime0"))
 WshShell.RegWrite "HKCU\Test\InfoTime", InfoTime0, "REG_SZ"
 WshShell.RegWrite "HKCU\Test\today", day(now), "REG_SZ"
end if

Set WshShell = CreateObject("Wscript.Shell")
Set oWmi  = GetObject("WinMgmts:{impersonationLevel=impersonate}!//./root/cimv2")

While (True) ' Запускаем постоянный цикл
    ' Тут проверяем на случай, если будут попытки запустить игру, а время уже истекло
    While (WshShell.RegRead("HKCU\Test\InfoTime")<=0)  
        Call KillAnyEffortsOfRestart() : WScript.Sleep 10000 ' Пауза
    Wend 
    
    WScript.Sleep 10000 : WshShell.RegWrite "HKCU\Test\StartTime", Now, "REG_SZ"
    
    While (WshShell.RegRead("HKCU\Test\InfoTime")>0)
        Call IsTheEndOfGame()
        
        If EndGame=False Then ' Все еще играем?
           InfoTime = CLng(WshShell.RegRead("HKCU\Test\InfoTime"))
            If (InfoTime>0) Then ' Запас времени есть, но потихоньку уменьшаем
                InfoTime = InfoTime + DateDiff("s",now,WshShell.RegRead("HKCU\Test\StartTime"))
                WshShell.RegWrite "HKCU\Test\InfoTime", InfoTime, "REG_SZ"            
            End If  
        End If 
        WshShell.RegWrite "HKCU\Test\StartTime", Now, "REG_SZ" ' обновляем время        
        WScript.Sleep 15000 ' Пауза
    Wend 
    
    Call KillGame() ' Время истекло, пора выключать игру
Wend 

Sub IsTheEndOfGame()
    EndGame = True
    For Each Process In oWmi.ExecQuery("SELECT * FROM Win32_Process")
      For each Game in Games
        If Process.Name=Game Then 
            EndGame = False
        End If
      Next    
    Next
End Sub 

Sub KillGame()
    For Each Process In oWmi.ExecQuery("SELECT * FROM Win32_Process")
      For each Game in Games
        If Process.Name=Game Then 
            ' Выдаем окошко с предупреждением, что время истекло.
            ' (Чтобы можно было сохранить достижения в игре. Иначе обидно будет)
            Window = WshShell.Popup("Через минуту игра закончится, сохранись!",10,"Game's killer",16)
        On Error Resume Next    
            WScript.Sleep 50000 : Process.Terminate ' Завершаем работу игрушки            
        End If
      Next
    Next
End Sub

Sub KillAnyEffortsOfRestart()
    For Each Process In oWmi.ExecQuery("SELECT * FROM Win32_Process")
      For each Game in Games
        If Process.Name=Game Then 
            Process.Terminate ' Завершаем работу игрушки
        End If
      Next  
    Next
End Sub
Стремление - залог успеха

18 (изменено: Евген, 2010-04-24 18:38:50)

Re: VBS/WMI: Ограничение времени работы избранных процессов

В выложеном Lucky последнем варианте кода обнаружил следующее (или поправьте если я не прав)
1) учёт времени начинается с запуска скрипта, а не с запуска любого процесса из списка   - не то учитываете....   
2) ну и события давайте будем не в сообщения выдавать, а в EventLog записывать

Const EVENT_SUCCESS = 0
Set objShell = Wscript.CreateObject("Wscript.Shell")
objShell.LogEvent EVENT_SUCCESS, "Моё событие"

, нам видно будет
3) Запуск процесса лучше убить при его зарождении ( В Win32_Process  InstanceCreationEvent - подходящее событие)

Времени не хватает... :-(

19 (изменено: Lucky, 2010-04-24 18:41:52)

Re: VBS/WMI: Ограничение времени работы избранных процессов

Евген пишет:

В выложеном Lucky последнем варианте кода обнаружил следующее (или поправьте если я не прав)...

Счас перепроверю всё сказанное, странно, ведь я взял в качестве исходника последние представленные коды Felix Faria из поста #11

Стремление - залог успеха

20 (изменено: Lucky, 2010-04-24 19:02:47)

Re: VBS/WMI: Ограничение времени работы избранных процессов

Есть исправления в первом коде (исправил и в посте #17):

Set WshShell  = CreateObject("Wscript.Shell")
InfoTime0  = InputBox("Введите количество игровых минут", "Game's killer", "60") ' час времени на игру
StartTime = Now
WshShell.RegWrite "HKCU\Test\StartTime", StartTime, "REG_SZ"
WshShell.RegWrite "HKCU\Test\InfoTime0", InfoTime0*60, "REG_SZ" ' заданный запас времени, хранится в секундах
WshShell.RegWrite "HKCU\Test\InfoTime", InfoTime0*60, "REG_SZ" ' время хранится в секундах
WshShell.RegWrite "HKCU\Test\today", day(now), "REG_SZ"
Евген пишет:

1) учёт времени начинается с запуска скрипта, а не с запуска любого процесса из списка - не то учитываете....

странно, но счёт идёт только при запущенных процессах (играх). Может кто еще проверил?

Стремление - залог успеха

21

Re: VBS/WMI: Ограничение времени работы избранных процессов

Сейчас подумал, картина игры ребёнка в логе будет хорошо просматриваться при наличии зафиксированных событий запуска/завершения процессов (если мы хотим иметь хороший продукт) и на основе этого легко будет проверить правильность работы скрипта.
Т.е. призываю к использованию InstanceCreationEvent и InstanceDeletionEvent - заодно и решение будет выглядеть более взросло...

Времени не хватает... :-(

22

Re: VBS/WMI: Ограничение времени работы избранных процессов

Евген пишет:

Т.е. призываю к использованию InstanceCreationEvent и InstanceDeletionEvent - заодно и решение будет выглядеть более взросло...

Но стоит ли ради взрослости это использовать, или вам важно решение именно с InstanceCreationEvent и InstanceDeletionEvent? Если я правильно понимаю, придется для каждого процесса делать слежку, еще и асинхронно это выполнять. И от ожидания тоже нельзя будет избавиться, т.к. не факт, что InstanceDeletionEvent сработает ровно в указанное время. Если важно снизить погрешность в учете времени,то просто уменьшите период ожидания в циклах.

ну и события давайте будем не в сообщения выдавать, а в EventLog записывать

Просто поставьте строку в нужном вам месте:

WShShell.LogEvent 0, "Моё событие"

И еще вопросы.

т.е. имена процессов заносить либо в текстовый файлик для считывания, либо в массив (Array)
соответственно и учёт времени вести при любом из запущенных процессов из списка в любое время (основываясь на наличии работающего процесса), отсюда и при истечении времени запрещать запуск (основываясь на событии InstanceCreationEvent). Лимит времени должен распостраняться в пределах одних суток, и при смене суток - должен выдаваться снова в разрешённом количестве.

Может тогда стоит сделать все инструкции в одном файле: отведенное время и ниже список процессов?
И если вдруг осталось время для работы процессов, то добавлять ли его в следующие сутки?

В основе всего лежит простота.

23 (изменено: Евген, 2010-04-26 17:32:21)

Re: VBS/WMI: Ограничение времени работы избранных процессов

Felix Faria пишет:

Если я правильно понимаю, придется для каждого процесса делать слежку

Не правильно, события работают для всех процессов, а не для одного...

Felix Faria пишет:

Просто поставьте строку в нужном вам месте:

WShShell.LogEvent 0, "Моё событие"

Было бы время - уже всё сделал бы...

Felix Faria пишет:

И если вдруг осталось время для работы процессов, то добавлять ли его в следующие сутки?

Нет уш...  если на выходные уехать к дедушке в деревню, то потом много сильно будет...

Времени не хватает... :-(

24 (изменено: Евген, 2010-05-14 17:58:29)

Re: VBS/WMI: Ограничение времени работы избранных процессов

Уважаемые коллеги !
Приветсвую Вас в добрый пятничный вечер
Сегодня чудом появилось свободное время после обеда, и вот что у меня по теме получилось - всё работает как надо, единственное не успел сделать логирование нисколько, но обязательно сделаю при появлении свободного времени...

Итак, описание:
Данный скрипт ограничивает время работы избранных процессов (занесённых в массив) лимитом времени (прописанном в скрипте). Лимит времени выдаётся на 1 сутки, при смене суток лимит выдаётся по-новой в полном объёме. При истечении лимита времени и наличии любого рабочего процесса из списка, процесс будет завершён и не даст запуститься любому процессу, присутствующему в списке. Скрипт так же будет правильно работать при использовании спящего режима. Список процессов можно свободно изменять - при запуске скрипта произойдёт синхронизация имён процессов массива и реестра. При перезагрузке компьютера, учтённое время не сбрасывается.


Прошу заценить...

Public strPrevent       ' флаг запрета запуска
Public arrProcesses     ' массив процессов
Const HKEY_CURRENT_USER = &H80000001
strPause=3000           ' значение паузы 3 секунды
strPauseTime="00:00:03" ' тоже самое в формате времени
TimeLimit="00:45:00"    ' ограничение шпильного времени 45 минут 
strKeyPath = "Software\proc_monitor"                          ' ветка реестра где будет производиться учёт
arrProcesses=Array("monitor.exe","excel.exe","winword.exe")   ' список ограничиваемых процессов


strComputer = "."
Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\default:StdRegProv")
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2") 
Set WshShell = CreateObject("WScript.Shell")

On Error Resume Next                                         ' включаем обработку ошибок
WshShell.RegRead "HKEY_CURRENT_USER\Software\proc_monitor\"  ' проверяем, есть ли такая ветка реестра
If Err.Number<>0 Then
Err.Clear
On Error Goto 0                                               ' отключаем обработку ошибок
oReg.CreateKey HKEY_CURRENT_USER,strKeyPath                   ' если нет - то создаём ветку
oReg.CreateKey HKEY_CURRENT_USER,strKeyPath & "\CurrDate"     ' создаём веточку для даты
oReg.SetStringValue HKEY_CURRENT_USER,strKeyPath & "\CurrDate","strDate",CStr(DateValue(Date)) ' прописываем сегоднящнюю дату
End If



      ' сейчас будем синхронизировать список процессов в скрипте и реестре

strValue = "00:00:00"  ' нулевое время
oReg.EnumValues HKEY_CURRENT_USER, strKeyPath,arrValueNames

If IsNull(arrValueNames) Then               ' в реестре всё пусто, надо заполнять списком

For Each Process in arrProcesses
oReg.SetStringValue HKEY_CURRENT_USER,strKeyPath,Process,strValue
Next

Else                                        ' если учёт ранее вёлся


  ' Синхронизация реестра к массиву
  ' лишнее из реестра удаляется

For r=0 to UBound(arrValueNames)
strFlag=0                            ' флаг совпадения наименования процесса
For n=0 to UBound(arrProcesses)
If arrValueNames(r)=arrProcesses(n) Then
strFlag=1
Exit For
End If
Next

If strFlag=0 Then                     ' если совпадения нет - то удаляем
oReg.DeleteValue HKEY_CURRENT_USER,strKeyPath,arrValueNames(r)
End If

Next


  ' Синхронизация массива к реестру
  ' недостающие процессы дописываются в реестр

For r=0 to UBound(arrProcesses)
strFlag=0                            ' флаг совпадения наименования процесса
For n=0 to UBound(arrValueNames)
If arrProcesses(r)=arrValueNames(n) Then
strFlag=1
Exit For
End If
Next

If strFlag=0 Then             ' если совпадения нет - то дописываем в реестр
oReg.SetStringValue HKEY_CURRENT_USER,strKeyPath,arrProcesses(r),strValue
End If

Next

End if



                               '   ОСНОВНОЙ ЦИКЛ

Set SINK = WScript.CreateObject("WbemScripting.SWbemSink","SINK_")
objWMIService.ExecNotificationQueryAsync SINK, "SELECT * FROM __InstanceCreationEvent WITHIN 3 WHERE TargetInstance ISA 'Win32_Process'"

Do While 1=1

'   I  считывание, сравнение даты, обнуление счётчиков при смене даты

oReg.GetStringValue HKEY_CURRENT_USER,strKeyPath & "\CurrDate","strDate",strDate  ' считываем дату последнего учёта

If DateValue(strDate)<>DateValue(Date) Then                                       ' если даты не совпадают
For Each Process in arrProcesses
oReg.SetStringValue HKEY_CURRENT_USER,strKeyPath,Process,strValue                 ' то обнуляем счётчики отработанного времени у всех процессов
Next
oReg.SetStringValue HKEY_CURRENT_USER,strKeyPath & "\CurrDate","strDate",CStr(DateValue(Date)) ' прописываем сегоднящнюю дату
End If

'  II  расчёт суммарного шпильного времени

sumTime="00:00:00"

For Each Process in arrProcesses
oReg.GetStringValue HKEY_CURRENT_USER,strKeyPath,Process,strTime
sumTime=TimeValue(sumTime) + TimeValue(strTime)
Next

'  III  сравниваем "выработанное" время с лимитным и устанавливаем флаг запрета шпиля

If TimeValue(sumTime)>=TimeValue(TimeLimit) Then
strPrevent=1                                       ' ЗАПРЕЩЕНО
Else
strPrevent=0                                       ' РАЗРЕШЕНО
End If

'  IV   учёт времени работы процессов из списка и убивание процессов при выставленном флаге

Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_Process") 
For Each objItem in colItems 
   For Each Process in arrProcesses
     If LCase(objItem.Name)=LCase(Process) Then                                                                  ' если процесс из списка работает
              ' если флаг запрета запуска выставлен - то убиваем процессы из списка
       If strPrevent=1 Then  
           objItem.Terminate
           Exit For
       Else
          oReg.GetStringValue HKEY_CURRENT_USER,strKeyPath,Process,strTime
          oReg.SetStringValue HKEY_CURRENT_USER,strKeyPath,Process,CStr(TimeValue(strTime)+TimeValue(strPauseTime))    ' то к его времени прибавляем время паузы
       End If
     End If
   Next
Next

Wscript.Sleep strPause
Loop


      '  асинхронный убийца при запуске

Sub SINK_OnObjectReady(objLatestEvent, objAsyncContext)  

   If strPrevent=1 Then    ' при запуске убиваем процессы из списка при запрещающем флаге

   For Each Process in arrProcesses
   If LCase(Process)=LCase(objLatestEvent.TargetInstance.Name) Then
   objLatestEvent.TargetInstance.Terminate
   End If
   Next

   End if

End Sub

Если у кого есть возможность - то провеьте, отпишитесь и если можно - то в коллекцию...

Времени не хватает... :-(

25

Re: VBS/WMI: Ограничение времени работы избранных процессов

Запускал, есть одна непонятка в самом замысле. Вы же в сутки выделяете определённое время определённому человеку с его программами (сын и его игры)? Так вот всё бы шло как нельзя лучше, но при запуске двух приложений из списка (массива) одновременно, счёт идёт для обоих приложений паралельно. Т.е. в итоге если всё это время парень в силу многозадачности Windows будет запускать более одной игры, то он несколько быстрее сожгёт своё драгоценное время. И того обиднее случай, если игра по своей архитектуре запускает несколько процессов со своим названием... тогда вообще в разы сократится его удовольствие. "Будь милосерден, папа!"

Стремление - залог успеха

26 (изменено: Евген, 2010-05-14 19:41:42)

Re: VBS/WMI: Ограничение времени работы избранных процессов

Не поверите !
Я сына приучил правой кнопкой мыши щёлкать на ярлычок и выбирать "Открыть" !!!
Думаю двойной запуск исключён...

ну и WQL в WMI не поддерживает оператор ни DISTINCT ни GROUP BY чтобы отобрать только уникальные имена процессов, ну и с игрушками мне видать повезло в отличии от Вас...

Времени не хватает... :-(

27

Re: VBS/WMI: Ограничение времени работы избранных процессов

Увы. И еще один момент: что если игра зависла и осталась висеть лишь в процессах?
ну смотрите, рано или поздно можете наткнуться на такие игры - не думаю, что сын будет играть в одни и те же игры... Более того, молодёжи вся эта компьютерная техника - что семечки щелкать...

Стремление - залог успеха

28

Re: VBS/WMI: Ограничение времени работы избранных процессов

Можно я не буду отвечать...
мне всё понятно...;)

Времени не хватает... :-(

29

Re: VBS/WMI: Ограничение времени работы избранных процессов

Конечно, это почти риторический вопрос.

Евген пишет:

ну и WQL в WMI не поддерживает оператор ни DISTINCT ни GROUP BY чтобы отобрать только уникальные имена процессов

А что если при сканировании запущенных процессов чуть изменить способ: методом перебора при первом же результате (найден любой искомый процесс из массива) принимать меры (добавлять 3 сек и повторить скан через 3 сек, и так далее как у вас в примере...)?

Стремление - залог успеха

30

Re: VBS/WMI: Ограничение времени работы избранных процессов

Согласен
думаю Ваше предложение правильное...
сделаю...

Времени не хватает... :-(

31 (изменено: Евген, 2010-05-15 11:00:45)

Re: VBS/WMI: Ограничение времени работы избранных процессов

Public strPrevent       ' флаг запрета запуска
Public arrProcesses     ' массив процессов
Const HKEY_CURRENT_USER = &H80000001
strPause=3000           ' значение паузы 3 секунды
strPauseTime="00:00:03" ' тоже самое в формате времени
TimeLimit="00:45:00"    ' ограничение шпильного времени 45 минут 
strKeyPath = "Software\proc_monitor"                          ' ветка реестра где будет производиться учёт
arrProcesses=Array("monitor.exe","excel.exe","winword.exe")   ' список ограничиваемых процессов


strComputer = "."
Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\default:StdRegProv")
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2") 
Set WshShell = CreateObject("WScript.Shell")

On Error Resume Next                                         ' включаем обработку ошибок
WshShell.RegRead "HKEY_CURRENT_USER\Software\proc_monitor\"  ' проверяем, есть ли такая ветка реестра
If Err.Number<>0 Then
Err.Clear
On Error Goto 0                                               ' отключаем обработку ошибок
oReg.CreateKey HKEY_CURRENT_USER,strKeyPath                   ' если нет - то создаём ветку
oReg.CreateKey HKEY_CURRENT_USER,strKeyPath & "\CurrDate"     ' создаём веточку для даты
oReg.SetStringValue HKEY_CURRENT_USER,strKeyPath & "\CurrDate","strDate",CStr(DateValue(Date)) ' прописываем сегоднящнюю дату
End If



      ' сейчас будем синхронизировать список процессов в скрипте и реестре

strValue = "00:00:00"  ' нулевое время
oReg.EnumValues HKEY_CURRENT_USER, strKeyPath,arrValueNames

If IsNull(arrValueNames) Then               ' в реестре всё пусто, надо заполнять списком

For Each Process in arrProcesses
oReg.SetStringValue HKEY_CURRENT_USER,strKeyPath,Process,strValue
Next

Else                                        ' если учёт ранее вёлся


  ' Синхронизация реестра к массиву
  ' лишнее из реестра удаляется

For r=0 to UBound(arrValueNames)
strFlag=0                            ' флаг совпадения наименования процесса
For n=0 to UBound(arrProcesses)
If arrValueNames(r)=arrProcesses(n) Then
strFlag=1
Exit For
End If
Next

If strFlag=0 Then                     ' если совпадения нет - то удаляем
oReg.DeleteValue HKEY_CURRENT_USER,strKeyPath,arrValueNames(r)
End If

Next


  ' Синхронизация массива к реестру
  ' недостающие процессы дописываются в реестр

For r=0 to UBound(arrProcesses)
strFlag=0                            ' флаг совпадения наименования процесса
For n=0 to UBound(arrValueNames)
If arrProcesses(r)=arrValueNames(n) Then
strFlag=1
Exit For
End If
Next

If strFlag=0 Then             ' если совпадения нет - то дописываем в реестр
oReg.SetStringValue HKEY_CURRENT_USER,strKeyPath,arrProcesses(r),strValue
End If

Next

End if



                               '   ОСНОВНОЙ ЦИКЛ

Set SINK = WScript.CreateObject("WbemScripting.SWbemSink","SINK_")
objWMIService.ExecNotificationQueryAsync SINK, "SELECT * FROM __InstanceCreationEvent WITHIN 3 WHERE TargetInstance ISA 'Win32_Process'"

Do While 1=1

'   I  считывание, сравнение даты, обнуление счётчиков при смене даты

oReg.GetStringValue HKEY_CURRENT_USER,strKeyPath & "\CurrDate","strDate",strDate  ' считываем дату последнего учёта

If DateValue(strDate)<>DateValue(Date) Then                                       ' если даты не совпадают
For Each Process in arrProcesses
oReg.SetStringValue HKEY_CURRENT_USER,strKeyPath,Process,strValue                 ' то обнуляем счётчики отработанного времени у всех процессов
Next
oReg.SetStringValue HKEY_CURRENT_USER,strKeyPath & "\CurrDate","strDate",CStr(DateValue(Date)) ' прописываем сегоднящнюю дату
End If

'  II  расчёт суммарного шпильного времени

sumTime="00:00:00"

For Each Process in arrProcesses
oReg.GetStringValue HKEY_CURRENT_USER,strKeyPath,Process,strTime
sumTime=TimeValue(sumTime) + TimeValue(strTime)
Next

'  III  сравниваем "выработанное" время с лимитным и устанавливаем флаг запрета шпиля

If TimeValue(sumTime)>=TimeValue(TimeLimit) Then
strPrevent=1                                       ' ЗАПРЕЩЕНО
Else
strPrevent=0                                       ' РАЗРЕШЕНО
End If

'  IV   учёт времени работы процессов из списка и убивание процессов при выставленном флаге

Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_Process") 
For Each objItem in colItems 
strOut=0           ' обнуление флага выхода из циклов в начале первичного цикла For
   For Each Process in arrProcesses
     If LCase(objItem.Name)=LCase(Process) Then                                                                  ' если процесс из списка работает
              ' если флаг запрета запуска выставлен - то убиваем процессы из списка
       If strPrevent=1 Then  
           objItem.Terminate
           Exit For
       Else
          oReg.GetStringValue HKEY_CURRENT_USER,strKeyPath,Process,strTime
          oReg.SetStringValue HKEY_CURRENT_USER,strKeyPath,Process,CStr(TimeValue(strTime)+TimeValue(strPauseTime))    ' то к его времени прибавляем время паузы
           strOut=1   ' флаг выхода из цикла вложенного For при встрече любого первого процесса
           Exit For
       End If
     End If
   Next
If strOut=1 Then   ' в соответствии с флагом выхода выходим из первичного цикла For
     Exit For
End If
Next

Wscript.Sleep strPause
Loop


      '  асинхронный убийца при запуске

Sub SINK_OnObjectReady(objLatestEvent, objAsyncContext)  

   If strPrevent=1 Then    ' при запуске убиваем процессы из списка при запрещающем флаге

   For Each Process in arrProcesses
   If LCase(Process)=LCase(objLatestEvent.TargetInstance.Name) Then
   objLatestEvent.TargetInstance.Terminate
   End If
   Next

   End if

End Sub

Исправил, сейчас будет учитываться любой один первый встретившийся процесс

Времени не хватает... :-(

32

Re: VBS/WMI: Ограничение времени работы избранных процессов

Евген, поздравляю вас, теперь отлично получилось!

Стремление - залог успеха

33 (изменено: Евген, 2010-05-15 14:23:31)

Re: VBS/WMI: Ограничение времени работы избранных процессов

Спасибо !
Рад что не мне одному это пригодилось !!!
Теперь можно и в коллекцию

Времени не хватает... :-(

34

Re: VBS/WMI: Ограничение времени работы избранных процессов

Евген пишет:

Теперь можно и в коллекцию

Если администрация считает анолагично(?) - могу добавить, я только за...

Стремление - залог успеха

35 (изменено: Евген, 2010-05-17 17:55:31)

Re: VBS/WMI: Ограничение времени работы избранных процессов

До полного фарша ещё сделал не плохое логирование, логирует следующее:
1) Время запуска любого процесса из списка
2) Время его нормального закрытия
3) Время принудительного закрытия
4) Время предотвращение запуска
5) Смену суток

Файл лога располагается в папке где скрипт.

Public strPrevent       ' флаг запрета запуска
Public arrProcesses     ' массив процессов
Public LogFile
Const ForAppending = 8
Const HKEY_CURRENT_USER = &H80000001
strPause=3000           ' значение паузы 3 секунды
strPauseTime="00:00:03" ' тоже самое в формате времени
TimeLimit="00:45:00"    ' ограничение шпильного времени 45 минут 
strKeyPath = "Software\proc_monitor"                          ' ветка реестра где будет производиться учёт
Set FileSytemObject = CreateObject("Scripting.FileSystemObject") 
ParentFolderName = FileSytemObject.GetParentFolderName(Wscript.ScriptFullName) 
LogFile = FileSytemObject.BuildPath(ParentFolderName,"PlayTime.log") 

arrProcesses=Array("IceAge2pc.exe","dirt2.exe","DiRT.exe","speed.exe","Game.exe","iceage3.exe","Tumblebugs.exe","FarmFrenzy3_America.wrp.exe","FerrariVR.exe","MTX.exe","FarmFrenzy3.wrp.exe","motogp2.exe","TmForever.exe","FarmFrenzy3_Arctica.exe")

strComputer = "."
Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\default:StdRegProv")
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2") 
Set WshShell = CreateObject("WScript.Shell")

On Error Resume Next                                         ' включаем обработку ошибок
WshShell.RegRead "HKEY_CURRENT_USER\Software\proc_monitor\"  ' проверяем, есть ли такая ветка реестра
If Err.Number<>0 Then
Err.Clear
On Error Goto 0                                               ' отключаем обработку ошибок
oReg.CreateKey HKEY_CURRENT_USER,strKeyPath                   ' если нет - то создаём ветку
oReg.CreateKey HKEY_CURRENT_USER,strKeyPath & "\CurrDate"     ' создаём веточку для даты
oReg.SetStringValue HKEY_CURRENT_USER,strKeyPath & "\CurrDate","strDate",CStr(DateValue(Date)) ' прописываем сегоднящнюю дату
End If



      ' сейчас будем синхронизировать список процессов в скрипте и реестре

strValue = "00:00:00"  ' нулевое время
oReg.EnumValues HKEY_CURRENT_USER, strKeyPath,arrValueNames

If IsNull(arrValueNames) Then               ' в реестре всё пусто, надо заполнять списком

For Each Process in arrProcesses
oReg.SetStringValue HKEY_CURRENT_USER,strKeyPath,Process,strValue
Next

Else                                        ' если учёт ранее вёлся


  ' Синхронизация реестра к массиву
  ' лишнее из реестра удаляется

For r=0 to UBound(arrValueNames)
strFlag=0                            ' флаг совпадения наименования процесса
For n=0 to UBound(arrProcesses)
If arrValueNames(r)=arrProcesses(n) Then
strFlag=1
Exit For
End If
Next

If strFlag=0 Then                     ' если совпадения нет - то удаляем
oReg.DeleteValue HKEY_CURRENT_USER,strKeyPath,arrValueNames(r)
End If

Next


  ' Синхронизация массива к реестру
  ' недостающие процессы дописываются в реестр

For r=0 to UBound(arrProcesses)
strFlag=0                            ' флаг совпадения наименования процесса
For n=0 to UBound(arrValueNames)
If arrProcesses(r)=arrValueNames(n) Then
strFlag=1
Exit For
End If
Next

If strFlag=0 Then             ' если совпадения нет - то дописываем в реестр
oReg.SetStringValue HKEY_CURRENT_USER,strKeyPath,arrProcesses(r),strValue
End If

Next

End if



                               '   ОСНОВНОЙ ЦИКЛ

' асинхронный обработчик на создание процесса
Set SINKC = WScript.CreateObject("WbemScripting.SWbemSink","SINKC_")
objWMIService.ExecNotificationQueryAsync SINKC, "SELECT * FROM __InstanceCreationEvent WITHIN 3 WHERE TargetInstance ISA 'Win32_Process'"

' асинхронный обработчик на удаление процесса
Set SINKT = WScript.CreateObject("WbemScripting.SWbemSink","SINKT_")
objWMIService.ExecNotificationQueryAsync SINKT, "SELECT * FROM __InstanceDeletionEvent WITHIN 3 WHERE TargetInstance ISA 'Win32_Process'"

Do While 1=1

'   I  считывание, сравнение даты, обнуление счётчиков при смене даты

oReg.GetStringValue HKEY_CURRENT_USER,strKeyPath & "\CurrDate","strDate",strDate  ' считываем дату последнего учёта

If DateValue(strDate)<>DateValue(Date) Then                                       ' если даты не совпадают
For Each Process in arrProcesses
oReg.SetStringValue HKEY_CURRENT_USER,strKeyPath,Process,strValue                 ' то обнуляем счётчики отработанного времени у всех процессов
Next
oReg.SetStringValue HKEY_CURRENT_USER,strKeyPath & "\CurrDate","strDate",CStr(DateValue(Date)) ' прописываем сегоднящнюю дату
   ' логируем смену даты
   Set LogF = FileSytemObject.OpenTextFile(LogFile, ForAppending, True) 
   LogF.WriteLine String(25,"-") & "  " & DateValue(Date) & "  " & String(25,"-")
   LogF.Close
End If

'  II  расчёт суммарного шпильного времени

sumTime="00:00:00"

For Each Process in arrProcesses
oReg.GetStringValue HKEY_CURRENT_USER,strKeyPath,Process,strTime
sumTime=TimeValue(sumTime) + TimeValue(strTime)
Next

'  III  сравниваем "выработанное" время с лимитным и устанавливаем флаг запрета шпиля

If TimeValue(sumTime)>=TimeValue(TimeLimit) Then
strPrevent=1                                       ' ЗАПРЕЩЕНО
Else
strPrevent=0                                       ' РАЗРЕШЕНО
End If

'  IV   учёт времени работы процессов из списка и убивание процессов при выставленном флаге

Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_Process") 
For Each objItem in colItems 
strOut=0           ' обнуление флага выхода из цклов в начале первичного цикла For
   For Each Process in arrProcesses
     If LCase(objItem.Name)=LCase(Process) Then                                                                  ' если процесс из списка работает
              ' если флаг запрета запуска выставлен - то убиваем процессы из списка
       If strPrevent=1 Then  
           objItem.Terminate
      ' здесь логируем здесь логируем принудительно закрытый процесс
   Set LogF = FileSytemObject.OpenTextFile(LogFile, ForAppending, True) 
   LogF.WriteLine Now & " принудительно закрыт процесс: " & LCase(Process)
   LogF.Close
           Exit For
       Else
          oReg.GetStringValue HKEY_CURRENT_USER,strKeyPath,Process,strTime
          oReg.SetStringValue HKEY_CURRENT_USER,strKeyPath,Process,CStr(TimeValue(strTime)+TimeValue(strPauseTime))    ' то к его времени прибавляем время паузы
           strOut=1   ' флаг выхода из цикла вложенного For при встрече любого первого процесса
           Exit For
       End If
     End If
   Next
If strOut=1 Then   ' в соответствии с флагом выхода выходим из первичного цикла For
     Exit For
End If
Next

Wscript.Sleep strPause
Loop


      '  асинхронный убийца при запуске

Sub SINKC_OnObjectReady(objLatestEvent, objAsyncContext)  

   For Each Process in arrProcesses
   If LCase(Process)=LCase(objLatestEvent.TargetInstance.Name) Then

   If strPrevent=1 Then    ' при запуске убиваем процессы из списка при запрещающем флаге
   objLatestEvent.TargetInstance.Terminate

   ' здесь логируем предотвращённый запуск
   Set LogF = FileSytemObject.OpenTextFile(LogFile, ForAppending, True) 
   LogF.WriteLine Now & " предотвращен запуск: " & objLatestEvent.TargetInstance.Name
   LogF.Close
   Exit Sub
   End If

   ' здесь логируем разрешённый запуск
   Set LogF = FileSytemObject.OpenTextFile(LogFile, ForAppending, True) 
   LogF.WriteLine Now & " запущен процесс: " & objLatestEvent.TargetInstance.Name
   LogF.Close

   End If
   Next

End Sub



' логирование при закрытии процесса

Sub SINKT_OnObjectReady(objLatestEvent, objAsyncContext)  

   For Each Process in arrProcesses
   If LCase(Process)=LCase(objLatestEvent.TargetInstance.Name) Then
   If strPrevent<>1 Then  ' если этот флаг не учитывать - то будет проходить двойное логирование (принудительное и потом нормальное)
   Set LogF = FileSytemObject.OpenTextFile(LogFile, ForAppending, True) 
   LogF.WriteLine Now & " нормально закрыт процесс: " & objLatestEvent.TargetInstance.Name
   LogF.Close
   End If
   End If
   Next

End Sub
Времени не хватает... :-(

36 (изменено: Евген, 2010-05-20 19:47:26)

Re: VBS/WMI: Ограничение времени работы избранных процессов

OFF: Сегодня вместо детей жена наткнулась на результат действия скрипта
возвращаюсь с вечерней пробежки, все провода из розеток выдернуты, ADSL модем выключен, клава и мышь выдернуты из системного блока, стабилизатор вырублен, жена сидит в другой комнате зырит телек (от жены только изображение, звука нет, на пинги нет ответа). Когда выходил на пробежку - сидела, шпилила...

Фиговая наверно затея скрипта

Времени не хватает... :-(

37 (изменено: Евген, 2010-10-22 18:35:03)

Re: VBS/WMI: Ограничение времени работы избранных процессов

Коллеги, занесите этот скрипт пожалуйста в коллекцию...
я его уже скольким своим друзьям раздал причём по их же просьбе...   они все ищуют какой-нить софтвер на данную тему, а тут на - готовое решение с полным логированием... 

Решение не из простых...   тут подумать и придумать надо было...

Администрация, Вы не против ?

Времени не хватает... :-(

38

Re: VBS/WMI: Ограничение времени работы избранных процессов

а о временных и постоянных подписчиков никто не в курсе что ли ?

Я конечно далек от мысли... (с)

39

Re: VBS/WMI: Ограничение времени работы избранных процессов

Я - нет...
если можете, дайте ссылку или опишите...

Времени не хватает... :-(

40

Re: VBS/WMI: Ограничение времени работы избранных процессов

Евген
Спасибо, твой статус изменён. Прошу ознакомиться и создать новую тему в Коллекции.
http://yoursmileys.ru/tsmile/forum/t1230.gif

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

41

Re: VBS/WMI: Ограничение времени работы избранных процессов

Спасибо !!!

Времени не хватает... :-(

42 (изменено: Евген, 2010-10-23 17:27:28)

Re: VBS/WMI: Ограничение времени работы избранных процессов

smaharbA пишет:

а о временных и постоянных подписчиков никто не в курсе что ли ?

Почитал про подписчиков, Вы считаете с ними легче ?
Это на каждом компе у пользователя что-то компилить надо будет...  и какой тогда алгоритм учёта будет ?
Не подумайте что я придираюсь...  я просто хочу разобраться в их применении и употреблении относительно данной задачи...

Времени не хватает... :-(