Что нового

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

StarEdik

Новичок
Сообщения
365
Репутация
4
Версия AutoIt: 3.3.6.1

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

- количество юзеров 3
- время провождения каждого от 20 минут до 3 часов за день.
- разрешение для каждого юзера по паролю (у каждого свой)
- по окончании лимита времени запретит дальнейшую работу на компьютере с представлением возможности для других имеющих время и выключение компьютера.Примерный код
Код:
#include <ButtonConstants.au3>
#include <ComboConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

$Form1 = GUICreate("Form1", 203, 169, 192, 114)
$Button1 = GUICtrlCreateButton("1", 17, 16, 81, 20)
$Label2 = GUICtrlCreateLabel("мин", 165, 19, 24, 17)
$Combo1 = GUICtrlCreateCombo("", 106, 16, 57, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL))
GUICtrlSetData(-1, "20|30|60|120|180" , "30")
$Button2 = GUICtrlCreateButton("2", 18, 52, 81, 20)
$Label1 = GUICtrlCreateLabel("мин", 166, 55, 24, 17)
$Combo2 = GUICtrlCreateCombo("", 107, 52, 57, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL))
GUICtrlSetData(-1, "20|30|60|120|180" , "30")
$Button3 = GUICtrlCreateButton("3", 18, 85, 81, 20)
$Label3 = GUICtrlCreateLabel("мин", 166, 88, 24, 17)
$Combo3 = GUICtrlCreateCombo("", 107, 85, 57, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL))
GUICtrlSetData(-1, "20|30|60|120|180" , "30")
$Button4 = GUICtrlCreateButton("Настройки", 20, 128, 79, 22)
$Button5 = GUICtrlCreateButton("Выкл", 108, 128, 78, 21)
GUISetState(@SW_SHOW)

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit

	EndSwitch
WEnd
Примечания:
 

mr.Gbabak

Осваивающий
Сообщения
257
Репутация
23
Мне кажется, что этого средствами AUtoIt не сделать, ибо закрыть скрипт через диспетчер задач, ни кто не помешает...хотя, если есть возможность спрятать процесс...но я о такой не слышал.
Интересно самому стало!
 
Автор
StarEdik

StarEdik

Новичок
Сообщения
365
Репутация
4
mr.Gbabak
Спасибо.Скрыт процес не надо.Хотя кое какие клавиши на время мохно заблокировать.
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Такой софт есть в любом компутерном клюбе.
:Typing:
 

mr.Gbabak

Осваивающий
Сообщения
257
Репутация
23
C2H5OH
Так там вроде ограничивает работу клиентского компьютера сервер?
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
StarEdik
В windows 7 есть такая штука как родительский контроль. Вот цитата из справки
Ограничение времени. Можно ограничить время, в течение которого детям разрешен вход в систему. Это не позволит детям входить в систему в течение определенного периода. Можно установить разные разрешенные часы доступа для каждого дня недели. Если в момент окончания разрешенного периода времени дети работают за компьютером, происходит автоматический выход из системы.
Я думаю это то что вам нужно.
 
Автор
StarEdik

StarEdik

Новичок
Сообщения
365
Репутация
4
inververs
Спасибо за инфу.Только вот дело втом, что во первых надо для XP и на родном AutoIt-е
 

mr.Gbabak

Осваивающий
Сообщения
257
Репутация
23
inververs
Автор не совсем то имел ввиду, средства windows 7 просто ограничивают время работы за компом (скажем только с 5 до 7 часов вечера), а автору нужно чтоб пользователь мог работать не более 3 часов в день, причем время в разных сессий складывалось.

StarEdik
Почитайте тему http://autoit-script.ru/index.php/topic,162.0.html
 

Crazy Kvace

Знающий
Сообщения
30
Репутация
8
Сталкивался с подобным случаем, когда надо было ограничить доступ к компьютеру. Вот вам пару моих "жестоких" примеров ;), возможно они пригодятся при написанни вашей программы:

Блокировка Диспечера задач - что бы с помощью него не можно было закрыть вашу программу:
Код:
RegWrite("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System", "DisableTaskMgr", "REG_DWORD", "1") ;блокировка
RegWrite("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System", "DisableTaskMgr", "REG_DWORD", "0") ;разблокировка


Для того что бы окно программы не могли закрыть, в форме программы используйте вот такой код:
Код:
$Form1 = GUICreate("", 203, 169, -1, -1, $WS_POPUP + $WS_GROUP, $WS_EX_TOPMOST)


Уберите обработку закрытия программы:
Код:
Case $GUI_EVENT_CLOSE
            Exit

Иначе ее можно будет закрыть с помощью Alt+F4. Для закрытия придумайте что нибуть другое.

И наконец, что бы курсором мыши можно было водить только в окне программы (не обизательно разворачивать форму на весь экран):
Код:
#include <WinAPI.au3>
#include <WinAPIEx.au3>

Func _Mouse()
	$hWnd = WinGetHandle("[CLASS:AutoIt v3 GUI]")
	$tRECT = _WinAPI_GetWindowRect($hWnd)
	_WinAPI_ClipCursor($tRECT)
EndFunc

AdlibRegister("_Mouse", 1000)


:smile:
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Вот грубый вариант (по заказу с первого сообщения):

Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <Array.au3>
#include <String.au3>
#include <Misc.au3>

Global $sApp_Name = 'User Limiter'
Global $sConfig = StringTrimRight(@ScriptFullPath, 3) & 'ini'

;Default values (users)
Global $aDefault_Users[4][4] = [ _ ;[CtrlID, User Name, Minutes left, Password]
	[3], _
		[0, 'Jon', 30, 'qwerty'], _
		[0, 'Stefan', 30, 'qwerty'], _
		[0, 'George', 30, 'qwerty'] _
	]

Global $aUsers

Global $iActiveUser = -1
Global $iUsageTimer = -1

Global $sEndSession_HK = '^+e' ;Ctrl + Shift + E
Global $sExit_HK = '^+q' ;Ctrl + Shift + Q

Opt('GUICloseOnESC', 0)

$hGUI = GUICreate($sApp_Name, 400, 200, -1, -1, BitOR($WS_MINIMIZEBOX, $WS_CAPTION, $WS_POPUP), $WS_EX_TOPMOST)
GUICtrlCreateGroup('Users List', 10, 20, 380, 160)
_LoadUsersList_Proc()
GUISetState(@SW_SHOW, $hGUI)

_LockGUI_Proc()
AdlibRegister('_LockGUI_Proc', 500)
HotKeySet($sExit_HK, '_Exit')

While 1
	$iMsg = GUIGetMsg()
	
	Switch $iMsg
		Case $aUsers[1][0] To $aUsers[$aUsers[0][0]][0]
			$iIndex = _ArraySearch($aUsers, $iMsg, 1, 0, 0, 0, 1, 0)
			
			If @error Then
				ContinueLoop
			Else
				If $aUsers[$iIndex][2] <= 0 Then
					MsgBox(48, 'Attention', $aUsers[$iIndex][1] & ',' & @CRLF & 'Your session has been expired.', 0, $hGUI)
					ContinueLoop
				EndIf
			EndIf
			
			$sPass = InputBox($sApp_Name & ' - Password', 'Account password:', '', '*', 300, 150, Default, Default, 0, $hGUI)
			
			If Not @error Then
				If $sPass == $aUsers[$iIndex][3] Then
					$iActiveUser = $iIndex
					_AllowCompUsage_Proc()
				Else
					$iActiveUser = -1
					MsgBox(48, 'Error', 'Wrong password.', 0, $hGUI)
				EndIf
			EndIf
	EndSwitch
WEnd

Func _LoadUsersList_Proc()
	Local $aSectNames = IniReadSectionNames($sConfig)
	
	If @error Then
		$aUsers = $aDefault_Users
		Return SetError(1)
	EndIf
	
	Dim $aUsers[$aSectNames[0]+1][4]
	Local $iTop = 40
	
	For $i = 1 To $aSectNames[0]
		$aUsers[$i][1] = $aSectNames[$i]
		$aUsers[$i][2] = IniRead($sConfig, $aSectNames[$i], 'Timer', 30)
		$aUsers[$i][3] = _StringEncrypt(0, IniRead($sConfig, $aSectNames[$i], 'Pass', 'qwerty'), $aUsers[$i][1])
		
		$aUsers[$i][0] = GUICtrlCreateButton($aUsers[$i][1], 20, $iTop, 80, 20)
		GUICtrlCreateLabel($aUsers[$i][2] & ' min. left', 270, $iTop+3, 100, 15)
		$iTop += 25
	Next
	
	$aUsers[0][0] = $aSectNames[0]
EndFunc

Func _LockGUI_Proc()
	Local $aWinPos = WinGetPos($hGUI)
	_MouseTrap($aWinPos[0], $aWinPos[1], $aWinPos[0]+$aWinPos[2], $aWinPos[1]+$aWinPos[3])
	
	If Not WinActive($hGUI) And Not WinActive($sApp_Name & ' - Password') Then WinActivate($hGUI)
EndFunc

Func _AllowCompUsage_Proc()
	GUISetState(@SW_HIDE, $hGUI)
	AdlibUnRegister('_LockGUI_Proc')
	AdlibRegister('_CheckUserTime_Proc', 1000)
	HotKeySet($sEndSession_HK, '_EndUserSession_Proc')
	$iUsageTimer = TimerInit()
EndFunc

Func _EndUserSession_Proc()
	GUISetState(@SW_SHOW, $hGUI)
	_LockGUI_Proc()
	AdlibRegister('_LockGUI_Proc', 500)
	AdlibUnRegister('_CheckUserTime_Proc')
	HotKeySet($sEndSession_HK)
	
	If $iActiveUser > 0 Then
		$aUsers[$iActiveUser][2] -= Round(TimerDiff($iUsageTimer) / 1000 / 60, 2)
		GUICtrlSetData($aUsers[$iActiveUser][0] + 1, $aUsers[$iActiveUser][2] & ' min. left')
	EndIf
	
	$iUsageTimer = -1
EndFunc

Func _CheckUserTime_Proc()
	If (TimerDiff($iUsageTimer) / 1000 / 60) >= $aUsers[$iActiveUser][2] Then
		_EndUserSession_Proc()
		MsgBox(48, 'Attention', $aUsers[$iActiveUser][1] & ',' & @CRLF & 'Your session has been expired.', 0, $hGUI)
	EndIf
EndFunc

Func _Exit()
	For $i = 1 To $aUsers[0][0]
		IniWrite($sConfig, $aUsers[$i][1], 'Timer', $aUsers[$i][2])
		IniWrite($sConfig, $aUsers[$i][1], 'Pass', _StringEncrypt(1, $aUsers[$i][3], $aUsers[$i][1]))
	Next
	
	FileSetAttrib($sConfig, '+RH')
	
	Exit
EndFunc
 

ynbIpb

Скриптер
Сообщения
399
Репутация
110
ну и как вариант: Aston Secure Desktop
Для детей
С помощью Aston Secure Desktop можно ограничить время, которое Ваш ребенок проводит за компьютером.

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

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Я считаю что ограничивать время ребёнка за компьютером - это неправильный подход.
Если ребёнок так уж хочет поиграть за компьютером, он будет искать варианты - к соседскому ребёнку бегать, в клуб ходить (тогда уже проблема дети-деньги возникает).
Нужно предложить ребёнку более интересное чем компьютер занятие.
Конечно, родителям удобно посадить на пару часиков ребёнка за компьютер и заняться своими делами.
А самому поиграть с ребёнком или сводить его куда, так это ж напрягаться надо.
Так что выбирай - или иллюзия заботливого родителя, ограничивающего время ребёнка за компьютером, или реально напрягайся и уделяй время ребёнку.
;D
 
Автор
StarEdik

StarEdik

Новичок
Сообщения
365
Репутация
4
C2H5OH
Тоже истину глаголите.Отношусь с уважением к мнениям других. Но надо ...
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
StarEdik
Тема решена?
 
Автор
StarEdik

StarEdik

Новичок
Сообщения
365
Репутация
4
CreatoR
Думаю пока нет.Я сейчас кое что стараюсь написать.Но ваш скрипт очень даже кстати.Попозже я свой вариант выложу и буду рад ,может кто нит советами и кое какими функциями поделится. Не отказался бы от коллективной (совместной) разработки.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
StarEdik [?]
Я сейчас кое что стараюсь написать
Здесь стол заказов (аля “Сделайте за меня”), а не развитие проектов.
Если заказ выполнен, прошу отметить тему решённой.
 
Верх