Precedente :: Successivo |
Autore |
Messaggio |
uffa14 Eroe

Registrato: 27/09/07 11:53 Messaggi: 47 Residenza: Rimini
|
Inviato: 02 Set 2008 17:41 Oggetto: * Accesso temporizzato |
|
|
Ciao,
Sto cercando di fare in modo che quando i miei figli usano il computer non possano farlo per più di un'ora. Per evitare discussioni, ho creato un batch che schedula lo spegnimento all'ora che desidero (il mio profilo è admin, il loro no!).
Sto cercando di automatizzare la cosa, ho creato uno script in avvio automatico che, dopo avere verificato il profilo, lancia lo shutdown a 3600 secondi (un'ora!).
Il primo problema era lanciare il "runas" l'ho risolto con un programmino "sanur" che consente di inserire la password nel batch (è in chiaro ma pazienza).
La cosa ha funzionato bene nelle prove.
chido il mio account, accedo con quello del figlio e parte lo shutdown.
però se appena accendo il pc entro con l'utente dei bambini lo script rimane congelato....
Qualcuno capisce perchè?
ecco lo scritp:
===========go.bat================
@echo off
cls
RunAs /utente:dominio\utente /env c:\apri.bat | sanur password
==================================
==============apri.bat============
@echo off
: genero la stringa nome+data
set nome=%username%%date:~6,4%%date:~3,2%%date:~0,2%
:verifico che non sia il mo utente
if %username% == utenteadmin goto fine
:se non esite il file nome+data salto, altrimenti chiudo subito
if not exist %nome% goto dopo
shutdown -s -f -t 180 -c "hai giocato abbastanza"
"C:\Programmi\Internet Explorer\iexplore.exe" c:\abbastanza.html
goto fine
:genero il file nome+data e attivo lo shutdown
:dopo
echo %nome% > c:\%nome%
shutdown -s -f -t 3600 -c "hai un'ora di tempo!!"
"C:\Programmi\Internet Explorer\iexplore.exe" c:\unora.html
:fine
:chiudi
====================================== |
|
Top |
|
 |
chemicalbit Dio maturo


Registrato: 01/04/05 18:59 Messaggi: 18597 Residenza: Milano
|
Inviato: 02 Set 2008 19:24 Oggetto: |
|
|
Proviamo a vedere in quale dei due file è il problema:
sposta apri.bat in apri2.bat
E crea un apri.bat con scritto solo
uffa14 ha scritto: | La cosa ha funzionato bene nelle prove.
chido il mio account, accedo con quello del figlio e parte lo shutdown. | Ma le prove come hai fatto a farle?
sanur come funziona?
Vedo che hai fatto un pipe in cui passi l'output di runas come input di sanur |
|
Top |
|
 |
uffa14 Eroe

Registrato: 27/09/07 11:53 Messaggi: 47 Residenza: Rimini
|
Inviato: 03 Set 2008 08:16 Oggetto: |
|
|
chemicalbit ha scritto: |
E crea un apri.bat con scritto solo
|
Buona idea, ho anche messo un pause sia nel go.bat che in apri.bat.
Poi non ho potuto continuare
chemicalbit ha scritto: |
uffa14 ha scritto: | La cosa ha funzionato bene nelle prove.
chido il mio account, accedo con quello del figlio e parte lo shutdown. | Ma le prove come hai fatto a farle?
|
Lanciando go.bat dal profilo amministrativo: ok,
entrando nel profilo user e lanciando go.bat manualmente: ok,
inserendo go bat in avvioautomatico e loggandomu nel profilo user:ok
riavviando il pc ed entrando sul profilo user: si è bloccato!
chemicalbit ha scritto: |
sanur come funziona?
Vedo che hai fatto un pipe in cui passi l'output di runas come input di sanur |
L'ho trovato con una googolata, serve appunto a rendere *scriptabile" il runas.
Ora sono al lavoro, spero di poter fare dei test stasera. |
|
Top |
|
 |
grifone1900 Dio maturo


Registrato: 21/05/08 14:50 Messaggi: 1397 Residenza: roma
|
Inviato: 03 Set 2008 10:18 Oggetto: |
|
|
è molto probabile che sia un problema di autorizzazioni da lo stesso problema degli aggiornamenti di windows che con admin funge senza no controlla che nelle proprietà del file bat sia impostato everyone |
|
Top |
|
 |
uffa14 Eroe

Registrato: 27/09/07 11:53 Messaggi: 47 Residenza: Rimini
|
Inviato: 03 Set 2008 18:42 Oggetto: adesso funziona!! |
|
|
ho rifatto le prove con calma, e lo script parte correttamente anche accedendo con l'utente non admin all'accensione.
L'unica cosa è che ovviamente la finestra del dos non si può nascondere, e credo basta che venga chiusa per bloccare la procedura
La mia idea in origine era quella di lanciarlo dal regedit, (windows/currentversion/run) ma non sono sicuro che in quel momento il sistema sappia chi si sta loggando!!
Un'altra idea era quella di un eseguibile (magari vb) avviato come servizio che verifica chi è loggato e lo butta fuori al momento giusto... |
|
Top |
|
 |
grifone1900 Dio maturo


Registrato: 21/05/08 14:50 Messaggi: 1397 Residenza: roma
|
Inviato: 03 Set 2008 22:27 Oggetto: |
|
|
scusa ma se sul file bat creato dai autorizzazioni amministrative?? come regola non possono chiuderlo... |
|
Top |
|
 |
GrayWolf Dio maturo


Registrato: 03/07/05 17:24 Messaggi: 2325 Residenza: ... come frontiera i confini del mondo...
|
Inviato: 05 Set 2008 02:38 Oggetto: Re: Accesso temporizzato |
|
|
uffa14 ha scritto: | Ciao,
Sto cercando di fare in modo che quando i miei figli usano il computer non possano farlo per più di un'ora. |
complimenti, ottima scelta
uffa14 ha scritto: |
chiudo il mio account, accedo con quello del figlio e parte lo shutdown.
però se appena accendo il pc entro con l'utente dei bambini lo script rimane congelato....
Qualcuno capisce perchè?
|
probabilmente perché è in esecuzione solo nel tuo registro.
[nelle opzioni avanzate delle proprietà del file occorre concedere l'accesso, almeno in lettura, a Everyone]
Comunque:
ho scritto una procedura e le istruzioni per la sua applicazione che dovrebbe risolverti il problema.
Codice: |
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html Lang= "it">
<head>
<title>
Controllo Permanenza a PC
</title>
<HTA:APPLICATION
Id="HTACtrl"
SysMenu="no"
Showintaskbar="no"
>
<script type="text/vbscript" language="VBScript">
option explicit
' * ============================================================================
' * INTERVENTI di PERSONALIZZAZIONE
' * ----------------------------------------------------------------------------
' *
' * ------------------------------------------------------------
' * Personalizza mappa esposta
' * ------------------------------------------------------------
ILarghezza = 800
iAltezza = 220
iLeft = 0
iTop = 0
' * ------------------------------------------------------------
' * ------------------------------------------------------------
' * Personalizza Messaggi
' * ------------------------------------------------------------
sMessaggioIniziale = "<br><center><font size='24'>" _
& "Attenzione:<br>Hai tempo UN'ORA per giocare" _
& "</font></center>"
sMessaggioFinale = "<br><br><center><font size='28'>" _
& "Hai giocato abbastanza" _
& "</font></center>"
sTestoAlternativoAltriUtenti = "<br><center><font size='24'>" _
& "Buon Lavoro"
' * ------------------------------------------------------------
' * ------------------------------------------------------------
' * Personalizza Tempi
' * ------------------------------------------------------------
'* i valori devono essere espressi in millesimi di secondo
lTempoPermanenzaMappaIniziale = 3000
lTempoPermanenzaTotale = 5000
lTempoPermanenzaMappaFinale = 2000
'* i valori devono essere espressi in secondi
lTempoDiShutdown = 10
' * ------------------------------------------------------------
' * ============================================================================
dim oShell
Dim oNetwork
dim sUserDaControllare
dim sUserRilevato
dim sMessaggioIniziale
dim sMessaggioFinale
dim sTestoAlternativoAltriUtenti
dim sCmdShut
dim sTmp
dim avArgs
dim iLeft
dim iTop
dim iLarghezza
dim iAltezza
dim iLeftRil
dim iTopRil
dim idTimer1
dim idTimer2
dim idTimer3
dim lTempoPermanenzaMappaIniziale
dim lTempoPermanenzaTotale
dim lTempoPermanenzaMappaFinale
dim lTempoDiShutdown
set oShell = createobject("WScript.Shell")
avArgs = htaCmdLineToArray (HTACtrl.commandline)
Set oNetwork = CreateObject("WScript.Network")
sUserRilevato = oNetwork.UserName
sub Window_OnLoad
window.resizeTo iLarghezza,iAltezza
window.moveTo iLeft,iTop
sTmp = "<b>Oggi:" _
& FormatDateTime(now,1) _
& " sono le:" _
& FormatDateTime(now,3) _
& "</b><br>"
If ubound(avArgs) = 0 Then
sUserDaControllare = ""
else
sUserDaControllare = avArgs(1)
end if
if not trim(ucase(sUserRilevato)) = trim(ucase(sUserDaControllare)) then
document.body.innerHTML = sTmp _
& sTestoAlternativoAltriUtenti _
& sUserRilevato _
& "</font></center>"
idTimer1 = window.setTimeout("StopMe", _
lTempoPermanenzaMappaIniziale, _
"VBScript" _
)
else
document.body.innerHTML = sTmp & sMessaggioIniziale
idTimer1 = window.setTimeout("HideWindow", _
lTempoPermanenzaMappaIniziale, _
"VBScript" _
)
end if
end sub
sub StopWorkVBS
window.clearTimeout(idTimer3)
' * ============================================================================
' * INTERVENTI di PERSONALIZZAZIONE
' * ----------------------------------------------------------------------------
' * Per effettuare le prove di visualizzazione e non dover riaccendere il siste-
' * ma ogni volta, porre un apice semplice all'inizio delle due righe sotto-
' * stanti; quando la visualizzazione è soddisfacente, togliendo i due apici
' * posti a inizio riga il sistema si spegnerà nei tempi previsti.
' * -----------------------------------------------------------------------------
' sCmdShut ="shutdown -s -f -t " & lTempoDiShutdown
' oShell.run sCmdShut,,true
' * ============================================================================
window.close
end sub
Sub HideWindow
iLeftRil = window.screenLeft
iTopRil = window.screenTop
window.moveTo -2000,-2000
window.clearTimeout(idTimer1)
idTimer2 = window.setTimeout("ShowWindow", _
lTempoPermanenzaTotale, _
"VBScript" _
)
End Sub
Sub ShowWindow
window.moveTo iLeftRil,iTopRil
window.clearTimeout(idTimer2)
sTmp = "<b>Oggi:" _
& FormatDateTime(now,1) _
& "</b><br>"
document.body.innerHTML = sTmp & sMessaggioFinale
idTimer3 = window.setTimeout("StopWorkVBS", _
lTempoPermanenzaMappaFinale, _
"VBScript" _
)
End Sub
sub StopMe
window.clearTimeout(idTimer1)
window.close
end sub
Function htaCmdLineToArray (strCmdLine)
dim re
dim args()
dim matches
dim su
dim i
set re = New RegExp
re.pattern = "((?!""([^""]+)"")\b(\S+)\b|""([^""]+)"")"
re.global = true
set matches = re.execute(strCmdLine)
Redim args(matches.count -1)
for i=0 to matches.count - 1
set su = matches(i).submatches
args(i) = su(2) & su(3)
next
htaCmdLineToArray = args
End Function
</script>
</head>
<body>
</body>
</html>
|
copia e incolla il codice proposto nel blocco note.
salvalo in una cartella di tua scelta, con il nome che vuoi e con estensione .hta, poi segui le istruzioni sottostanti.
GrayWolf, per spiegare, ha scritto: |
Cos'è
Gli script con estensione hta usufruiscono della potenza dell'html
hta infatti sta per HTml for Application.
Costituisce l'interfaccia off-line per i linguaggi di scripting come VBScript e Javascript.
Come funziona
Il programma fa apparire una mappa con un messaggio iniziale, dopo il login.
La mappa permane per il tempo indicato nelle personalizzazioni.
Se l'utente indicato come parametro associato al programma, è lo stesso che ha
effettuato l'accesso, la mappa "sparisce" per riapparire allo scadere del periodo
[sempre indicato nelle personalizzazioni].
Entrambe le mappe possono avere messaggi diversi come avviene nel codice esposto.
All'apparire della seconda mappa, è innescato lo shutdown del sistema che avverrà
in tempo ragionevole [personalizzabile] da permettere all'utente di salvare il lavoro.
ATTENZIONE: lo shutdown è irreversibile [non si può annullare] usare quindi dei
valori accettabili.
Se l'utente non è quello segnalato come "da controllare" [parametro nella riga di lancio]
appare solo la prima mappa con un messaggio augurale.
Come si personalizza
nella sezione personalizzazioni ogni parametro ha un nome significativo,
per i valori a stringa [messaggi] TUTTO il messaggio deve essere racchiuso fra
doppi apici, nella stringa quindi possono essere presenti, qualora fossero necessari, solo apici singoli.
Nelle stringhe di messaggio è possibile includere tag html.
I valori numerici devono essere espressi senza delimitatori.
Nel codice proposto, è presente una seconda sezione di personalizzazione:
la parte in cui è effettuato lo shutdown, si consiglia di lasciare le due righe
commentate finchè non si è soddisfatti del contenuto dei messaggi.
Per effettuare le prove, il codice proposto ha tempi molto "bassi" per agevolare
una ripetizione veloce fino al raggiungimento del risultato voluto.
Raggiunto l'obiettivo i tempi devono essere modificati:
lTempoDiPermanenzaTotale = 3600000 corrisponde a un'ora. [nell'esempio è di 5 secondi]
Come si richiama
Il codice proposto è un eseguibile a tutti gli effetti.
Il suo richiamo, quindi, può avvenire secondo le regole di Windows:
shortcut sul desktop o in esecuzione automatica o in una cartella del menu start.
La natura particolare del problema però impone:
.1 che non sia manipolabile dall'utente controllato [blocco, cancellazione]
.2 che sia eseguibile per tutti gli utenti
Per ottenere questi risultati la cosa più conveniente è di creare una chiave di registro:
aprire regedit
posizionarsi su HKEY-LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Curren Version\Run
in questa cartella creare un valore a stringa con un nome riconoscibile e che come contenuto
abbia il percorso completo del file con estensione hta seguito dal nome dell'utente che si vuole controllare.
esempio:
valore = ControlloTempo
contenuto = unità:\cartella_degli_script\CtrlTmp.hta ambarabacicicòcò
dove ambarabacicicòcò è l'username che si vuole controllare.
|
ooops mi sono accorto solo ora che hai parlato di figli [plurale].
La procedura [per ora] prevede il controllo su un solo utente.
Se la cosa ti funziona e lo credi necessario, vedrò di apportare le modifiche affinché si possano controllare più utenti.
Il codice proposto emette i messaggi che volevi:
"Hai un'ora per giocare"
e
"Hai giocato abbastanza"
PS per gli utenti di Windows 2000:
shutdown.exe non è incorporato nel sistema,
Occorre estrarlo dal ResurceKit o scaricarlo dalla rete [attenzione deve essere quello di 19K (19456 bytes)]
e salvarlo in C:\WINNT\System32.
edit by Graywolf
modificati alcuni refusi nel codice
ri-edit
se qualcuno avesse copiato il codice PRIMA delle 12.00 del 5.9.2008
può avere qualche problema; consiglio di ri-copiare il codice attuale [ultima versione funzionante con un utente]
|
|
Top |
|
 |
ioSOLOio Amministratore


Registrato: 12/09/03 19:01 Messaggi: 16342 Residenza: in un sacco di...acqua
|
Inviato: 05 Set 2008 14:30 Oggetto: |
|
|
ecco il solito Lupacchione ...
ottimizzato come sempre....  |
|
Top |
|
 |
uffa14 Eroe

Registrato: 27/09/07 11:53 Messaggi: 47 Residenza: Rimini
|
Inviato: 09 Set 2008 01:07 Oggetto: Re: Accesso temporizzato |
|
|
GrayWolf ha scritto: |
copia e incolla il codice proposto nel blocco note.
salvalo in una cartella di tua scelta, con il nome che vuoi e con estensione .hta, poi segui le istruzioni sottostanti.
Cos'è
Gli script con estensione hta usufruiscono della potenza dell'html
hta infatti sta per HTml for Application.
Costituisce l'interfaccia off-line per i linguaggi di scripting come VBScript e Javascript.
Come funziona
|
GrayWolf... che dire sei gentilissimo, non conoscevo hta ma partendo dal tuo script penso che inizierò subito a studiarlo!!
Il mio misero batch tra l'altro funzionava a singhiozzo,,, a volte tutto ok ma la maggior parte delle volte bloccato con il messaggio "unable to locate a runas process" mi viene il dubbio che lo script partisse prima che il servizio runas (sarà un servizio???) fosse attivo,
Ti farò sapere come funziona! |
|
Top |
|
 |
GrayWolf Dio maturo


Registrato: 03/07/05 17:24 Messaggi: 2325 Residenza: ... come frontiera i confini del mondo...
|
Inviato: 09 Set 2008 11:45 Oggetto: Re: Accesso temporizzato |
|
|
uffa14 ha scritto: |
GrayWolf... che dire sei gentilissimo, non conoscevo hta ma partendo dal tuo script penso che inizierò subito a studiarlo!! |
De nada hombre
tieni comunque presente il connubio HTML+VBScript/Javascript
uffa14 ha scritto: |
Il mio misero batch tra l'altro funzionava a singhiozzo,,, a volte tutto ok ma la maggior parte delle volte bloccato con il messaggio "unable to locate a runas process" mi viene il dubbio che lo script partisse prima che il servizio runas (sarà un servizio???) fosse attivo
|
runas è un eseguibile che trovi in windows_dir\system32
probabilmente i permessi utente negano l'accesso agli eseguibili in tale dir perchè:
Citazione: |
UTILIZZO RUNAS [estratto da W2K]:
RUNAS [/profile] [/env] [/netonly]/utente:<nome utente> applicazione
/profile se il profilo utente deve essere caricato
/env per utilizzare l'ambiente corrente invece di quello dell'utente.
/netonly se le credenziali specificate sono solo per accesso remoto.
/utente <nome utente> nella forma UTENTE@DOMINIO o DOMINIO\UTENTE
program riga di comando per EXE. Vedere sotto gli esempi
Esempi:
> runas /profile /utente:computerlocale\amministratore cmd
> runas /profile /env /utente:dominiolocale\admin "mmc %windir%\system32\dsa.msc"
> runas /env /utente:utente@dominio.microsoft.com "notepad \"my file.txt\""
NOTA: immettere la password utente solo su richiesta.
NOTA: UTENTE@DOMINIO non è compatibile con /netonly. |
teoricamente potrebbe essere possibile lanciare, con runas, un eseguibile maligno o di installazione, non permesso a chi non è amministratore.
Se il richiamo lo metti [come da istruzioni] in HKLM... entra in funzione per TUTTI gli utenti e dopo il login [verificato su W2K, ma in XP dovrebbe comportarsi nello stesso modo]
uffa14 ha scritto: |
Ti farò sapere come funziona! |
Bien, yo atiendo  |
|
Top |
|
 |
danielegr Dio maturo


Registrato: 04/05/05 09:54 Messaggi: 2277 Residenza: 43 54 26,81N 7 56 25,35E Altitudine 184 m.
|
Inviato: 09 Set 2008 13:02 Oggetto: |
|
|
Scusate l'intervento da utonto totale: ma il ragazzino, dopo che gli è apparso il messaggio "hai giocato abbastanza" non potrebbe spegnere il PC, riaccenderlo e farsi un'altra oretta di gioco? |
|
Top |
|
 |
GrayWolf Dio maturo


Registrato: 03/07/05 17:24 Messaggi: 2325 Residenza: ... come frontiera i confini del mondo...
|
Inviato: 09 Set 2008 13:12 Oggetto: |
|
|
Bella lì danielegr!!
dovrò pensare a come controllare anche gli accessi per data
certo è che se vigesse la regola: "a letto dopo carosello" non ci sarebbe la necessità di tale controllo
poi... durante l'ora di gioco potrebbe essere possibile modificare la data del sistema e quindi poter giocare altre ore [ogni volta un giorno avanti e l'ultima alla data originale, ma così si sarebbe "fregato" per i giorni successivi, il problema non cambierebbe [con un lasso di tempo superiore] se cambiasse il mese o addirittura l'anno...
mumble, mumble... mi studierò qualcosa  |
|
Top |
|
 |
ioSOLOio Amministratore


Registrato: 12/09/03 19:01 Messaggi: 16342 Residenza: in un sacco di...acqua
|
Inviato: 10 Set 2008 20:55 Oggetto: |
|
|
GrayWolf ha scritto: |
poi... durante l'ora di gioco potrebbe essere possibile modificare la data del sistema |
eh no...un utente limitato col cavolo che va a toccarmi la data di sistema.
per il riavvio invece....te tocca pensà!! |
|
Top |
|
 |
uffa14 Eroe

Registrato: 27/09/07 11:53 Messaggi: 47 Residenza: Rimini
|
Inviato: 10 Set 2008 23:58 Oggetto: |
|
|
ioSOLOio ha scritto: | GrayWolf ha scritto: |
poi... durante l'ora di gioco potrebbe essere possibile modificare la data del sistema |
eh no...un utente limitato col cavolo che va a toccarmi la data di sistema.
per il riavvio invece....te tocca pensà!! |
Infatti ci ho pensato.. potrò mica pretendere di trovare i programmi pronti su misura!!
soluzione semplice, non troppo fine ma funzionale.
creo un textfile con il nome dell'utente, dentro ci metto la data di sistema, se quando gira lo script il file non c'è lo cre se la data non è quella odierna lo cancello e lo ricreo, se la data è quella odierna lo butto fuori!!
I Figli non possono modificare la data di sistema naturalmente
un'altra piccola modifica, visto che i figli sono due, lancio il programma con due parametri, e poi controllo utente1 e utente2 (poco fine vero? non ho avuto voglia di scandire l'array )
comunque ecco il codice che ho prodotto....
Codice: |
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html Lang= "it">
<head>
<title>
Controllo Permanenza a PC
</title>
<HTA:APPLICATION
Id="HTACtrl"
SysMenu="no"
Showintaskbar="no"
>
<script type="text/vbscript" language="VBScript">
option explicit
' * ============================================================================
' * INTERVENTI di PERSONALIZZAZIONE
' * ----------------------------------------------------------------------------
' * ------------------------------------------------------------
' * Personalizza mappa esposta
' * ------------------------------------------------------------
ILarghezza = 800
iAltezza = 220
iLeft = 0
iTop = 0
' * ------------------------------------------------------------
' * ------------------------------------------------------------
' * Personalizza Messaggi
' * ------------------------------------------------------------
sTagMsg1 = "<br><center><font size='24'>"
sTagMsg2 = "</font></center>"
sMsgIniz = "Attenzione:<br>Hai tempo UN'ORA per giocare"
sMsgFine = "Hai giocato abbastanza"
sMsgBabbo = "Buon Lavoro!! "
' * ------------------------------------------------------------
' * ------------------------------------------------------------
' * Personalizza Tempi
' * ------------------------------------------------------------
'* i valori devono essere espressi in millesimi di secondo
lTempoPermanenzaMappaIniziale = 3000
lTempoPermanenzaTotale = 120000
lTempoPermanenzaMappaFinale = 3000
'* i valori devono essere espressi in secondi
lTempoDiShutdown = 10
' * carico oggi con la data di sistema
sOggi = FormatDateTime(now,2)
'' msgbox("oggi:" & sOggi)
' * ------------------------------------------------------------
' * ============================================================================
dim oShell
Dim oNetwork
dim sUserDaControllare
dim sUserDaControllare1
dim sUserDaControllare2
dim sUserRilevato
dim sMsgIniz
dim sMsgFine
dim sMsgBabbo
dim sTagMsg1
dim sTagMsg2
dim sCmdShut
dim sTmp
dim avArgs
dim iLeft
dim iTop
dim iLarghezza
dim iAltezza
dim iLeftRil
dim iTopRil
dim idTimer1
dim idTimer2
dim idTimer3
dim lTempoPermanenzaMappaIniziale
dim lTempoPermanenzaTotale
dim lTempoPermanenzaMappaFinale
dim lTempoDiShutdown
dim sOggi
set oShell = createobject("WScript.Shell")
'mio salvo i parametri in array'
avArgs = htaCmdLineToArray (HTACtrl.commandline)
'mio rilevo utente'
Set oNetwork = CreateObject("WScript.Network")
sUserRilevato = oNetwork.UserName
'mio al caricamento della pagina'
sub Window_OnLoad
'mio dimensinono la finestra'
window.resizeTo iLarghezza,iAltezza
window.moveTo iLeft,iTop
'mio salvo data e ora'
sTmp = "<b>Oggi:" _
& FormatDateTime(now,1) _
& " sono le:" _
& FormatDateTime(now,3) _
& "</b><br>"
'mio verifico i parametri'
If ubound(avArgs) = 0 Then
sUserDaControllare1 = ""
sUserDaControllare2 = ""
else
sUserDaControllare1 = avArgs(1)
sUserDaControllare2 = avArgs(2)
end if
' msgbox(sUserDaControllare)
'mio se utente rilevato NON corrisponde ad un parametro auguro buon lavoro e termino'
if not trim(ucase(sUserRilevato)) = trim(ucase(sUserDaControllare1)) and not trim(ucase(sUserRilevato)) = trim(ucase(sUserDaControllare2)) then
' msgbox(trim(ucase(sUserRilevato)) + " " + sUserDaControllare)
document.body.innerHTML = sTmp _
& sMsgBabbo _
& " " & sUserRilevato _
& "</font></center>"
idTimer1 = window.setTimeout("StopMe", _
lTempoPermanenzaMappaIniziale, _
"VBScript" _
)
else
'mio se è utente da controllare gli dico hai unora'
'mio QUI INSERIRE CODICE'
' se esiste già il file dell'utente verifico se è di oggi.
' altrimenti lo creo
' msgbox("sUserRilevato:" & sUserRilevato)
if ChkUserFile(sUserRilevato) then
' msgbox("esiste gia il file dell'utente")
if chkOggi(sUserRilevato) then
'se nel file dell'utente ho la data di sOggi, TempoPermanenzaTotale diventa 3 minuti
sMsgIniz = "Hai già avuto la tua ora di computer!!"
lTempoPermanenzaTotale = 3000
else
CancUserFile(sUserRilevato)
CreaUserFile(sUserRilevato)
end if
else
' msgbox("non esiste il file dell'utente.. lo creo")
CreaUserFile(sUserRilevato)
end if
document.body.innerHTML = sTmp & sTagMsg1 & sUserRilevato & " " & sMsgIniz & sTagMsg2
idTimer1 = window.setTimeout("HideWindow", _
lTempoPermanenzaMappaIniziale, _
"VBScript" _
)
end if
end sub
' * ============================================================================
' * StopWorkVBS
' * spegne il sistema
' * ----------------------------------------------------------------------------
sub StopWorkVBS
' msgbox("fine lavoro")
window.moveTo iLeftRil,iTopRil
document.body.innerHTML = "spengo"
window.clearTimeout(idTimer3)
' msgbox("hai visto spengo?")
' * ============================================================================
' * INTERVENTI di PERSONALIZZAZIONE
' * ----------------------------------------------------------------------------
' * Per effettuare le prove di visualizzazione e non dover riaccendere il siste-
' * ma ogni volta, porre un apice semplice all'inizio delle due righe sotto-
' * stanti; quando la visualizzazione è soddisfacente, togliendo i due apici
' * posti a inizio riga il sistema si spegnerà nei tempi previsti.
' * ----------------------------------------------------------------------------
' * utilizzo logoff al posto di shutdown perche i bimbi non sono admins!!
' * ----------------------------------------------------------------------------
'' sCmdShut ="shutdown -s -f -t " & lTempoDiShutdown
sCmdShut ="logoff"
oShell.run sCmdShut,,true
' * ============================================================================
window.close
end sub
' * ============================================================================
' * HdeWindow
' * nasconde la finestra e lancia showwindows dopo l'attesa totale
' * ----------------------------------------------------------------------------
Sub HideWindow
iLeftRil = window.screenLeft
iTopRil = window.screenTop
window.moveTo -2000,-2000
'window.moveTo +300, +400
window.clearTimeout(idTimer1)
idTimer2 = window.setTimeout("ShowWindow", _
lTempoPermanenzaTotale, _
"VBScript" _
)
End Sub
' * ============================================================================
' * ShowWindow
' * mstra la finestra e lancia StopWorkVBS che spegne il pc dopo l'attesa di mappafinale
' * ----------------------------------------------------------------------------
Sub ShowWindow
window.moveTo iLeftRil,iTopRil
window.clearTimeout(idTimer2)
sTmp = "<b>Oggi:" _
& FormatDateTime(now,1) _
& "</b><br>"
document.body.innerHTML = sTmp & sTagMsg1 & sUserRilevato & " " & sMsgFine & sTagMsg2
idTimer3 = window.setTimeout("StopWorkVBS", _
lTempoPermanenzaMappaFinale, _
"VBScript" _
)
End Sub
' * ============================================================================
' * StopMe
' * chiude il programma
' * ----------------------------------------------------------------------------
sub StopMe
window.clearTimeout(idTimer1)
window.close
end sub
' * ============================================================================
' * htaCmdLineToArray
' * spezza il parametro in ingresso in un array in base agli spazi
' * ----------------------------------------------------------------------------
Function htaCmdLineToArray (strCmdLine)
dim re
dim args()
dim matches
dim su
dim i
set re = New RegExp
re.pattern = "((?!""([^""]+)"")\b(\S+)\b|""([^""]+)"")"
re.global = true
set matches = re.execute(strCmdLine)
Redim args(matches.count -1)
for i=0 to matches.count - 1
set su = matches(i).submatches
args(i) = su(2) & su(3)
next
htaCmdLineToArray = args
End Function
' * ============================================================================
' * ChkUserFile
' * verifica se esiste già il file con la data
' * ----------------------------------------------------------------------------
Function ChkUserFile(sUtente)
' msgbox("sono in chkuserfile: " & sUtente)
dim fs
Set fs = CreateObject("Scripting.FileSystemObject")
dim sNomeFile
sNomeFile = sUtente & ".TXT"
ChkUserFile = fs.fileexists(sNomeFile)
end Function
' * ============================================================================
' * ChkOggi
' * Verifica se la data contenuta nel file è quella odierna
' * ----------------------------------------------------------------------------
Function ChkOggi(sUtente)
' msgbox("sono in chkoggi: " & sUtente)
dim fs
dim fso
dim sChr
dim sNomeFile
sNomeFile = sUtente & ".TXT"
Set fs = CreateObject("Scripting.FileSystemObject")
Set fso = fs.OpenTextFile(sNomeFile, 1)
Do Until fso.AtEndOfStream
sChr = sChr + fso.Read(1)
Loop
if cdate(sChr) = cdate(sOggi) then
chkoggi = true
else
chkoggi = false
end if
'' msgbox("ecco:" & sChr & " " & soggi & " >>>" & chkoggi)
end Function
' * ============================================================================
' * CreaUserFile
' * crea il file con la data
' * ----------------------------------------------------------------------------
Function CreaUserFile(sUtente)
' msgbox("sono in CREAusrefile: " & sUtente)
dim fs
dim fso
dim fsFile
dim sNomeFile
sNomeFile = sUtente & ".TXT"
Set fs = CreateObject("Scripting.FileSystemObject")
Set fso = fs.CreateTextFile(sNomeFile)
fso.Close
Const ForAppending = 8
Set fsFile = fs.OpenTextFile (sNomeFile, ForAppending, True)
fsFile.WriteLine(sOggi)
fsFile.Close
end Function
' * ============================================================================
' * CancUserFile
' * Cancella il file con la data prima di ricrearlo
' * ----------------------------------------------------------------------------
Function CancUserFile(sUtente)
dim fs
dim fsFile
dim sNomeFile
sNomeFile = sUtente & ".TXT"
Set fs = CreateObject("Scripting.FileSystemObject")
Set fsFile = fs.GetFile(sNomeFile)
fsFile.Delete
msgbox("cancello")
end Function
</script>
</head>
<body>
</body>
</html>
|
Dimenticavo, lo shutdown con l'utente limitato non mi funziona!!
ho brillantemente risolto utilizzando il LOGOFF, così se ho bisogno che il pc resti acceso, magari per un torrent lanciato con il mio utente non ho problemi!!
Poi vi farò sapere se i pupi gradiscono!!
Grazie |
|
Top |
|
 |
GrayWolf Dio maturo


Registrato: 03/07/05 17:24 Messaggi: 2325 Residenza: ... come frontiera i confini del mondo...
|
Inviato: 12 Set 2008 11:24 Oggetto: |
|
|
Ottima personalizzazione!
[copiata e incollata]
Magari i pupi non gradiscono, ma sicuramente penseranno alla "mano lunga" del babbo.
E' anche un'ottimo insegnamento per abituarli alle schifezze che si possono inavvertitamente scaricare  |
|
Top |
|
 |
uffa14 Eroe

Registrato: 27/09/07 11:53 Messaggi: 47 Residenza: Rimini
|
Inviato: 06 Nov 2008 20:01 Oggetto: |
|
|
GrayWolf ha scritto: | Ottima personalizzazione!
[copiata e incollata]
Magari i pupi non gradiscono, ma sicuramente penseranno alla "mano lunga" del babbo.
E' anche un'ottimo insegnamento per abituarli alle schifezze che si possono inavvertitamente scaricare  |
in effetti non hanno gradito, ma la quidicenne mi ha sgamato....
Non ho ben capito come (forse nemmeno lei) ma la finestra di avviso si blocca e non viene più buttata fuori!!
Allora ho pensato a chktime2:
ho fatto in vb timer.exe, legge un file di configurazione in cui c'è il comando da lanciare e il tempo di attesa.
il comando da lanciare è chktime2.hta e fa i suoi controlli e poi si chiude
e aspetta il prossimo giro.
il problema è che se metto timer.exe nel run del registro, quando fa il logoff viene segnalato come programma attivo da chiudere, e se l'utente "annulla" il logoff viene bloccato.
Ho provato a metterlo come servizio con srvany, ma quando lo avvio mi dice che il servizio si è avviato e si è interrotto. quindi non va bene
Qualche idea? |
|
Top |
|
 |
GrayWolf Dio maturo


Registrato: 03/07/05 17:24 Messaggi: 2325 Residenza: ... come frontiera i confini del mondo...
|
Inviato: 06 Nov 2008 20:42 Oggetto: |
|
|
uffa14 ha scritto: |
in effetti non hanno gradito, ma la quindicenne mi ha sgamato....
Non ho ben capito come (forse nemmeno lei) ma la finestra di avviso si blocca e non viene più buttata fuori!!
|
ah, i giovani d'oggi ...
ne pensi 100 e loro riescono a trovare la 101ma
Non so se ha accesso al task manager,
se l'avesse e avesse capito che il processo da far cessare è MSHTA.exe
prima che effettui il logoff o durante la sua ora di gioco ...
oppure
ha letto questi post
uffa14 ha scritto: |
...
Qualche idea? |
non ho capito però cosa intendi con "la finestra di avviso si blocca", comunque:
fammici pensà, ma non garantisco niente  |
|
Top |
|
 |
uffa14 Eroe

Registrato: 27/09/07 11:53 Messaggi: 47 Residenza: Rimini
|
Inviato: 06 Nov 2008 22:26 Oggetto: |
|
|
GrayWolf ha scritto: |
se l'avesse e avesse capito che il processo da far cessare è MSHTA.exe
prima che effettui il logoff o durante la sua ora di gioco ...
oppure
ha letto questi post
|
Non blocca mshta.exe, credo che esca dalla sessione sospendendo, quando rientra la finestra di chiusura è li, ma resta "congelata"
Citazione: |
non ho capito però cosa intendi con "la finestra di avviso si blocca", comunque:
fammici pensà, ma non garantisco niente  |
Come quando esci e cè un programma aperto, ti dice se vuoi chiudere il programma subito o attendere, ma c'e anche il pulsante annulla.
la |
|
Top |
|
 |
uffa14 Eroe

Registrato: 27/09/07 11:53 Messaggi: 47 Residenza: Rimini
|
Inviato: 08 Nov 2008 01:53 Oggetto: |
|
|
Ripensandoci mi sono detto, "se mi serve un crontab per windows, perche non cercarlo?" infatti l'ho trovato!
http://www.nncron.ru
Lancio chktime2.hta ogni 10 minuti, e il gioco è fatto!
ecco il codice:
Codice: |
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html Lang= "it">
<head>
<title>
Controllo Permanenza a PC
</title>
<HTA:APPLICATION
Id="HTACtrl"
SysMenu="no"
Showintaskbar="no"
>
<script type="text/vbscript" language="VBScript">
option explicit
' * ============================================================================
' * descrizione
' * questo programma serve per controllare l'uso del pc da parte degli
' * utenti.
' * viene lanciato ogni 10 minuti da nncron lite (http://www.nncron.ru)
' * flusso:
' * 1) leggere chktime.ini per parametri utente, tempo, file
' * file esiste?
' * no/si
' * | |il file è di oggi?
' * | no/si->3
' * | \cancella il file
' * | \crea il file->2
' * \ crea il file ->2
' * 2) scrivo la data nel 1* rcd, e il tempo concesso nel secondo
' * avvisa l'utente dei minuti a disposiozine
' * fine programma
' * 3) leggi il file fino all'ultimo record
' * sottrai 10 al valore trovato
' * scrivi nuovo record con il valore trovato
' * il valore scritto <= 0?
' * no/si-> 4
' * \fine programma
' * 4) esegui azione richiesta dal parametro
' * fine programma
' *
' *
' * ----------------------------------------------------------------------------
' * ------------------------------------------------------------
' * Personalizza mappa esposta
' * ------------------------------------------------------------
ILarghezza = 800
iAltezza = 220
iLeft = 0
iTop = 0
' * ------------------------------------------------------------
' * ------------------------------------------------------------
' * Personalizza Messaggi
' * ------------------------------------------------------------
' * ------------------------------------------------------------
' * ------------------------------------------------------------
' * Personalizza Tempi
' * ------------------------------------------------------------
'* i valori devono essere espressi in millesimi di secondo
lTempoMessaggio = 5000
' * carico oggi con la data di sistema
sOggi = FormatDateTime(now,2)
'' 'stop msgbox("oggi:" & sOggi)
' * ------------------------------------------------------------
' * ============================================================================
Const ForAppending = 8
dim oShell
Dim oNetwork
dim sUserRilevato
dim sCmdShut
dim sTmp
dim iLeft
dim iTop
dim iLarghezza
dim iAltezza
dim iLeftRil
dim iTopRil
dim idTimer1
dim lTempoMessaggio
dim arrParam
dim sOggi
dim sAzione
set oShell = createobject("WScript.Shell")
'mio rilevo utente'
Set oNetwork = CreateObject("WScript.Network")
sUserRilevato = oNetwork.UserName
ScriviLogFile sUserRilevato, "inizio---------------------------------------------------"
'****************************************************************************************************'
'****************************************************************************************************'
'******************* R O U T I N E S ****************************************************************'
'****************************************************************************************************'
'****************************************************************************************************'
sub Window_OnLoad
dim i
dim lTempo
dim lresto
dim sFilePers
arrParam = LeggiIni(sUserRilevato)
sAzione = arrParam(2)
lTempo = cint(arrParam(1))
sFilePers = arrParam(3)
' dimensiono la finestra'
window.resizeTo iLarghezza,iAltezza
window.moveTo iLeft,iTop
'mio salvo data e ora'
sTmp = "<b>Oggi:" _
& FormatDateTime(now,1) _
& " sono le:" _
& FormatDateTime(now,3) _
& "</b><br>"
'Se azione = 0 buon lavoro e chiudo
if sAzione = "0" then
ScriviLogFile sUserRilevato, "azione = 0"
document.body.innerHTML = sTmp _
& " " & sUserRilevato _
& " <br> Buon lavoro!!" _
& ": </font></center>"
idTimer1 = window.setTimeout("StopMe", _
lTempoMessaggio, _
"VBScript" _
)
else
' se non esiste il file personale lo creo con data e zero
if not ChkUserFile(sFilePers) then
CreaUserFile(sFilePers)
ScriviUserFile sFilePers, cstr(ltempo)
end if
' leggo la prima riga del file personale
' se la data è vecchia, elimino e ricreo il file
' con data e tempo
if not chkOggi(sFilePers) then
ScriviLogFile sUserRilevato, "ricreo user file"
CreaUserFile(sFilePers)
ScriviUserFile sFilePers, lTempo
' se la data è oggi
' leggo l'ultimo record per ottenere il tempo rimasto
' se il tempo è > 10 scrivo nuovo record
' altrimenti eseguo azione richiesta
else
lResto = cint(LeggiLast(sFilePers))
ScriviLogFile sUserRilevato, "questo e il resto" & cstr(lresto)
lResto = lResto - 10
if lResto > 0 then
ScriviLogFile sUserRilevato, "resto ancora valido"
ScriviUserFile sFilePers, cstr(lresto)
else
ScriviLogFile sUserRilevato, "resto azzerato!!!"
ScriviUserFile sFilePers, "0"
idTimer1 = window.setTimeout("Stop1", _
lTempoMessaggio, _
"VBScript" _
)
end if
end if
end if
' se ho ancora tempo lo segnalo
document.body.innerHTML = sTmp _
& " " & sUserRilevato _
& "<br>ti restano:" & cstr(lresto) & "minuti." _
& ": </font></center>"
idTimer1 = window.setTimeout("StopMe", _
lTempoMessaggio, _
"VBScript" _
)
end sub
' * ============================================================================
' * Stop1
' * chiama Stopworkvbs con il parametro azione (il set timeout non puo?)
' * ----------------------------------------------------------------------------
sub Stop1
StopWorkVBS(sAzione)
end sub
' * ============================================================================
' * StopWorkVBS
' * disconnette l'utente
' * ----------------------------------------------------------------------------
sub StopWorkVBS(sAzione)
window.moveTo iLeftRil,iTopRil
document.body.innerHTML = "spengo"
window.clearTimeout(idTimer1)
ScriviLogFile sUserRilevato, "chiudo"
if sAzione = "1" then
sCmdShut ="logoff"
oShell.run sCmdShut,,true
end if
window.close
end sub
' * ============================================================================
' * StopMe
' * chiude il programma
' * ----------------------------------------------------------------------------
sub StopMe
window.clearTimeout(idTimer1)
window.close
end sub
' * ============================================================================
' * ChkUserFile
' * verifica se esiste già il file personale dell'utente connesso
' * ----------------------------------------------------------------------------
Function ChkUserFile(sFile)
ScriviLogFile sUserRilevato, "sono in chkuserfile: " & sFile
dim fs
Set fs = CreateObject("Scripting.FileSystemObject")
dim sNomeFile
sNomeFile = ".\" & sFile
ChkUserFile = fs.fileexists(sNomeFile)
end Function
' * ============================================================================
' * ChkOggi
' * Verifica se la data contenuta nel file è quella odierna
' * ----------------------------------------------------------------------------
Function ChkOggi(sFile)
ScriviLogFile sUserRilevato, "sono in chkoggi: " & sFile
dim fs
dim fso
dim sLine
dim sNomeFile
sNomeFile = ".\" & sFile
Set fs = CreateObject("Scripting.FileSystemObject")
Set fso = fs.OpenTextFile(sNomeFile, 1)
sLine = fso.Readline
if cdate(sLine) = cdate(sOggi) then
chkoggi = true
else
chkoggi = false
end if
end Function
' * ============================================================================
' * LeggiLast
' * Legge il file personale e riporta i minuti rimanenti
' * quelli dell'ultima riga
' * ----------------------------------------------------------------------------
Function LeggiLast(sFile)
dim fs
dim fso
dim sLine
dim sNomeFile
sNomeFile = ".\" & sFile
Set fs = CreateObject("Scripting.FileSystemObject")
Set fso = fs.OpenTextFile(sNomeFile, 1)
Do Until fso.AtEndOfStream
sLine = fso.Readline
Loop
LeggiLast = sLine
end Function
' * ============================================================================
' * CreaUserFile
' * crea il file personale dell'utente e scrive nella prima riga la data
' * ----------------------------------------------------------------------------
Function CreaUserFile(sFile)
dim fs
dim fso
dim fsFile
dim sNomeFile
sNomeFile = ".\" & sFile
ScriviLogFile sUserRilevato, "crea userfile" & snomefile
Set fs = CreateObject("Scripting.FileSystemObject")
Set fso = fs.CreateTextFile(sNomeFile)
fso.Close
Set fsFile = fs.OpenTextFile (sNomeFile, ForAppending, True)
fsFile.WriteLine(sOggi)
fsFile.Close
end Function
' * ============================================================================
' * ScriviUserFile
' * Aggiunge una riga con il tempo rimasto
' * ----------------------------------------------------------------------------
Function ScriviUserFile(sFile, sTempo)
dim fs
dim fso
dim fsFile
dim sNomeFile
sNomeFile = ".\" & sFile
Const ForAppending = 8
Set fs = CreateObject("Scripting.FileSystemObject")
Set fsFile = fs.OpenTextFile (sNomeFile, ForAppending, True)
ScriviLogFile sUserRilevato, "scriviuserfile:" & soggi
fsFile.WriteLine(sTempo)
fsFile.Close
end Function
' * ============================================================================
' * CancUserFile
' * Cancella il file con la data prima di ricrearlo
' * ----------------------------------------------------------------------------
Function CancUserFile(sUtente)
dim fs
dim fsFile
dim sNomeFile
sNomeFile = "c:\script\" & sUtente & ".TXT"
Set fs = CreateObject("Scripting.FileSystemObject")
Set fsFile = fs.GetFile(sNomeFile)
fsFile.Delete
end Function
' * ============================================================================
' * ScriviLogFile
' * Scrivi una riga sul file di log
' * ----------------------------------------------------------------------------
Function ScriviLogFile(sUtente, sAzione)
dim fs
dim fso
dim fsFile
dim sNomeFile
dim sRiga
sNomeFile = "c:\script\chktime2.log"
Set fs = CreateObject("Scripting.FileSystemObject")
if fs.fileexists(sNomeFile) = false then
Set fso = fs.CreateTextFile(sNomeFile)
fso.Close
end if
Const ForAppending = 8
sRiga = "User: " & sUtente & _
" azione: " & sAzione & _
" data: " _
& FormatDateTime(now,1) _
& " ora: " _
& FormatDateTime(now,3) _
'& chr(13) '& chr(10)
Set fsFile = fs.OpenTextFile (sNomeFile, ForAppending, True)
fsFile.WriteLine(sRiga)
fsFile.Close
end Function
' * ============================================================================
' * LeggiIni
' * Legge il file dei parametri, e torna con un array di 4 elementi
' * 0 = utente
' * 1 = minuti
' * 2 = azione (0=nulla,1=logoff)
' * 3 = filepersonale
' * se non trova il file o l'utente usa il default
' * ----------------------------------------------------------------------------
Function LeggiIni(utente)
dim fs
dim fso
dim sLinea
dim sNomeFile
dim arrParametri
Set fs = CreateObject("Scripting.FileSystemObject")
sNomeFile = "c:\script\chktime2.ini"
if fs.fileexists(sNomeFile) = true then
Set fso = fs.OpenTextFile(sNomeFile, 1)
Do Until fso.AtEndOfStream
sLinea = ucase(fso.Readline)
if left(sLinea, 1) <> "#" then
arrParametri = Split(sLinea , ";")
if arrParametri(0) = ucase(utente) then
LeggiIni = arrParametri
Exit Function
end if
end if
Loop
end if
slinea = ucase(utente) & ";60;0;default.txt"
arrParametri = Split(sLinea , ";")
LeggiIni = arrParametri
end Function
</script>
</head>
<body>
</body>
</html>
|
in questo modo mshta.exe non resta in azione. c'è solo il cron che gira e verifica gli utenti!
Ciao! |
|
Top |
|
 |
LoJan Mortale adepto

Registrato: 14/12/08 19:42 Messaggi: 30
|
Inviato: 14 Dic 2008 19:54 Oggetto: Accesso temporizzato |
|
|
Scusate, ho letto la corrispondenza del forum perchè avevo i problemi di Uffa14, e sono completamente profano di programmazione.
Ho risolto in qualche modo combinando lo script di GrayWolf (due ore di tempo, aggiunto stinga di registro,...) con il comando di Windows che limita gli orari di accesso (net user username /time:L-D, 1pm-3pm). Ovviamente il figlio trova la scappatoia, cioè effettua un logout e poi login quando stanno per scadere le due ore, e quindi raddoppia la dose...
C'è qualche modo per limitare il numero dei login giornalieri di un utente?
Grazie e ciao a tutti |
|
Top |
|
 |
|
|
Non puoi inserire nuovi argomenti Non puoi rispondere a nessun argomento Non puoi modificare i tuoi messaggi Non puoi cancellare i tuoi messaggi Non puoi votare nei sondaggi
|
|