Archives For Batch

Scenario: avevo bisogno di modificare un attributo LDAP secondario, uno di quelli che trovi solo quando abiliti l’opzione “Advanced Features” nella console di Active Directory sul domain controller del tuo ufficio. Il problema è che –almeno su Windows 2008 (R2)– la scheda degli attributi (Attribute Editor) compare solo se apri la scheda utente muovendoti manualmente tra le OU, non la vedi comparire invece se quella scheda la apri in seguito alla ricerca rapida.

VBScript: modificare un attributo di LDAP (esempio d'uso)

Per questo motivo ho accorpato qualche riga di codice VBScript che mi ha permesso di velocizzare l’operazione, sotto un tetto .vbs unico che ti richiederà il nome utente, visualizzerà il valore attuale dell’attributo e ti permetterà di modificarlo con quello che preferisci. Questo esempio d’uso (che è modellato per il mio caso specifico) agisce sul campo “personalTitle“, ma è chiaramente sostituibile con qualsiasi altro campo disponibile (principale o secondario), e in linea di massima lo script è ulteriormente modificabile per fare più operazioni, per effettuare cicli di sostituzioni e molto altro ancora, prendilo quindi solo come base (mancano una serie di controlli di sicurezza, tanto per dire).

Il codice

Pubblicato su Gist per comodità (così lo vedrai sempre aggiornato nel caso in cui ci dovessero essere modifiche future), te lo propongo qui di seguito:

Puoi scaricare il file VBS direttamente facendo clic qui, anche se è più opportuno andare su Gist e fare clic su Download ZIP per ottenere sempre la versione più aggiornata (pulsante in alto a destra, nda).

Per qualsiasi dubbio, consiglio o ulteriore informazione, l’area commenti è sempre a tua disposizione.

Buon lavoro!


Immagine di copertina: unsplash.com / author: Markus Spiske

Condividi l'articolo con i tuoi contatti:

Anche se in realtà le prime modifiche sono saltate fuori già con Firefox 56, la prossima versione del browser di casa Mozilla cambierà molte carte in tavola, salteranno tante regole fino a oggi scritte, e ci sarà sicuramente un’emorragia (con conseguente migrazione verso altri lidi) di utenti che non sopporteranno le novità pronte a scendere in campo (qui abbiamo cercato di raccontartele nella miglior maniera possibile). Non sto prendendo le parti di niente e nessuno. Io mi limito a continuare a utilizzare il browser che da sempre reputo il più bilanciato, anche se ogni giorno li apro -per lavoro- praticamente tutti.

Firefox 57 e SessionStoreBackup, cosa c'è da sapere 1

Avevo già promesso che avrei rimesso mano al SessionStoreBackup, e così ho fatto ormai lo scorso agosto, quando la versione 57 di Firefox era stata distribuita tramite canale Nightly, senza però pubblicare alcunché nel blog (mea culpa!).

Ormai prossima all’uscita (14 novembre, nda), questa varia ancora una volta il modo di memorizzare le tab aperte durante la tua navigazione, e per questo motivo occorre rivedere il passaggio con cui il mio batch va a salvare ciò che ti serve, così da evitare sorprese ben poco gradite in caso di crash o altro evento imprevisto di sistema (ultimamente stiamo cercando di supportare diversi casi sul forum di Mozilla Italia).

Cosa cambia (jsonlz4)

Rispetto al passato, con le nuove release del browser avrai a che fare con dei file json compressi, i nuovi jsonlz4. La struttura resta la medesima:

  • ci sarà un previous.jsonlz4 contenente la sessione del precedente utilizzo
  • un recovery.jsonlz4 che viene aggiornato a intervalli regolari durante l’utilizzo in corso
  • vari upgrade.jsonlz4-XXXXXXXXXXXXXX che corrisponderanno alla sessione in vita per ciascun aggiornamento.

Ti mostro quello che vedo (su un profilo che ha subito i vari cambiamenti del tempo e delle release di Firefox, ignora quindi i file “js” semplici):

Firefox 57 e SessionStoreBackup, cosa c'è da sapere 2

Non esiste più un sessionstore.js libero nella cartella del profilo, non almeno nella normalità, di certo non è più il file di riferimento per il ripristino delle tue tab. Dovremo lavorare proprio sulla cartella originale dei backup di Firefox, affinché questo possa recuperare la sessione che ti interessa.

Lo script

Al solito, caricato nei miei Gist, disponibile qui di seguito (fai clic con il tasto destro su “view raw” in basso a destra, quindi salva la destinazione con nome, dovresti poter vedere un SessionStoreBackup.cmd lì dove hai deciso di scaricarlo):

Facci caso, rispetto alla sua precedente versione ho mantenuto molto di quanto già esistente (quasi tutto). Il controllo di versione del file è sempre lo stesso, così come il modo di dichiarare la cartella del tuo profilo, che però potrai ricercare in maniera più semplice.

Digita about:profiles nella barra URL del tuo Firefox e premi invio, verrai portato alla schermata che riepiloga tutti i profili presenti sulla macchina. Quello che stai utilizzando in questo momento è quello che non potrai cancellare, sarà quindi facile individuarlo :-)

