<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; HTA, VBS: Родительский контроль для XP]]></title>
	<link rel="self" href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=7742&amp;type=atom" />
	<updated>2012-10-31T04:39:49Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.script-coding.com/viewtopic.php?id=7742</id>
		<entry>
			<title type="html"><![CDATA[Re: HTA, VBS: Родительский контроль для XP]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=65281#p65281" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>alexii пишет:</cite><blockquote><p>OFF: <strong>dab00</strong>, ребёнок Ctlr-Esc, select «mshta.exe», Del, Enter ещё не освоил <img src="//forum.script-coding.com/img/smilies/wink.png" width="15" height="15" />?</p></blockquote></div><p>HTA - интерфейс, все работает на постоянной подписке WMI (понятно после беглого прочтения кода), а ее мало кто из взрослых освоил <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /></p>]]></content>
			<author>
				<name><![CDATA[dab00]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27085</uri>
			</author>
			<updated>2012-10-31T04:39:49Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=65281#p65281</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: HTA, VBS: Родительский контроль для XP]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=65278#p65278" />
			<content type="html"><![CDATA[<p>OFF: <strong>dab00</strong>, ребёнок Ctlr-Esc, select «mshta.exe», Del, Enter ещё не освоил <img src="//forum.script-coding.com/img/smilies/wink.png" width="15" height="15" />?</p>]]></content>
			<author>
				<name><![CDATA[alexii]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=1844</uri>
			</author>
			<updated>2012-10-30T21:02:46Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=65278#p65278</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[HTA, VBS: Родительский контроль для XP]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=65239#p65239" />
			<content type="html"><![CDATA[<p>Намедни ко мне обратился товарищ с просьбой помочь ограничить время, которое его ребенок проводит за компьютером. <br />Родительский контроль не в счет - у него XP, кроме того было необходимо не задавать часы использования, а контролировать время в совокупности за день.<br />В итоге получилось вот такое HTA:<br /></p><div class="codebox"><pre><code>
&lt;html&gt;
&lt;head&gt;
	&lt;title&gt;TR&lt;/title&gt;	
	&lt;meta http-equiv=content-type content=&quot;text-html; charset=windows-1251&quot;&gt;
    &lt;meta http-equiv=MSThemeCompatible content=yes&gt;
    &lt;hta:application              
		icon=keymgr.dll
        scroll=no
		maximizebutton=no
		version=&quot;1.0&quot;
    &gt;
&lt;/head&gt;
&lt;style type=&quot;text/css&quot;&gt;	
	#btn{width:100px;}
	#min{width:35px;}
&lt;/style&gt;
&lt;script language=&quot;VBScript&quot;&gt;
	Const ClassName = &quot;MySuperClass&quot;	
	Const TimerId = &quot;MySuperTimer&quot;
	Const ConsumerTimer = &quot;MySuperConsumer&quot;
	Const FilterTimer = &quot;MySuperFilter&quot;
	
	Sub window_onload()
		window.resizeTo 230, 90
		window.moveTo 20, 20		
		window.setTimeout &quot;afterLoad&quot;,10, &quot;vbscript&quot;
	End Sub
	
	Sub afterLoad()
		Const MinutePermited = &quot;MinutePermited&quot;
		Set objDefault = GetObject(&quot;winmgmts:\\.\root\default&quot;)
		If ClassExists(objDefault) Then			
			min.Value = objDefault.Get(ClassName).Properties_(MinutePermited) &#039;читаем значение свойства
			Set objSubscription = GetObject(&quot;winmgmts:\\.\root\subscription&quot;)
			If SubscriptionExists(objSubscription) Then				
				btn.Value = &quot;Удалить&quot;
			Else
				btn.Value = &quot;Установить&quot;				
			End If
			Set objSubscription = Nothing
		Else
			btn.Value = &quot;Установить&quot;
		End If
		Set objDefault = Nothing
	End Sub
	
	Sub btn_onclick()
		Set objSubscription = GetObject(&quot;winmgmts:\\.\root\subscription&quot;)
		If Me.Value = &quot;Установить&quot; Then
			If min.Value = vbNullString Or Not IsNumeric(min.Value) Then
				MsgBox &quot;Введите количество минут&quot;
			Else
				If InstallTR Then Me.Value = &quot;Удалить&quot;
			End If			
		Else
			If DeleteTR Then 
				Me.Value = &quot;Установить&quot;
				min.Value = &quot;&quot;
			End If
		End If
		Set objSubscription = Nothing
	End Sub	
	
	Function InstallTR()
		On Error Resume Next
		Set objDefault = GetObject(&quot;winmgmts:\\.\root\default&quot;)
		If ClassCreate(objDefault) Then
			Set objSubscription = GetObject(&quot;winmgmts:\\.\root\subscription&quot;)
			If ScriptConsumerExists(objSubscription) Then
				If SubscriptionCreate(objSubscription) Then InstallTR = True
			End If
			Set objSubscription = Nothing
		End If
		Set objDefault = Nothing
	End Function
	
	Function DeleteTR()
		On Error Resume Next
		Set objSubscription = GetObject(&quot;winmgmts:\\.\root\subscription&quot;)
		If SubscriptionDelete(objSubscription) Then
			Set objDefault = GetObject(&quot;winmgmts:\\.\root\default&quot;)
			If ClassDelete(objDefault) Then DeleteTR = True
			Set objDefault = Nothing
		End If
		Set objSubscription = Nothing
	End Function
	
	&#039;***** Класс *****
	&#039;наличие класса
	Function ClassExists(objDefault)
		On Error Resume Next
		For Each objClass In objDefault.SubclassesOf()			
			If InStr(objClass.Path_.Path, ClassName) Then
				ClassExists = True
				Exit Function
			End If
		Next
	End Function

	&#039;создаем класс
	Function ClassCreate(objDefault)
		On Error Resume Next
		Const Created = &quot;Created&quot; &#039;дата создания
		Const LastBootUpDate = &quot;LastBootUpDate&quot; &#039;дата последней загрузки
		Const MinuteCount = &quot;MinuteCounter&quot; &#039;счетчик отработанных минут
		Const MinutePermited = &quot;MinutePermited&quot; &#039;количество разрешенных минут
		With objDefault.Get()
			.Path_.Class = ClassName
			&#039;добавляем свойства
			.Properties_.Add Created, 101
			.Properties_.Add LastBootUpDate, 101	
			.Properties_.Add MinuteCount, 19
			.Properties_.Add MinutePermited, 19
			&#039;значения свойств
			Set dateTime = CreateObject(&quot;WbemScripting.SWbemDateTime&quot;)		
			dateTime.SetVarDate Now(),True		
			.Properties_(Created) = dateTime.Value		
			.Properties_(LastBootUpDate) = dateTime.Value
			.Properties_(MinuteCount) = 0
			.Properties_(MinutePermited) = min.Value
			&#039;пишем класс в репозиторий
			.Put_
		End With
		If Err.Number = 0 Then
			ClassCreate = True
		End If	
	End Function
		
	&#039;удаляем класс
	Function ClassDelete(objDefault)	
		On Error Resume Next
		With objDefault.Get()
			.Path_.Class = ClassName
			.Put_
		End With
		objDefault.Delete ClassName
		If Err.Number = 0 Then
			ClassDelete = True
		End If
	End Function
	&#039;********************
	
	&#039;***** Подписка *****
	&#039;проверка регистрации ActiveScriptEventConsumer
	Function ScriptConsumerExists(objSubscription)
		On Error Resume Next
		If objSubscription.ExecQuery( _
				&quot;SELECT * FROM __Provider WHERE Name=&#039;ActiveScriptEventConsumer&#039;&quot;).Count Then
			ScriptConsumerExists = True
		End If
	End Function

	&#039;наличие подписки
	Function SubscriptionExists(objSubscription)
		On Error Resume Next
		If objSubscription.ExecQuery(&quot;SELECT * FROM ActiveScriptEventConsumer WHERE Name = &#039;&quot; &amp; ConsumerTimer &amp; &quot;&#039;&quot;).Count Then			
			SubscriptionExists = True
		End If
	End Function

	&#039;создаем подписку	
	Function SubscriptionCreate(objSubscription)
		On Error Resume Next
		Dim sTime
		sTime = 60000 &#039;миллисекунд для таймера	
		&#039;создание таймера и его конфигурирование
		With objSubscription.Get(&quot;__IntervalTimerInstruction&quot;).SpawnInstance_()
			.TimerId = TimerId
			.IntervalBetweenEvents = sTime &#039;миллисекунд
			.SkipIfPassed = True &#039;пропустить, если событие прошло
			.Put_
		End With
		
		&#039;создание фильтра таймера
		With objSubscription.Get(&quot;__EventFilter&quot;).SpawnInstance_()
			.Name = FilterTimer
			.QueryLanguage = &quot;WQL&quot;
			.Query = &quot;SELECT * FROM __TimerEvent WHERE TimerId = &#039;&quot; &amp; TimerId &amp; &quot;&#039;&quot;
			Set objFilterPath = .Put_()
		End With
		
		&#039;собираем текст скрипта
		varrr = &quot;On Error Resume Next&quot; &amp; vbCrLf &amp; &quot;Const ClassName = &quot;&quot;MySuperClass&quot;&quot;&quot; &amp; vbCrLf &amp; &quot;Const LastBootUpDate = &quot;&quot;LastBootUpDate&quot;&quot;&quot; &amp; vbCrLf &amp; &quot;Const MinuteCount = &quot;&quot;MinuteCounter&quot;&quot;&quot; &amp; vbCrLf &amp; &quot;Const MinutePermited = &quot;&quot;MinutePermited&quot;&quot;&quot; &amp; vbCrLf &amp; &quot;Set objDefault = GetObject(&quot;&quot;winmgmts:\\.\root\default:&quot;&quot; &amp; ClassName)&quot; &amp; vbCrLf &amp; &quot;If ClassExists(objDefault) Then&quot; &amp; vbCrLf &amp; &quot;Set dateTime = CreateObject(&quot;&quot;WbemScripting.SWbemDateTime&quot;&quot;)&quot; &amp; vbCrLf &amp; &quot;dateTime.Value = objDefault.Properties_(LastBootUpDate)&quot; &amp; vbCrLf &amp; &quot;If DateValue(dateTime.GetVarDate()) &lt;&gt; Date() Then&quot; &amp; vbCrLf
		varrr = varrr &amp; &quot;dateTime.SetVarDate Now(),True&quot; &amp; vbCrLf &amp; &quot;With objDefault&quot; &amp; vbCrLf &amp; &quot;.Properties_(LastBootUpDate) = dateTime.Value&quot; &amp; vbCrLf &amp; &quot;.Properties_(MinuteCount) = 0&quot; &amp; vbCrLf &amp; &quot;.Put_&quot; &amp; vbCrLf &amp; &quot;End With&quot; &amp; vbCrLf &amp; &quot;End If&quot; &amp; vbCrLf &amp; &quot;With objDefault&quot; &amp; vbCrLf &amp; &quot;.Properties_(MinuteCount) = .Properties_(MinuteCount) + 1&quot; &amp; vbCrLf &amp; &quot;.Put_		&quot; &amp; vbCrLf &amp; &quot;If .Properties_(MinuteCount) &gt;= .Properties_(MinutePermited) Then Shutdown&quot; &amp; vbCrLf
		varrr = varrr &amp; &quot;End With&quot; &amp; vbCrLf &amp; &quot;End If&quot; &amp; vbCrLf &amp; &quot;Function ClassExists(objDefault)&quot; &amp; vbCrLf &amp; &quot;On Error Resume Next&quot; &amp; vbCrLf &amp; &quot;For Each objClass In objDefault.SubclassesOf()&quot; &amp; vbCrLf &amp; &quot;If InStr(objClass.Path_.Path, ClassName) Then&quot; &amp; vbCrLf &amp; &quot;ClassExists = True&quot; &amp; vbCrLf &amp; &quot;Exit Function&quot; &amp; vbCrLf &amp; &quot;End If&quot; &amp; vbCrLf &amp; &quot;Next&quot; &amp; vbCrLf &amp; &quot;End Function&quot; &amp; vbCrLf
		varrr = varrr &amp; &quot;Sub Shutdown()&quot; &amp; vbCrLf &amp; &quot;On Error Resume Next&quot; &amp; vbCrLf &amp; &quot;For Each obj In GetObject(&quot;&quot;winmgmts:{impersonationLevel=impersonate,(Shutdown)}!\\.\root\cimv2&quot;&quot;).ExecQuery(&quot;&quot;SELECT * FROM Win32_OperatingSystem&quot;&quot;)&quot; &amp; vbCrLf &amp; &quot;obj.Win32Shutdown(12)&quot; &amp; vbCrLf &amp; &quot;Next&quot; &amp; vbCrLf &amp; &quot;End Sub&quot;
		
		&#039;создание потребителя события таймера
		With objSubscription.Get(&quot;ActiveScriptEventConsumer&quot;).SpawnInstance_()
			.Name = ConsumerTimer
			.ScriptingEngine = &quot;VBScript&quot;
			.KillTimeout = 10 &#039;завершить выполнение через 10 секунд		
			&#039;.ScriptFileName = &quot;C:\temp\Go.vbs&quot; &#039;для проверки
			.ScriptText = varrr
			Set objConsumerPath = .Put_()
		End With
		
		&#039;связка фильтра и потребителя
		With objSubscription.Get(&quot;__FilterToConsumerBinding&quot;).SpawnInstance_()
			.Filter = objFilterPath
			.Consumer = objConsumerPath
			.Put_
		End With
		
		If Err.Number = 0 Then
			SubscriptionCreate = True
		End If
	End Function

	&#039;удаляем подписку
	Function SubscriptionDelete(objSubscription)
		On Error Resume Next	
		&#039;удаляем фильтр таймера
		Set colFilters = objSubscription.ExecQuery(&quot;SELECT * FROM __EventFilter WHERE Name=&#039;&quot; &amp; FilterTimer &amp; &quot;&#039;&quot;)
		If colFilters.Count Then
			For Each objFilter In colFilters
				objFilter.Delete_
			Next
		End If
		Set colFilters = Nothing
		
		&#039;удаляем потребителя таймера
		Set colConsumers = objSubscription.ExecQuery(&quot;SELECT * FROM ActiveScriptEventConsumer WHERE Name=&#039;&quot; &amp; ConsumerTimer &amp; &quot;&#039;&quot;)
		If colConsumers.Count Then
			For Each objConsumer In colConsumers
				objConsumer.Delete_
			Next
		End If
		Set colConsumers = Nothing
		
		Set colTimers = objSubscription.ExecQuery(&quot;SELECT * FROM __IntervalTimerInstruction WHERE TimerId=&#039;&quot; &amp; TimerId &amp; &quot;&#039;&quot;)
		If colTimers.Count Then
			For Each objTimer In colTimers
				objTimer.Delete_
			Next
		End If
		Set colTimers = Nothing
		
		If Err.Number = 0 Then
			SubscriptionDelete = True
		End If
	End Function
	&#039;********************	
&lt;/script&gt;
&lt;body&gt;
	&lt;input id=&quot;btn&quot; type=&quot;button&quot;/&gt; &lt;input id=&quot;min&quot; type=&quot;text&quot;/&gt; минут
&lt;/body&gt; 
&lt;/html&gt;</code></pre></div><p>Папам и мамам посвящается... <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /></p>]]></content>
			<author>
				<name><![CDATA[dab00]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27085</uri>
			</author>
			<updated>2012-10-30T07:36:53Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=65239#p65239</id>
		</entry>
</feed>
