Archives For Ricerca e Sviluppo

Le Poste Italiane hanno da poco rinnovato il loro sito web introducendo quotidianamente piccoli ritocchi grafici per –evidentemente– meglio apparire agli occhi dei suoi clienti e non. Sotto al cofano tutto sommato ciò che serve al cliente resta identico, con la sola esclusione della vecchia PosteMail (gratuita vita natural durante per i clienti BancoPosta, BancoPosta Click e PostePay) che lascia spazio alla nuova “Postemailbox”, gratuita solo per i primi 36 mesi, una PEC nata dagli accordi ormai datati tra governo e questo tipo di istituzioni nel campo dei servizi al cittadino, ne aveva parlato abbondantemente Roberto diverso tempo fa (a tal proposito vi suggerisco di dare un’occhiata al sito web più completo).

Ilaria mi ha chiesto una mano giusto due giorni fa, quando a sua volta non era stata capace di entrare nel sito web delle Poste Italiane per due giorni. Specifico che sia io che lei utilizziamo parecchio l’area clienti BancoPosta per poter tenere d’occhio i conti correnti e spostare denaro all’occorrenza, fare ricariche telefoniche, bonifici, pagamento bollette e bollo auto, quello che qualunque cittadino con un conto corrente ed un’interfaccia web funzionante dovrebbe poter fare.

Il risultato? La mia utenza continua a funzionare correttamente dalla home page di Poste.it, Ilaria viene rimbalzata con un’autenticazione fallita.

Poste.it - Autenticazione fallita

Dopo aver fatto qualche altra prova e partendo dal presupposto che lei conosca bene la sua password (salvata anche in un database KeePass, per sicurezza), ho deciso di sentire qualcuno del call center di Poste Italiane (qui i contatti). Da qui in poi ci è sembrato di vivere un’esperienza dell’altro mondo. Contro l’operatrice convinta dell’assoluta incapacità di Ilaria (e anche della mia, ovviamente) abbiamo provato a scherzarci su dicendo che “a questo punto sarà entrato un uomo misterioso a cambiarmi la password“, scatenando a quel punto l’ira funesta della stessa che ha cominciato a dire quanto fosse sicuro l’accesso al sito delle Poste e di quanto fosse impossibile bucare tali protezioni (beata ignoranza, back in time). Provando a ricostruire un dialogo accettabile siamo riusciti ad ottenere solo l’assoluta incapacità di risolvere il problema posto: “mi dispiace signorina, nel suo contratto non compare il numero di telefono, non posso mandarle un messaggio per il recupero della password“. Inutile dire che sul contratto il numero di cellulare di Ilaria compare chiaramente, vero? Ah, questo è il recupero password di Poste Italiane:

Poste.it - Recupero password via SMS

e questo è il recupero del codice cliente che servirà a sua volta a recuperare l’eventuale nome utente perso:

Poste.it - Recupero codice cliente

Ma a questo punto interviene l’operatrice con il suo intervento davvero risolutivo (… sigh!): dalla home page del sito web bisogna selezionare la tab “Privati” quindi “PosteMail” nel box “Servizi Online“, che nulla ha a che fare con ciò che serve a noi. Indovinate un po’ … anche in questo caso nulla di fatto. Telefonata terminata con un’operatrice scocciata dalla nostra incapacità e l’invito ad andare presso una filiale di Poste Italiane (possibilmente quella dove è stato aperto il conto corrente) per risolvere il problema di persona, nel frattempo son fatti tuoi se non riesci ad accedere ai tuoi soldi da web.

Quello che ho scoperto in autonomia

Affidarsi ad un call-center al sabato pomeriggio è evidentemente controproducente, motivo per il quale ho deciso di approfondire l’argomento e cercare di risolvere il problema. Come? Beh, un paio di modi per aggirare il problema li ho trovati.

Login dalla vecchia PosteMail

Partendo dal suggerimento della poco riposata operatrice, ho ben pensato di passare dalla porta di retro. Da Privati / Servizi Online ho selezionato Postemail, inserito quindi le credenziali di Ilaria per arrivare così alla schermata di avviso della dismissione della vecchia casella di posta elettronica (dimostrando così che le credenziali erano giuste e che la colpa non era certo della nostra incapacità). In barba al passaggio sulla nuova bacheca (che NON funziona e manda in loop la schermata riportando Ilaria alla home page) ho voluto fare accesso alla vecchia Postemail. Da li mi è bastato cliccare su “myPoste” in alto a destra per accedere all’amministrazione del conto corrente. Ecco quindi il primo modo per aggirare l’ostacolo.

Login diretto a BPOL: BancoPosta OnLine

La via più semplice è tanto spesso anche la migliore. Perché quindi passare dalla porta principale se è possibile passare da una porta secondaria diretta? Il sottodominio dedicato a BPOL esiste e funziona ancora perfettamente, perché non sfruttarlo quindi?

https://bancopostaonline.poste.it

Poste.it - Accesso a BPOL

Entrerete così nuovamente in possesso del vostro conto on-line, almeno fino al prossimo fantastico e funzionale aggiornamento da parte del personale di Poste Italiane, lo pensano anche le centinaia di persone che hanno commentato su Facebook :-)

Ho avuto la malsana idea di usare la sincronizzazione dei file offline di Windows 7 partendo da una particolare cartella su un server staccato dal dominio principale (quello del sottoscritto), collegato ad un dominio tutto suo. Il risultato? Mandando il PC in ibernazione e riesumandolo il mattino dopo ho avuto accesso solo alla copia dei file in locale, senza possibilità di ricollegarmi al server incriminato, nonostante la buona volontà, qualche bestemmia e un tentativo di net use da riga di comando forzato con dominio e utente del server rompiscatole.

Sfortunatamente non ha funzionato. Può capitare, la sincronizzazione dei file è comodissima per lavorare anche sprovvisti di copertura di rete ma talvolta qualcosa può andare storto. Il problema fondamentale è quando il link decide di ‘morire‘ lasciando l’utilizzatore di turno in panne e con un bel problema da risolvere.

Il web è pieno di documentazione e richiese di aiuto riguardo i link ‘morti‘, sfortunatamente c’è tanta confusione e poca sostanza. Cerco di riassumere in questo articolo il da farsi, passo-passo per arrivare a spazzare via la cartella incriminata e tornare a lavorare solo online.

Offline Only

Quando una cartella risulterà disconnessa ‘agli occhi del sistema‘, questa comparirà in grigio chiaro nella lista delle sincronizzazioni attive e non sarà possibile terminare il collegamento, una cartella morta rimasta sul groppone, apparentemente impossibile da eliminare.

Sincronizzazione file offline: cartelle disconnesse

Come prima prova si potrà chiedere al sistema l’eliminazione dei file in locale e sperare che questo basti. Basterà andare in File Offline (basterà scriverlo nel box di ricerca dello Start), Visualizza File Offline, Computer, selezionare con il tasto destro la voce interessata e selezionare Elimina copia offline. Il vostro problema è stato risolto? No? Ecco, appunto.

DRD – Disable/Reboot/Delete

La procedura che si va ad affrontare ora non è banale, risolve il problema ma bisogna fare attenzione a dove si mettono le mani (e i clic del mouse). Il passo-passo si basa su una risoluzione suggerita su Microsoft Answers (qui l’articolo originale).

ATTENZIONE: Prima di eseguire qualsiasi modifica ai vostri file e/o dispositivi siete pregati di effettuare un backup di questi. Solo così sarete capaci di tornare indietro riparando ad eventuali errori di distrazione. L’articolo e l’autore non possono essere ritenuti responsabili di alcun danno subito dalla vostra strumentazione. Buon lavoro.

Partite con il disabilitare la funzionalità di sincronizzazione offline dei file. Da File Offline, selezionare semplicemente Disabilita file offline. Occorrerà riavviare la macchina, procedete pure.

A sistema avviato, andare in C:WindowsCSCv2.0.6namespace. Probabilmente vi sarà già comparso un popup che vi impedisce di proseguire, se siete amministratori della macchina locale riuscirete ad arrivare al massimo qui, dopo di che sarà necessario ottenere la proprietà della cartella: tasto destro sulla cartella, Proprietà, Sicurezza, Avanzate, Proprietario. Sostituitevi a quello già presente (che non dovreste riuscire a vedere) e confermate con Ok. Sarà ora possibile entrare e individuare finalmente la cartella da eliminare (e con lei l’associazione nel pannello di sincronizzazione).

Sincronizzazione file offline: individuazione della cartella in CSC

Spostate tranquillamente la cartella nel cestino con un semplice Canc. Ripristinare ora le autorizzazioni sulla cartella facendole ereditare dalla cartella padre, attivate nuovamente la sincronizzazione dei file e riavviate il sistema quando richiesto.

Grazie a CyMel il metodo provato è funzionante e risolutivo:

I solved the problem by deleting the items in CSCnamespace. What the MS engineers have failed to indicate is that you have to Disable Offline Files first.

Go to Sync Centre and select Manage Offline Files on the left. Select the Disable Offline Files button and reboot.

You will now be able to reset the permissions on the CSC and sub-folders. You can then delete the partnerships.

Cheers

Cancellazione impossibile?

L’ultimo scherzo riservato all’utente è l’apparente impossibilità di svuotare il cestino. La cartella eliminata resiste all’attacco da svuotamento e protesta richiedendo l’intervento di un amministratore locale della macchina. Non volete disconnettervi e cambiare utente? Ancora una volta il prompt dei comandi risolve il problema.

Basterà lanciarlo come amministratore (Start / Tutti i programmi / Accessori / Prompt dei comandi con tasto destro e Esegui come amministratore), quindi digitare e lanciare un risolutivo ‘del C:$Recycle.Bin* /S /Q /F‘ (vi conviene copiare e incollare il comando nel vostro prompt, senza apici ovviamente).

Cancellazione impossibile? Ci pensa il prompt

Il cerchio è chiuso. Cartella (o cartelle) eliminata e sincronizzazione terminata. Non dovreste più riscontrare il problema :-)

In concomitanza con il rilascio delle versioni beta di Firefox 5, era stato introdotto un “channel switcher che permetteva di selezionare rapidamente il canale di aggiornamento direttamente dalla finestra informazioni di Firefox (Aiuto / Informazioni su Firefox).

Questa novità è stata abbattuta prima che venisse tirata fuori ufficialmente con la versione finale di Firefox 5, anche a causa di un sostanzioso quantitativo di utenti inesperti che selezionavano il canale a dir loro migliore, generalmente il Nightly o il nuovo Aurora, meglio spiegato nella pagina ufficiale di Mozilla: mozilla.com/it/firefox/channel, lamentando poi non pochi problemi di stabilità o perdita dati senza alcun preavviso.

Come già detto mille altre volte nel nostro forum di supporto, utilizzare tali versioni può andar bene fino a quando ve ne assumete ogni rischio e pericolo. Provare nuove release non ancora ufficiali è sicuramente una buona cosa se siete utenti di medio / alto livello, serve ad aiutarci a segnalare eventuali errori prima che le release stabili vengano dichiarate tali e rese pubbliche, con la possibilità di correggere per tempo gli errori. Nel caso invece in cui non lo foste allora no, non ci fornite alcun aiuto, solitamente lo chiedete e lamentate eventuali perdite di dati in casi estremi, pur sapendo che nonostante la nostra buona volontà non è possibile fare granché per recuperare l’unica copia che avevate dei segnalibri o delle password ;-)

Ho capito, come posso ora passare ad un diverso canale di aggiornamento del browser?

A Firefox basta una semplice chiave di configurazione interna (nell’about:config, ndr) per capire e fornirvi gli aggiornamenti prendendoli direttamente dal canale scelto, funziona già così per stabilire / conoscere quale canale di aggiornamento è attivo sulla propria configurazione:

Firefox Update Channel: canale in uso

Per modificare questo comportamento, basterà creare una nuova stringa con valore ‘aurora‘, ‘nightly‘, ‘beta‘ o ‘release‘ (riportati anche in questo articolo nella KB di MozillaZine) e chiamarla ‘app.update.desiredChannel‘, ottenendo un risultato simile:

Firefox Update Channel: canale desiderato

Fatto ciò, Firefox rileverà un nuovo aggiornamento semplicemente andando in Aiuto / Informazioni su Firefox, permettendovi inoltre di installarlo a fine download. Occorrerà chiaramente riavviare il browser per applicare le modifiche.

Firefox Update Channel: aggiornamento rilevato

A questo punto il gioco è fatto, benvenuti sul canale desiderato, quello che si aggiornerà con i suoi tempi e che porterà più o meno instabilità nella vostra vita sul web quotidiana ;-)

Firefox Update Channel: benvenuti su Nightly

Unica precauzione: tenete un backup sempre aggiornato dei vostri dati, non rischiate inutilmente e stupidamente di perderli e, soprattutto, attendete l’uscita delle release finali se pensate di voler installare la versione più aggiornata e instabile di Firefox solo per ‘vedere cosa hanno cambiato quelli di Mozilla‘ …

E’ dai tempi di Firefox 2 che Mozilla ha introdotto una funzionalità in grado di salvare le proprie tab aperte all’atto della chiusura del browser, dando poi la possibilità di riprendere il lavoro lasciato a metà in un secondo momento. Amata e odiata allo stesso tempo, questa funzione è ancora oggi presente (grazie a Panorama), fondamentale per chi ne ha sempre fatto uso, come “se non ci fosse” per chi è abituato a tenere qualche sito aperto ed è in grado di terminare il proprio lavoro prima di chiudere il browser.

Io ricado nel primo gruppo, e come promesso sul forum di Mozilla Italia nella discussione dedicata alla accidentale perdita di tab lasciate aperte, voglio scrivere qualche riga che vi permetta di aiutarvi nell’impresa del non perdere mai il proprio lavoro.

Fondamentali

Firefox (anche le versioni Aurora, Nightly e Beta, ndr) salvano le schede (e gruppi di) in uno specifico file all’interno del proprio profilo: sessionstore.js (kb.mozillazine.org/Session_Restore). Se ancora non sapete come accedere alla cartella contenente il profilo, vi rimando alla documentazione in italiano, localizzata dalla nostra associazione: support.mozilla.com/it/kb/Profili. Come ulteriore facilitazione, dalla versione 4, Firefox permette di arrivare facilmente a destinazione semplicemente selezionando il menu Aiuto / Risoluzione dei problemi / Apri Cartella (bottone in alto nella pagina proposta).

La frequenza di backup del file sessionstore.js può essere variata manualmente dall’about:config, operazione che mi sento di sconsigliare a chi non ha particolare confidenza con questo tipo di cose e –soprattutto– non vuole rischiare di far dei danni all’interno del proprio profilo principale. Suggerisco invece l’utilizzo di uno script esterno che vada semplicemente a creare una copia sempre nuova del file sessionstore.js, che magari cancelli i file più vecchi di una determinata quantità di giorni (perché non più utili), esattamente ciò che ho fatto per me e che vi propongo oggi.

Lo script

Basato sull’originale di ‘random‘, ho voluto completarlo e permettervi di:

  • creare una cartella che tenga i backup del file sessionstore.js all’interno della cartella del proprio profilo senza la necessità di chiudere Firefox;
  • verificare e cancellare file più vecchi di 30 giorni rispetto al lancio dello script in modo del tutto automatico, così da tenere in ordine la cartella e non conservare file ormai inutili;

Sono sicuro della bontà del mio script, ma prima è forse meglio specificare sempre che:

ATTENZIONE: Prima di eseguire qualsiasi modifica ai vostri file e/o dispositivi siete pregati di effettuare un backup di questi. Solo così sarete capaci di tornare indietro riparando ad eventuali errori di distrazione. L’articolo e l’autore non possono essere ritenuti responsabili di alcun danno subito dalla vostra strumentazione. Buon lavoro.

Il codice è semplice per gli addetti ai lavori (diversamente potete saltare al successivo paragrafo ;-)), ve lo propongo:

REM Inserire il nome della cartella del profilo qui di seguito
REM Se non sai cosa fare, leggi http://wp.me/pdQ5q-1BY

set NOMEPROFILO=vn3wv4n7.default

REM NON TOCCARE NIENTE DA QUI IN POI!

@echo off

cls
echo SessionStoreBackup 0.5
echo Gioxx - gf.solone@mozillaitalia.org
echo Info: http://wp.me/pdQ5q-1BY
echo;

:Preparazione
echo;
echo Lettura directory e file di salvataggio sessione ...
echo;

set sessionFileDir=%appdata%\Mozilla\Firefox\Profiles\%NOMEPROFILO%\
set sessionFileName=sessionstore
set sessionFileSuffix=.js

if not exist %sessionFileDir%SessionStoreBackup mkdir %sessionFileDir%SessionStoreBackup

set stampH=%time:~0,2%
if %stampH% lss 10 (set stampH=0%time:~1,1%)
set stampM=%time:~3,2%
set stampS=%time:~6,2%
set stampU=%time:~9,2%
set sessionVer=%stampH%%stampM%%stampS%%stampU%

echo Fatto.
echo;

:Start
IF NOT EXIST "%sessionFileDir%%sessionFileName%%sessionFileSuffix%" (GOTO :End)
IF NOT EXIST "%sessionFileDir%%sessionFileName%-%sessionVer%%sessionFileSuffix%" (
echo Creo il file di backup ...
echo;
copy "%sessionFileDir%%sessionFileName%%sessionFileSuffix%" "%sessionFileDir%%sessionFileName%-%sessionVer%%sessionFileSuffix%"
echo;
echo Sposto il file nella cartella di backup ...
echo;
move "%sessionFileDir%%sessionFileName%-%sessionVer%%sessionFileSuffix%" "%sessionFileDir%SessionStoreBackup\"
echo;
echo Backup completato in
echo %sessionFileDir%SessionStoreBackup\%sessionFileName%-%sessionVer%%sessionFileSuffix%
echo;
)

:PuliziaFile
echo Pulizia file obsoleti ...
echo;
if not exist %windir%\..\temp\OldSessions mkdir %windir%\..\temp\OldSessions
robocopy %sessionFileDir%SessionStoreBackup %windir%\..\temp\OldSessions /E /MOV /MINAGE:3 /R:10
rd %windir%\..\temp\OldSessions /s /q
echo Fatto.

:End

L’unico dettaglio da andare a modificare è il nome della cartella del vostro profilo. Dovrete andare a copiare l’esatto nome e inserirlo subito dopo “NOMEPROFILO=” nella prima riga dello script, sostituendo il nome d’esempio che ho lasciato io (vn8iu7x0.default). Non occorre toccare nient’altro.

Potete scaricare lo script già funzionante all’indirizzo: downloads.gxware.org/index.php?dir=apps/mozilla/&file=SessionStoreBackup.zip

Per farlo funzionare –una volta inserito il nome della cartella del vostro profilo– basterà un semplice doppio clic sul file batch. I file di backup verranno conservati nella cartella SessionStoreBackup all’interno della cartella del profilo e potranno facilmente essere sostituiti a quello danneggiato o –peggio ancora– perso. Semplicemente, una volta chiuso Firefox, basterà spostare il file desiderato dalla cartella di backup a quella principale del profilo, quindi rinominarlo in “sessionstore.js” (se dovesse già esistere il file, sovrascrivetelo o cancellatelo prima di spostare il file di backup).

Mi sembra non manchi nulla. Potrebbe essere sensato parlare di operazione schedulata ma sarà argomento di un prossimo articolo ;-) In caso di problemi l’area commenti è a vostra totale disposizione.

Buon lavoro.

AGGIORNAMENTO 24/04/2013
La versione 0.5 include un banale controllo che va a modificare la precedente 0.4 di ottobre 2011. Tutti gli aggiornamenti vengono rilasciati attraverso il Wiki pubblico gfsCom all’indirizzo public.gfsolone.com/wiki/doku.php?id=mozilla:sessionstorebackup
AGGIORNAMENTO 27/10/2011
In seguito ad alcune segnalazione di malfunzionamento dell’ultimo set di istruzioni (la pulizia dei vecchi file di sessione obsoleti), ho voluto modificare lo script per far si che utilizzi robocopy, quest’ultimo lancerà l’istruzione che si occupa in modo totalmente automatico di mettere da parte i file più vecchi di 7 giorni (minage:7, valore da voi modificabile) per poi essere eliminati tutti in seguito (rd %windir%..tempOldSessions /s /q). Il set di istruzioni è stato portato alla versione 0.4 sia in questo articolo che nel file ZIP su GxWare. Nel caso in cui vi manchi il robocopy sarà possibile scaricarlo cliccando qui, occorrerà inserirlo nella cartella System32 sotto C:Windows (dove C: identifica la lettera assegnata al disco fisso che contiene l’installazione del sistema operativo, ovviamente)
AGGIORNAMENTO 11/07/2011
Grazie alla segnalazione di Godai (vedi: forum.mozillaitalia.org/index.php?topic=51220.msg332626#msg332626) ho corretto un errore presente in riga 21 che tentava di andare a cercare la cartella Utente del sottoscritto. Nello script dedicato al pubblico non sarebbe dovuto comparire quell’indirizzo, utilizzato invece durante i test sulla mia macchina. Mi scuso per la svista, ho già provveduto a modificare lo script nell’articolo e nell’area download di GxWare. La versione è stata modificata, passando dalla 0.2 alla 0.3 attuale.

Era il 2 febbraio del 2009 quando per la prima volta è comparso un articolo riguardante un servizio tanto “stupido” quanto utile allo stesso tempo.

A due anni di distanza dalla sua prima versione (più che stabile, visto il lavoro che doveva svolgere), oggi vi presento una seconda versione che va incontro ad alcune richieste ricevute nel frattempo (grazie Marco, grazie Paolo, ndr): 9 caratteri, un ciclo in grado di mischiare meglio le lettere e i numeri disponibili, la possibilità di copiare e incollare la password priva di spazio finale (un piccolo bug che c’era nella precedente versione, almeno via Firefox e Chrome).

L’indirizzo è rimasto lo stesso:

services.gxware.org/passwd

nonostante lo script che sta alla base della pagina sia cambiato diventando decisamente più ristretto (script originale: TotallyPHP):

<?php
 function createRandomPassword($len) {
 if (!isset($len)) { $len = 9; };
 $chars = &amp;amp;amp;amp;quot;abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ&amp;amp;amp;amp;quot;;
 $charsLen = (strlen($chars)-1);
 srand((double)microtime()*1000000);
 $i = 0;
 $pass = '' ;
 while ( $i &amp;amp;amp;amp;lt; $len ) {
 $num = rand() % $charsLen;
 $tmp = substr($chars, $num, 1);
 $pass = $pass . $tmp;
 $i++;
 }
 return $pass;
}
$password = createRandomPassword();
echo $password; ?>

La seconda delle 3 novità consiste nel fatto che –se necessariopotrete scaricare una differente versione del tool anche in locale, uno script in Visual Basic che vi permetterà –una volta avviato– di scegliere il numero di password da generare e salvarle in un file di testo, una per ciascuna riga così da poter rapidamente copiare ed incollare ciò che vi serve. Il codice è stato realizzato e pubblicato su Tek-Tips.com, ed è disponibile all’indirizzo:

public.gfsolone.com/tools/passwd/randomPasswd.vbs

Per scaricarlo cliccate con il tasto destro sul collegamento e salvatelo in locale sul vostro PC (Salve destinazione come …)

'==========================================================================
'
' NAME: RandomPasswordGenerator.vbs
'
' AUTHOR: Mark D. MacLachlan , The Spider's Parlor
' URL: http://www.thespidersparlor.com
' DATE  : 7/29/2004
' MODIFICATIONS:
'         9/2/2008 Added dictionary object to ensure
'                  uniqueness of passwords
'
' COMMENT: Generates Random Passwords meeting &amp;amp;amp;amp;quot;Complex&amp;amp;amp;amp;quot; Requirements
'          By default will generate a 6 digit password.
'          Edit line passLen = 6 to change length
'==========================================================================
Option Explicit

Dim pGenNum, newpass, passList, inFlag, pgLength, x, fso, ts, passLen
Const ForWriting = 2
passLen = 9

'Give inFlag (input Flag) an initial value to ensure we run once
inFlag = &amp;amp;amp;amp;quot;Seed&amp;amp;amp;amp;quot;

Do While inFlag &amp;amp;amp;amp;lt;&amp;amp;amp;amp;gt; pGenNum
pGenNum = InputBox(&amp;amp;amp;amp;quot;How many passwords would you like to create?&amp;amp;amp;amp;quot; &amp;amp;amp;amp;amp; vbCrLf &amp;amp;amp;amp;amp; _
&amp;amp;amp;amp;quot;Enter a Numeric Value&amp;amp;amp;amp;quot; &amp;amp;amp;amp;amp; vbCrLf &amp;amp;amp;amp;amp; _
&amp;amp;amp;amp;quot;Blank Entry Will Cancel Script&amp;amp;amp;amp;quot;,&amp;amp;amp;amp;quot;Enter Number of Passwords to Create&amp;amp;amp;amp;quot;)

'Quit if no entry
If pGenNum = &amp;amp;amp;amp;quot;&amp;amp;amp;amp;quot; Then WScript.Quit

'Now clear inFlag so we can compare it to the pGenInput going forward
inFlag = &amp;amp;amp;amp;quot;&amp;amp;amp;amp;quot;
pgLength = Len(pGenNum)
'Enumerate each character to ensure we only have numbers
For x = 1 To pgLength
If Asc(Mid(pGenNum,x,1)) &amp;amp;amp;amp;lt; 48 Or Asc(Mid(pGenNum,x,1)) &amp;amp;amp;amp;gt; 57 Then
inFlag = &amp;amp;amp;amp;quot;&amp;amp;amp;amp;quot;
Else
'Build inFlag one character at a time if it is a number.
inFlag = inFlag &amp;amp;amp;amp;amp; Mid(pGenNum,x,1)
End If
Next
'We made it through each character.  If not equal prompt for a number.
If inFlag &amp;amp;amp;amp;lt;&amp;amp;amp;amp;gt; pGenNum Then inFlag = &amp;amp;amp;amp;quot;&amp;amp;amp;amp;quot;
Loop

'Generate the number of required passwords.
'Use a dictionary object to ensure uniqueness.
Dim objDict
Set objDict = CreateObject(&amp;amp;amp;amp;quot;Scripting.Dictionary&amp;amp;amp;amp;quot;)
Do Until objDict.Count = CInt(pGenNum)
newpass = generatePassword(passLen)
If Not objDict.Exists(newpass) Then
objDict.Add newpass, &amp;amp;amp;amp;quot;Unique Password&amp;amp;amp;amp;quot;
passList = passList &amp;amp;amp;amp;amp; newpass &amp;amp;amp;amp;amp; vbCrLf
End If
Loop

'Now save it all to a text file.
Set fso = CreateObject(&amp;amp;amp;amp;quot;Scripting.FileSystemObject&amp;amp;amp;amp;quot;)
Set ts = fso.CreateTextFile (&amp;amp;amp;amp;quot;PasswordList.txt&amp;amp;amp;amp;quot;, ForWriting)
ts.write passList
MsgBox &amp;amp;amp;amp;quot;Passwords saved to PasswordList.txt&amp;amp;amp;amp;quot;,,&amp;amp;amp;amp;quot;Passwords Generated&amp;amp;amp;amp;quot;
set ts = nothing
set fso = nothing

Function generatePassword(PASSWORD_LENGTH)

Dim NUMLOWER, NUMUPPER, LOWERBOUND, UPPERBOUND, LOWERBOUND1, UPPERBOUND1, SYMLOWER, SYMUPPER
Dim newPassword, count, pwd
Dim pCheckComplex, pCheckComplexUp, pCheckComplexLow, pCheckComplexNum, pCheckComplexSym, pCheckAnswer

NUMLOWER    = 48  ' 48 = 0
NUMUPPER    = 57  ' 57 = 9
LOWERBOUND  = 65  ' 65 = A
UPPERBOUND  = 90  ' 90 = Z
LOWERBOUND1 = 97  ' 97 = a
UPPERBOUND1 = 122 ' 122 = z
SYMLOWER    = 33  ' 33 = !
SYMUPPER    = 46  ' 46 = .
pCheckComplexUp  = 0 ' used later to check number of character types in password
pCheckComplexLow = 0 ' used later to check number of character types in password
pCheckComplexNum = 0 ' used later to check number of character types in password
pCheckComplexSym = 0 ' used later to check number of character types in password

' initialize the random number generator
Randomize()

newPassword = &amp;amp;amp;amp;quot;&amp;amp;amp;amp;quot;
count = 0
DO UNTIL count = PASSWORD_LENGTH
' generate a num between 2 and 10

' if num &amp;amp;amp;amp;lt;= 2 create a symbol
If Int( ( 10 - 2 + 1 ) * Rnd + 2 ) &amp;amp;amp;amp;lt;= 2 Then
pwd = Int( ( SYMUPPER - SYMLOWER + 1 ) * Rnd + SYMLOWER )

' if num is between 3 and 5 create a lowercase
Elseif Int( ( 10 - 2 + 1 ) * Rnd + 2 ) &amp;amp;amp;amp;gt; 2 And  Int( ( 10 - 2 + 1 ) * Rnd + 2 ) &amp;amp;amp;amp;lt;= 5 Then
pwd = Int( ( UPPERBOUND1 - LOWERBOUND1 + 1 ) * Rnd + LOWERBOUND1 )

' if num is 6 or 7 generate an uppercase
Elseif Int( ( 10 - 2 + 1 ) * Rnd + 2 ) &amp;amp;amp;amp;gt; 5 And  Int( ( 10 - 2 + 1 ) * Rnd + 2 ) &amp;amp;amp;amp;lt;= 7 Then
pwd = Int( ( UPPERBOUND - LOWERBOUND + 1 ) * Rnd + LOWERBOUND )

Else
pwd = Int( ( NUMUPPER - NUMLOWER + 1 ) * Rnd + NUMLOWER )
End If

newPassword = newPassword + Chr( pwd )

count = count + 1

'Check to make sure that a proper mix of characters has been created.  If not discard the password.
If count = (PASSWORD_LENGTH) Then
For pCheckComplex = 1 To PASSWORD_LENGTH
'Check for uppercase
If Asc(Mid(newPassword,pCheckComplex,1)) &amp;amp;amp;amp;gt;64 And Asc(Mid(newPassword,pCheckComplex,1))&amp;amp;amp;amp;lt; 90 Then
pCheckComplexUp = 1
'Check for lowercase
ElseIf Asc(Mid(newPassword,pCheckComplex,1)) &amp;amp;amp;amp;gt;96 And Asc(Mid(newPassword,pCheckComplex,1))&amp;amp;amp;amp;lt; 123 Then
pCheckComplexLow = 1
'Check for numbers
ElseIf Asc(Mid(newPassword,pCheckComplex,1)) &amp;amp;amp;amp;gt;47 And Asc(Mid(newPassword,pCheckComplex,1))&amp;amp;amp;amp;lt; 58 Then
pCheckComplexNum = 1
'Check for symbols
ElseIf Asc(Mid(newPassword,pCheckComplex,1)) &amp;amp;amp;amp;gt;32 And Asc(Mid(newPassword,pCheckComplex,1))&amp;amp;amp;amp;lt; 47 Then
pCheckComplexSym = 1
End If
Next

'Add up the number of character sets.  We require 3 or 4 for a complex password.
pCheckAnswer = pCheckComplexUp+pCheckComplexLow+pCheckComplexNum+pCheckComplexSym

If pCheckAnswer &amp;amp;amp;amp;lt; 3 Then
newPassword = &amp;amp;amp;amp;quot;&amp;amp;amp;amp;quot;
count = 0
End If
End If
Loop
'The password is good so return it
generatePassword = newPassword
End Function

Ultima novità è l’integrazione del Random Password Generator all’interno degli strumenti “mobili” del Network GxWare, da poco trasferiti sotto il nuovo dominio network.gxware.org/iphone:

network.gxware.org/iphone/passwd.php

Questo vi permetterà di generare rapidamente password sufficientemente complesse avendo a portata di mano solo il vostro telefono ed una connessione a internet.

Per chi volesse invece continuare ad usare la prima versione, ho lasciato la possibilità di accedere alla precedente pagina iniziale semplicemente puntando il browser a services.gxware.org/passwd/v1.php.

Buon lavoro! :-)

UPDATE
Grazie al suggerimento dell’utente “caccolangrifata lo script è stato modificato includendo l’utilizzo di lettere maiuscole (oltre che minuscole, come di default) e la possibilità di specificare una differente quota caratteri della password. La modifica è stata operata sia sulla pagina del servizio standard che quella mobile! :-)