Firefox 57 e SessionStoreBackup, cosa c'è da sapere 3

Ancora una volta il consiglio rimane lo stesso: fai girare lo script automaticamente (o manualmente, se lo preferisci) ogni ora, se puoi anche meno. Più spesso verrà eseguito, più potrai recuperare facilmente la tua sessione in caso di problemi.

Recupero manuale della sessione

Apri la cartella del profilo che stai usando, quindi chiudi il browser, questo è il primo fondamentale passaggio.

Basandoti sul file che più si avvicina alla data e all’ora del problema che hai riscontrato, naviga la cartella del tuo profilo, quella principale, all’interno della quale dovresti trovare un file chiamato sessionstore.jsonlz4. Se presente, rinominalo in qualcosa di diverso, per esempio sessionstore.jsonlz4.bak, quindi copia uno dei due file precedentemente salvati (il previous.jsonlz4 o il recovery.jsonlz4) e rinominalo in sessionstore.jsonlz4.

Avvia ora Firefox. Se quel file che hai sostituito è consistente, vedrai ricomparire le tue tab così come le avevi lasciate l’ultima volta. Diversamente, non c’è altra possibilità di recupero (che io sappia), a meno di non utilizzare una scappatoia offerta dalle “Versioni precedenti” di Windows (il servizio del sistema operativo che permette il versioning dei file sotto costante salvataggio).

Occhio: puoi fare la stessa cosa anche con uno dei diversi “upgrade.jsonlz4-XXXXXXXXXXXXXX” (al posto delle X troverai anno, mese, giorno e ora del salvataggio) a disposizione, portandone fuori uno modificato alla data / ora che ti serve e rinominandolo in sessionstore.jsonlz4, ma così come per la coppia “recovery / previous“, continua a non esserci garanzia alcuna di funzionamento. Di certo questo è un ulteriore layer di protezione “fatto in casa” per evitare di perdere il proprio lavoro, soprattutto quando si ha a che fare con rilasci di Firefox fuori dal canale stabile, più portato ad andare in crash per qualche bug.

Credo di aver detto tutto. Al solito, in caso di problemi o ulteriori dubbi, l’area commenti è a tua completa disposizione (mi raccomando, problemi inerenti SessionStoreBackup, non altri problemi generici del browser, per quelli esiste già il nostro forum).

Condividi l'articolo con i tuoi contatti:

Non è certo una novità, tutt’altro, è storia già passata riguardante un problema già risolto, ma che ricompare su client mai “trattati” prima. Parlo dell’eterna lotta tra l’attesa (troppo prolungata) e la necessità di sottoporre una macchina Windows 7 a regolare installazione di aggiornamenti tramite Windows Update, quelli dell’era pre-rilasci di pacchetti complessivi (qualità e sicurezza mensili).

Ci sono 3 Knowledge Base ufficiali che ci mettono una pezza (3172605, 3102810 e 3020369), ma intorno a loro c’è una serie di operazioni da eseguire che qualcuno ha ben pensato di automatizzare, per evitare possibili danni da distrazioni o mano da principianti. Per chi invece è abituato a lavorare su determinati moduli del SO, l’automatizzazione rende tutto molto più veloce e facilmente replicabile.

Windows 7 e i problemi di loop su Windows Update

Uno dei membri della community di Microsoft ha spiegato nel dettaglio il problema, realizzando e pubblicando l’automatizzazione della quale ti ho parlato poco sopra. Disponibile per Windows a 32 e 64 bit, puoi saperne di più dando un’occhiata qui: answers.microsoft.com/en-us/windows/wiki/windows_7-update/fix-windows-7-update-stuck-on-checking-for-updates/ad6cfeef-232a-49b4-a57b-39978eea6630

Why this problem occurs
Inside Windows Update, there is a small piece of software called an agent. The agent contacts Microsoft’s servers and downloads any available updates.

In order to function properly, the agent on your computer must be the same version as the one on Microsoft’s servers, otherwise your computer will not be able to communicate with the servers. Several months ago, Microsoft updated its servers, causing any Windows 7 machines with the old agent to fail when trying to connect. This incompatibility between computer and server causes Windows Update to get stuck.

Solution
To fix this problem, you need to update your agent so that it can communicate with servers again. There are several updates that need to be installed, so I have written a friendly wizard you can run to install them.

Trovi entrambi i pacchetti al link che ti ho fornito sopra, ma ne ho caricato una copia verificata e funzionante anche sul mio spazio box.com: app.box.com/s/nwps5eoihqy0ujeeoc5qy2dg3n6n3nm7.

Quello che devi fare è semplicemente scaricare il pacchetto ZIP relativo alla tua architettura di sistema (x86 o x64), quindi eseguire il batch wizard_32.bat (o wizard_64.bat). A quel punto segui le (poche) istruzioni a video, il batch penserà a tutto, compreso il riavvio e conseguente esecuzione dello stesso per terminare l’opera. Provato più volte e su più PC, funziona bene e mantiene le promesse. Al termine dell’esecuzione potrai aprire Windows Update e notare che, in pochi minuti, saltano fuori i veri quantitativi di fix da installare sul sistema (e ne troverai degli altri dopo i primi riavvii).

Un altro di quei tool da avere sempre a portata di mano, su cartella Cloud o su una più classica memoria USB.

Buon lavoro!

×

Pillole

Le pillole sono articoli di veloce lettura dedicati a notizie, script o qualsiasi altra cosa possa essere "divorata e messa in pratica" con poco. Uno spazio del blog riservato ai post "a bruciapelo"!
Condividi l'articolo con i tuoi contatti:

Tempo fa ti avevo parlato di un problema riguardante un mancato rollback della versione 16.0.8229.2073 (1706) di Microsoft Office 365 ProPlus (la versione 2016), risolto scaricando e installando un diverso pacchetto, inferiore a quello difettoso. Nel frattempo i problemi sono stati risolti e altri sono sorti, facendomi scegliere una diversa strada per un certo gruppo di utenti ai quali ho tolto la possibilità di aggiornare Office dal canale un po’ più rapido di Microsoft.

Dato che si tratta di semplici modifiche alle chiavi di registro, ho optato per la scrittura di un batch che potesse automatizzare le operazioni. Te lo propongo oggi, così che possa tornarti utile in caso di necessità, da tenere quindi da parte nella solita chiave USB degli strumenti da avere sempre a portata di mano :-)

Office 365 ProPlus (2016): selezione del canale di aggiornamento

Scritto a luglio e utilizzato nel corso del tempo, lo condivido e ti spiego com’è che funziona:

Update

Aggiornamento di ottobre: ho modificato lo script correggendo una svista che tornava a disabilitare gli aggiornamenti di Office quando veniva richiesta la riattivazione. Ne ho approfittato per integrare una nuova voce di menu (la 7) che effettua la lettura del canale di aggiornamento al quale Office si appoggia (fa una lettura da registro di sistema). Ogni voce selezionata attendere ora un colpo di invio (o altro pulsante da tastiera) per tornare a mostrare il menu principale del batch.

Il codice si basa sul fatto che:

  • l’aggiornamento arriverà dai server di Microsoft e non da una location interna alla tua rete (updatepathnon viene infatti valorizzato);
  • non c’è una versione d’arrivo dichiarata (come sopra, updatetargetversion non viene valorizzato);
  • l’unica voce che cambia (in base all’esigenza) è sempre quella relativa al canale di aggiornamento (updatebranch prende il valore in base al ramo di aggiornamento scelto).

è inoltre possibile (e previsto) che una postazione possa avere la necessità di bloccare ogni futuro aggiornamento, continuando quindi a utilizzare solo e sempre quell’unica versione di Office già a bordo. Alla stessa maniera, potrai sempre tornare indietro e chiedere a Office di aggiornarsi, in un secondo momento. In entrambi i casi, la chiave di registro da andare a ritoccare è la enableautomaticupdates.

Il batch è stato testato con successo su configurazioni Windows 7 e 10, con Office 2016 (365 ProPlus) a bordo, installato chiaramente tramite C2R. Potrai scaricarlo direttamente da GitHub e avviarlo –come amministratore locale o di dominio– sul PC che ti interessa. Se l’intervento è invece da portare a termine su più PC, ti consiglio di prelevare dal codice le chiavi di registro che ti interessano, quindi darle in pasto a uno strumento di distribuzione software (come Kace).

Buon lavoro! :-)

Condividi l'articolo con i tuoi contatti:

Articolo “appunti“, come sporadicamente capita qui sopra. Ho avuto la necessità di rimuovere delle mappature verso stampanti di rete non più raggiungibili (cambio server remoto di stampa, nda), tutte queste non controllate da GPO (erano state aggiunte manualmente dagli utenti). Ho aggirato l’ostacolo con alcune righe di VBScript. Le ritrovi qui di seguito nel caso in cui dovessero servirti.

VBScript: rimuovere mappature stampanti (Coding)

Pulizia completa (da server)

Ti ricordo che il VBScript può essere eseguito manualmente, o inserito in un più complesso (e completo) script di Logon, o magari puoi pensare di lanciarlo su altre macchine passando per PSExec o qualsiasi altro strumento di gestione postazioni come Kace (o equivalenti).

Dim objWMIService, objNetwork, colInstalledPrinters, objPrinter
strComputer = "."
i = 0
PrintServer = "NOME-VECCHIO-SERVER"
Set objWMIService = GetObject("winmgmts:" _
 & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colInstalledPrinters = objWMIService.ExecQuery _
 ("Select * from Win32_Printer")
 For Each objPrinter in colInstalledPrinters
 ReDim Preserve arrPrinterName(i)
 arrPrinterName(i) = objPrinter.Name
 If InStr(arrPrinterName(i), PrintServer) Then
 Set objNetwork = WScript.CreateObject("WScript.Network")
 objNetwork.RemovePrinterConnection arrPrinterName(i)
 i=i+1 
 Else
 End If
Next

Il nome del server viene dichiarato come variabile PrintServer (facile intuirlo, eh?), devi praticamente sostituire quell’unica cosa lasciando invariato il resto.

e qualcosina da locale

Sì, perché potrebbe anche capitare che –contestualmente– ci sia qualcosa installato in locale sulla macchina (e non solo figlio del tasto destro → connetti), anch’esso non più utile alla quotidianità dell’utente. A questo punto però, contrariamente alla porzione di script di prima, ricorda che per quella di seguito servirà essere amministratori del PC (quindi bisognerà lanciare lo script come tali, o trovare un’alternativa):

arrDeletePrinters = Array("STAMPANTE1","STAMPANTE2","STAMPANTE3")
For Each objPrinter in colInstalledPrinters
 For Each strPrinter in arrDeletePrinters
 If Not InStr(1, objPrinter.DeviceID, strPrinter, 1) = 0 Then
 objPrinter.Delete_ 
 End If
 Next
Next

dove al posto di STAMPANTE1, STAMPANTE2, STAMPANTE3(volendo puoi dichiararne ancora, o toglierne, se necessario), dovrai inserire quelle che realmente vuoi eliminare, basta il nome con il quale è stata dichiarata (ogni singola stampante) sul sistema, ammesso che qualcuno non abbia avuto la malsana idea di nominarle in maniera differente ogni volta.

Ovviamente non è detto che tu abbia necessità di entrambe le soluzioni, puoi quindi limitarti a riportare la prima parte dello script in un tuo file (.vbs) da salvare dove più ritieni opportuno (in modo tale che sia raggiungibile dalle tue postazioni, chiaramente), o magari solo la seconda, stando però attento a includergli in testa il blocco relativo alla preparazione variabili e funzioni da richiamare (Dim objWMIService, objNetwork, colInstalledPrinters, objPrinter, la parte relativa a strComputer e il Set objWMIService = GetObject(“winmgmts:” _& “{impersonationLevel=impersonate}!\\” & strComputer & “\root\cimv2”)).

Un grande grazie alle fonti che hanno permesso di “pacchettizzare” una soluzione rapida per aggirare un banale ostacolo:

Buon lavoro!

Condividi l'articolo con i tuoi contatti: