Archives For Active Directory

Powershell_512px-GWallMagari non ve ne frega nulla ma io intanto prendo “appunti pubblici” (quelli che tra qualche tempo mi toccherà venire a rileggere per ripetere il trucco su una diversa macchina) :-) Vi è mai capitato di avere a che fare con account di dominio creati per puro servizio? Quegli account che stanno in piedi per tenere viva una macchina, un processo, qualcosa di assolutamente limitato per il quale non sprecare certo il vostro account o un amministratore di dominio. A me si: una banale copia (robocopy) da eseguire con un’utenza specifica autorizzata a leggere / scrivere su due domini differenti.

Fino ad oggi ho utilizzato (e vi ho spiegato un po’) la PowerShell per utilizzare al meglio il servizio Office 365 e l’amministrazione di Exchange Online ma questa in realtà può essere utilizzata (ovviamente) per fare molto altro, compreso il monitoraggio di un account utente che nel caso in cui si blocchi per troppi tentativi di password (o altro motivo non meglio specificato) può tempestivamente avvisarmi tramite mail al mio account di posta aziendale.

È un trucco relativamente semplice che si ottiene con due mosse: un’apposita operazione schedulata che parte quando viene rilevato un codice evento preciso di sistema e uno script PowerShell che ne raccoglie le informazioni e le invia (come già detto) tramite posta elettronica appoggiandosi ad un SMTP interno che non richiede autenticazione. Questo lo script che ho pubblicato su Gist:

L’operazione schedulata viene eseguita ogni volta che nel sistema si genera un errore 4771 (autenticazione non andata a buon fine) e viene chiaramente demandata ad uno dei domain controller (uno qualsiasi) del dominio dove ho creato l’utenza da tenere sotto monitor:

Operazione schedulata su evento 4771

Se quell’evento viene tracciato dall’event viewer (Visualizzatore Eventi, nei Windows in italiano) partirà allora il mio script in PowerShell (richiamando il programma PowerShell.exe e passandogli come parametro la posizione del file LockoutAD.ps1 che sarà stato precedentemente salvato sul sistema):

Operazione schedulata - Powershell

Il parametro passato completo (non visibile in immagine) è un semplice -nologo -File “C:\Scripts\LockoutAD.ps1” (completo di virgolette, occhio) dove chiaramente quel C:\Scripts andrà sostituito con la reale posizione all’interno della vostra macchina / server. L’operazione andrà eseguita con privilegi elevati (si modifica il tutto dalla scheda General dell’operazione schedulata, ndr) anche nel caso in cui non ci sia nessuno collegato sulla macchina.

Il lavoro è terminato. Potete verificarne la validità e la corretta messa in produzione sbagliando volutamente la password dell’utente tenuto sotto monitor, lanciando un prompt dei comandi di test o semplicemente provando a fare login su qualsiasi macchina in dominio. Ringrazio entrambe le fonti dalle quali è partito tutto: blogs.technet.com/b/heyscriptingguy/archive/2009/04/07/how-can-i-query-event-logs-to-discover-active-directory-information.aspx e community.spiceworks.com/how_to/show/11824-email-account-lock-out-notification.

Condividi l'articolo con i tuoi contatti:

Si tratta di uno script molto rapido, estremamente “sporco” e senza alcun controllo che permetta di evitare errori. Ora che vi ho detto i contro, posso parlarvi del semplice e unico PRO: contare in un solo colpo tutti i PC registrati in un dominio LDAP a prescindere dalla OU dove l’amministratore per ragioni di assegnazione policy o pura organizzazione logica ha deciso di spostare le macchine.

Windows-Server-Active-Directory

Il codice originale è farina del sacco del solito ScriptingGuy, un vecchio ma funzionante articolo del 2006: blogs.technet.com/b/heyscriptingguy/archive/2006/01/27/how-can-i-count-the-number-of-computers-in-a-domain.aspx

Io non ho fatto altro che sostituire i campi dichiarati in modo assoluto con due objArgs così che da un command si possa passare l’intero dominio (nel mio caso specifico ho molti domini nome.local / nome.it / nome.com):

set WshShell = CreateObject("WScript.Shell")
set objArgs = WScript.Arguments
if objArgs.Count > 1 Then
Messaggio = msgbox ("Utilizzo dello script da riga di comando:" & vbCrLf & "ContatorePC.vbs dominio.tld " & vbCrLf & vbCrLf & "esempio: ContatorePC.vbs rossi.local", vbInformation, "")
wscript.quit
else
On Error Resume Next
Const ADS_SCOPE_SUBTREE = 2
Set objConnection = CreateObject("ADODB.Connection")
Set objCommand =   CreateObject("ADODB.Command")
objConnection.Provider = "ADsDSOObject"
objConnection.Open "Active Directory Provider"
Set objCommand.ActiveConnection = objConnection
objCommand.Properties("Page Size") = 1000
objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE
objCommand.CommandText = _
"SELECT Name FROM 'LDAP://dc="& objArgs(0) &",dc=" & objArgs(1) & "' WHERE objectCategory='computer'"
Set objRecordSet = objCommand.Execute
Wscript.Echo objRecordSet.RecordCount
end if

L’utilizzo è quindi estremamente banale, dal prompt dei comandi richiamate lo script e subito dopo inserite dominio ed estensione, il risultato (a meno di errori) consisterà in un popup con il numero di PC calcolati, inutile dire che se il numero è 0 qualcosa è andato storto, vero? :-)

Ci sono miriadi di tool o script migliori e lo so bene, questo è letteralmente un “prendi e utilizza” a fini di conteggio puro e crudo nel caso in cui ce ne fosse bisogno.

Condividi l'articolo con i tuoi contatti:

Problematica semplice: una stampante di rete nuova, diversi PC che devono poterla utilizzare, non c’è kix che può aiutarmi ma c’è Active Directory con il suo Netlogon sempre valido. Dato che spiegare agli utenti come mapparsi una stampante potrebbe diventare una delle missioni più difficili di questo mondo e data l’urgenza della cosa, un piccolo trucco in VBScript può venire in soccorso per mappare tutto ciò che desideriamo in pochissimi secondi.

Mano al codice!

Dando per scontato che la stampante sia correttamente installata (e quindi condivisa) su un server raggiungibile dagli utenti di dominio, aprite un qualunque editor di testo (io utilizzo Notepad++) e inserite questo semplice codice VBScript che servirà allo scopo:

'
' Printers.vbs - Windows Logon Script.
' Gioxx - giovanni@solone.it
' Stampante: NOME STAMPANTE, UFFICIO, PIANO, STABILE (varie informazioni che volete salvare)
'
Set objNetwork = CreateObject("WScript.Network")
objNetwork.AddWindowsPrinterConnection "\\SERVERSTAMPANTI\NomeCondivisioneStampante"

Ovviamente stando attenti a modificare il nome del server dove la stampante è installata (SERVERSTAMPANTI) e il nome della condivisione della stessa (NomeCondivisioneStampante). Salvate ora il file come “NomeChePreferite.vbs” (per comodità io continuerò a riportare il file come NomeCondivisioneStampante.vbs) e posizionatelo in una cartella raggiungibile dagli utenti di dominio (potreste tenere il VBS sullo stesso server stampanti, magari in una diversa cartella condivisa che chiamerete Script).

Due “stupide” righe che vi permettono di non fare intervenire l’utente e fargli comparire la stampante tra quelle per lui disponibili con il minimo sforzo. Per far si che questo accada in modo totalmente automatico e silente all’atto del login al dominio, sarà necessario andare a modificare il batch di netlogon inserendo in una qualsiasi posizione la seguente stringa:

Cscript \\SERVERSTAMPANTI\Script\NomeCondivisioneStampante.vbs

Ottenendo un risultato che potrebbe essere molto simile al seguente (è una semplice ipotesi, io mi baso su una situazione vista e gestita):

@echo off
net use X: /delete /y
net use X: \\SERVER\CARTELLA
call %logonserver%\netlogon\altroscript.bat
Cscript \\SERVERSTAMPANTI\Script\NomeCondivisioneStampante.vbs

Così facendo –a caricamento del proprio desktop terminato– si potrà notare la stampante appena mappata nella propria cartella Stampanti e Fax. L’utente potrà ora utilizzare la stampante e voi vi sarete risparmiati minuti di spiegazioni al telefono ;)

Buon lavoro.

P.S. Nel caso in cui questo articolo “non vi basti“, vi ricordo che qualche tempo fa ho spiegato come utilizzare il regedit per mappare qualsiasi stampante!

Condividi l'articolo con i tuoi contatti: