Avvertimento:sebbene nel corso della nostra programmazione useremo anche caratteristiche di VB6 molto del codice potrà girare anche su VB4.0 o VB5.0
Tutto il codice scritto in questo contesto è stato attentamente verificato
Molti di noi già sanno cosa è una Shell, per gli altri la cosa viene qui riassunta brevemente:
la shell ( in inglese vuol dire conchiglia ) è l'interfaccia tra l'utente e l'OS
Windows ci fornisce già il classico Desktop con le sue icone e il Menu Avvio e la TaskBar
Spesso però questa Shell diviene insufficiente, e allora nascono le estensioni e le sostituzioni ( tanto note all'epoca di Windows 3.x e di Program Manager ), però questi programmi costano tempo e anche tanta fatica ai programmatori e quindi non sono certo gratuite, pertanto, perchè non improvvisarci programmatori di uno di questi strumenti?
Come al solito nelle nostre serie precedenti il linguaggio sarà VB, ma stavolta non più versione 4.0, bensì 6.0
Se qualcuno volesse obiettare che VB non è abbastanza serio per convincersi del contrario basta che legga fino alla fine tutta questa serie
Iniziamo dall'inizio: istruiamo Windows affinchè usi la nuova shell, che chiameremo PShell ( Perfect Shell ) e il cui eseguibile sarà C:\WINDOWS\PShell.exe
Aprite un Prompt di MS-DOS e digitate questo:
C:\WINDOWS>edit System.ini
Vi apparirà nell'Editor di MS-DOS il file di inizializzazione di Windows, il quale tra le altre cose comprende una linea shell=, cancellate tutta quella linea ( di solito shell=Explorer.exe ) e scrivete:
shell=C:\Windows\PShell.exe
Salvate con File->Salva e poi File->Esci
E' fatta, adesso possiamo scrivere tutto il codice che ci serve, compilare e riavviare
Abbiamo qui davanti a noi la prima scelta, vogliamo o meno un briciolo di sicurezza all'avvio di PShell?
La scelta più ovvia è SI, pertanto parliamo di Sistemi di Login
Un sistema di Login permette di avviare la verifica di una coppia di valori(username/password) sulla base di una serie di valori ( contenuti nel file (o nei file) di login )
Come si capisce la finestra di Login sarà la prima a comparire e una volta confermate le scelte dell'utente essa darà inizio alla fase di logon
Un primo spartano esempio di codice è:
Dim CurUsr As User
Private Sub Command1_Click()
If Dir(App.Path & "\sec\" & Text1 & "\sys") = "" Then
Alarm
Else
Dim Buf$
Dim P$
Open App.Path & "\sec\" & Text1 & "\sys" For Input As 35
Do Until EOF(35)
Line Input #35, Buf$
If Mid(Buf$, 1, 7) = "PASSWD=" Then
P$ = Mid(Buf$, 8, Len(Buf$) - 1)
If Text2 = P$ Then
Close
CurUsr.Name = Text1
With USR
.Name = CurUsr.Name
.Password = Text2
.CanShutdown = CurUsr.CanShutdown
.CanRun = CurUsr.CanRun
.CanTimer = CurUsr.CanTimer
.CanEMail = CurUsr.CanEMail
.CanUsers = CurUsr.CanUsers
.CanTrash = CurUsr.CanTrash
.CanMyStuff = CurUsr.CanMyStuff
.CanShortcuts = CurUsr.CanShortcuts
.CanSysMenu = CurUsr.CanSysMenu
End With
Me.Hide
Desktop.Show
Unload Me
Exit Sub
Else
Alarm
End If
ElseIf Mid(Buf$, 1, 5) = "SHUT=" Then
CurUsr.CanShutdown = Mid(Buf$, 6)
ElseIf Mid(Buf$, 1, 4) = "RUN=" Then
CurUsr.CanRun = Mid(Buf$, 5)
ElseIf Mid(Buf$, 1, 7) = "TIMNOT=" Then
CurUsr.CanTimer = Mid(Buf$, 8)
ElseIf Mid(Buf$, 1, 6) = "EMAIL=" Then
CurUsr.CanEMail = Mid(Buf$, 7)
ElseIf Mid(Buf$, 1, 5) = "USRS=" Then
CurUsr.CanUsers = Mid(Buf$, 6)
ElseIf Mid(Buf$, 1, 6) = "TRASH=" Then
CurUsr.CanTrash = Mid(Buf$, 7)
ElseIf Mid(Buf$, 1, 8) = "MYSTUFF=" Then
CurUsr.CanMyStuff = Mid(Buf$, 9)
ElseIf Mid(Buf$, 1, 10) = "SHORTCUTS=" Then
CurUsr.CanShortcuts = Mid(Buf$, 11)
ElseIf Mid(Buf$, 1, 7) = "SYSMNU=" Then
CurUsr.CanSysMenu = Mid(Buf$, 8)
End If
Loop
End If
End Sub
User è una classe che contiene proprietà CanNomeProprietà le quali indicano i permessi concessi o negati all'utente
Un permesso è una operazione negata o concessa ( se andate a scuola la proprietà booleana CanDireQualcosaACesare potrà essere impostata a True ( si ) o False ( no ) dall'insegnante, in quel caso si scatena l'impostazione di una proprietà del tipo LaProfessoressaECattiva a True ( si ), ma questo è un altro problema che esula da VB6.0 )
Alarm non si trova in questo codice, ma essa serve per disattivare ogni componente della shell e bloccare il Computer poichè mancano le impostazioni di sicurezza
1: If Dir(App.Path & "\sec\" & Text1 & "\sys") = "" Then
2: Alarm
3: Else
4: Dim Buf$
5: Dim P$
6: Open App.Path & "\sec\" & Text1 & "\sys" For Input As 35
1: Se manca una directory di sicurezza ( con il file "sys" che contiene le impostazioni valide ) per l'utente il cui nome è stato inserito in Text1 questo è quasi sicuramente un tentativo di violazione del sistema
4: Crea una variabile Buffer, per contenere i dati in ingresso dallo Stream di Input ( vedi linea 6 )
5: Crea una variabile specifica per contenere la Password dell'utente
6: Apre le impostazioni utente con handle di file 35
Tutto il rimanente codice cerca delle stringhe ( come in un file INI ) seguite da un = e scarica ( per così dire ) il valore String dopo conversione implicita in uno dei permessi di CurUsr
Visto che l'ultima impostazione salvata dal "Pannello di Controllo" della Shell sarà PASSWD=xyz alla lettura di questa linea termina il login, se la password è valida copia in un buffer di nome USR le impostazioni e poi lascia il controllo al Desktop, altrimenti lancia Alarm()
Come si nota la password della Shell non era criptata, ma poteva esserlo usando una routine Cript() e una Uncript(), eccone qui un esempio
Questo esempio per ogni Cript(S$) ritorna una Stringa S1$ e per ogni Uncript(S1$) ritorna S$
Public Function Uncript$(Src$)
Dim Cnt%
Cnt% = 1
Dim Bchar$
Dim Achar$
Do Until Cnt% > Len(Src$)
Bchar$ = Mid(Src$, Cnt%, 1)
Cnt% = Cnt% + 1
Achar$ = Chr(Asc(Bchar$) + 5)
Uncript$ = Uncript$ + Achar$
Loop
End Function
Public Function Cript$(Src$)
Dim Cnt%
Cnt% = 1
Dim Bchar$
Dim Achar$
Do Until Cnt% > Len(Src$)
Bchar$ = Mid(Src$, Cnt%, 1)
Cnt% = Cnt% + 1
Achar$ = Chr(Asc(Bchar$) - 5)
Cript$ = Cript$ + Achar$
Loop
End Function
Le due funzioni in oggetto sono semplicissime e a meno di grandi necessita di sicurezza si adattano bene a molte situazioni comuni, per estenderle ricordate che:
· Ogni operazione in Cript() deve trovare il suo opposto in Uncript()
· Le operazioni di divisione sono sconsigliate in Cript() perchè spesso non ritornano un intero
· L'opposto di + è -, l'opposto di * è /
· L'opposto di ogni elevamento a n potenza è la n radice
Questo primo articolo sulle Shell in VB6.0 è finito
Abbiamo trattato alcuni rudimenti sull'argomento shells e scritto del primo codice, la prossima volta parleremo di Desktop e di Impostazioni del Sistema