Posh-script voor Win 10 Family Safety met lokale account

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • mousio
  • Registratie: Augustus 2003
  • Laatst online: 26-09 14:26
Met het ingebouwde ouderlijk toezicht kon je op Windows 8 makkelijk voor lokale kind-accounts enkele tijdslimieten en andere beperkingen instellen.

→ Dit gaat over de tijdslimieten en het verlengen van de pc-tijd voor lokale accounts onder Windows 10.

Na overschakeling naar Windows 10 zal je immers merken dat dit ouderlijk toezicht niet meer mogelijk is voor lokale accounts maar dat alles online beheerd wordt en er dus ook online accounts nodig zijn voor de kinderen. Tevens is het niet eenvoudig meer om eenmalig bv. de pc-tijd te verlengen om een huiswerkopdracht af te maken ofzo.

Dat ik niet de enige ben die hierover maalt, moge duidelijk zijn…



Ik heb een tijdje gezocht naar alternatieven maar vond voorlopig niks bevredigends, en ben zelf aan de slag gegaan, met PowerShell.

Onderstaand script werkt vooralsnog goed genoeg bij mijn kinderen, en ik kan vrij makkelijk hun pc-tijd verlengen – doch doe het niet al te vaak ;)

Allicht is er ruimte voor verbetering (details of conceptueel), net daarom wil ik jullie kritische ogen er over laten gaan.
 

Werking:

Dit script (Family Safety.ps1) kijkt of de computer actief gebruikt wordt (actieve console en niet vergrendeld).
Indien zo, dan wordt gekeken of begintijd, eindtijd en gebruikstijd gerespecteerd worden volgens de configuratie in het script.
Indien zo, dan wordt pc- en netwerktoegang toegestaan en wordt een timestamp gelogd (Family Safety.log).
In het andere geval wordt er gekeken of de pc-tijd verlengd mag worden (timestamp in Family Safety.txt) en krijgt het kind eventueel alsnog toegang.

Controle op begintijd en eindtijd is niet zo moeilijk, controle op gebruikstijd is daarentegen niet triviaal. Deze eenvoudige implementatie doet deze controle met het aantal timestamps dat gelogd wordt per dag.
Het uur veranderen kan mijns inziens niet veel opleveren, datum veranderen is vooralsnog een zwak punt maar daar houden mijn kinderen zich momenteel niet mee bezig (weet op moment van schrijven ook niet of ze dat kunnen qua rechten).

Ik heb er voor gekozen om netwerktoegang te laten samengaan met de actieve pc-tijd: wanneer het systeem vergrendeld wordt, is er geen netwerktoegang en worden geen timestamps gelogd.
Vergrendeling is trouwens de gebruikte methode om het kind de pc-toegang te ontzeggen. Het kind raakt geen gegevens kwijt (en kent sluimerstand) en kan makkelijk terug aanmelden wanneer het weer mag.

Is de actieve gebruiker toevallig admin, dan krijgt die onvoorwaardelijke toegang 8)
Deze admin hoort dit script als geplande taak toe te voegen, uit te voeren om de zoveel minuten (overeenkomstig met de waarde voor $recurrence in het script) en bv. ook bij het vergrendelen of ontgrendelen van het systeem. Hou de locatie van de ps1/log/txt ook enkel toegankelijk voor de admin 8)7
 

Verlenging:

Voor verlenging van de pc-tijd volstaat het een expliciete eindtijd als timestamp te zetten in Family Safety.txt.

Dat kan op allerlei manieren, van op afstand of gewoon lokaal, desnoods via een eenvoudige snelkoppeling met een commando als dit:
powershell -command "& {(get-date).addminutes(20).tostring('s') >'…absoluut pad…\family safety.txt'}"
Et voilà, het kind kan weer aanmelden :*)
PS: Indien je dit van op afstand wilt doen (rdp/teamviewer/psremoting/…), eerst de nodige firewall-regels voorzien want netwerktoegang is dan (by design) dus geblokkeerd.
 

PowerShell: Family Safety.ps1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# configuration
$allow       = $false
$allowbegin  = '12:30'
$allowend    = '19:30'
$allowedtime = '03:00'
$recurrence  = 1    # in minutes, see trigger schedule

# set some variables
$scriptfullpath = (gci $script:MyInvocation.MyCommand.Path).FullName
$computerlocked = (get-process |? { $_.processname -eq 'logonui' -and $_.path -eq $null }).count -gt 0
$currenttime    = (get-date).ToString('HH:mm')
$timestamp      =  get-date -format s

# get currently active user
$activeuser   = $null
$currentusers = quser #query user
$useractive   = (''+($currentusers | select-string 'console.*Active')) -match '(?<=^.)\b\w+\b' #use match on single string
if ($useractive)
{ $activeuser = $matches[0] }

# check allowed user
if ($activeuser -eq 'admin')
{ $allow = $true }
elseif ($useractive -and -not $computerlocked)
{
    # check allowed time window
    $allowednow = [string]::Compare($allowbegin, $currenttime) -le 0 -and [string]::Compare($currenttime, $allowend) -lt 0
    if ($allowednow)
    {
        # check allowed time usage
        $logpath = [io.path]::ChangeExtension($scriptfullpath, 'log')
        $content = @(gc $logpath) 2>$null
        if ($content.count -gt 0 -and $content[0].substring(0,10) -ne $timestamp.substring(0,10))
        {   # not today's log, delete
            del $logpath
            $content = @()
        }
        $allowedtimeparts = $allowedtime.split(':')
        $allowedtimeslots = ([int]$allowedtimeparts[0] * 60 + [int]$allowedtimeparts[1]) / $recurrence
        if ($content.count -lt $allowedtimeslots)
        {   # allow for now, log
            $allow = $true
            $timestamp >> $logpath
        }
    }

    if (-not $allow)
    {
        # check allowed time extension, e.g. (get-date).addminutes(20).tostring('s') >...
        $txtpath = [io.path]::ChangeExtension($scriptfullpath, 'txt')
        $content = gc -raw $txtpath 2>$null
        if ($content -and [string]::Compare($timestamp, $content.Trim()) -lt 0)
        { $allow = $true }
    }
}

# block or allow outbound traffic and computer use
if ($allow)
{ $state = 'allow' }
else
{
    $state = 'block'
    # lock computer :]
    #& "$env:windir\System32\rundll32.exe" user32.dll,LockWorkStation
    tsdiscon console
}
netsh advfirewall set allprofiles firewallpolicy blockinbound,${state}outbound


Update: Dit werkt bij mij zonder probleem op de Pro-uitvoeringen. Voor de Home-uitvoeringen kan gewerkt worden met de Terminal Services PowerShell Module om de actieve sessies te bepalen en eventueel te locken (i.p.v. quser resp. tsdiscon).

[ Voor 2% gewijzigd door mousio op 15-11-2015 21:38 . Reden: PSTerminalServices ]