PowerShell: una guida completa – parte 3a

Benvenuti alla parte 3 di 3 di PowerShell: una guida completa. Clicca i seguenti link per consultare la parte 1 e la parte 2.

In questo articolo finale combineremo i concetti appresi finora e dimostreremo alcuni utilizzi pratici di PowerShell. La shell di Microsoft può rendere la vita di un amministratore IT molto più semplice, consentendo di gestire l’infrastruttura con poco sforzo. PowerShell è un tool potentissimo per semplificare il management dei server, raccogliere informazioni sugli stessi e mostrarle in differenti formati.

Questa parte finale della guida introdurrà  diversi nuovi concetti. Prenditi il tuo tempo e affronta ogni parte individualmente.

Che software sono installati sul mio sistema?

Digita Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* | Select-Object DisplayName, DisplayVersion, Publisher, InstallDate | Format-Table –AutoSize

List Available programs

Il comando sopra mostrerà  gli applicativi installati sul tuo sistema. Se scomponi i comandi noterai che la struttura è piuttosto complessa:

  • Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*  – Questa parte del comando ordina a PowerShell di cercare in HKLM e navigare al percorso \Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall per raccogliere tutte le proprietà  presenti. HKLM è il filesystem PowerShell per il registro!
  • Il resto del comando raccoglie semplicemente dei dati specifici (DisplayName, DisplayVersion, Publisher, InstallDate) e li riproduce in una tabella.

Inoltre, puoi navigare per il registro direttamente dalla shell digitando cd HKLM:\ e quindi spostandoti per HKLM come col Command Prompt fra le cartelle di Windows.

Che aggiornamenti di Windows sono installati sul mio sistema?

Trovare informazioni sugli hotfix e gli aggiornamenti (KB) era molto complesso con PowerShell. Microsoft ha di recente introdotto il cmdlet Get-Hotfix: un potente strumento per interrogare l’infrastruttura e scoprire quali patch e aggiornamenti di Windows Update sono installati o per verificare se uno specifico hotfix è presente.

Pensate al caso in cui la scoperta di una vulnerabilità  porti Microsoft a rilasciare una patch di sicurezza: per garantire la protezione dell’infrastruttura è fondamentale verificarne la presenza e in caso negativo installare la patch. Con questo cmdlet, una volta preparato lo script, basta qualche minuto per produrre una lista di server vulnerabili.

Digita Get-Hotfix | Format-table -autosize

Get-Hotfix

Questo produrrà  una lista dei KB installati sul tuo sistema.

Ora possiamo sfruttare le potenzialità  della shell di interfacciarsi con una pluralità  di macchine. Per fare questo introdurremo il PowerShell ISE (integrated scripting environment).

Aprite PowerShell ISE e digitate quanto segue nel pannello degli script. Quindi premete il pulsante play per eseguire lo script. Avrete bisogno di un file di testo con i vostri server come quello creato nella parte 2 della guida. Come reminder, ecco il contenuto che avevamo creato:

test file - hostnames

Ora digitate in PowerShell ISE:

$servers =  get-content c:\temp\test.txt
foreach ($server in $servers)
{Get-HotFix -ComputerName $server | Select-Object PSComputername, HOTFIXiD, Installedon  | Sort-Object -Property InstalledOn -Descending}

Introducing ISE

Questo restituirà  tutti i KB installati sui server The-Solving-N1, The-Solving-N2 and The-Solving-N3:

Se devi verificare la presenza di uno specifico KB, per esempio KB2977629, devi aggiungere il cmdlet Where-object HotfixID -eq “KB2977629” allo script.

inserisci:

$servers =  get-content c:\temp\test.txt
foreach ($server in $servers)
{Get-HotFix -ComputerName $server | Where-object HotfixID -eq “KB2977629” | Select-Object PSComputername, HOTFIXiD, Installedon  | Sort-Object -Property InstalledOn -Descending}

Come posso cercare gli errori nell’Event Log?

L’Event Log è uno strumento fondamentale per rilevare problemi di sistema. PowerShell può migliorare molto l’efficienza delle ricerche nel log.

digita Get-Eventlog system -Newest 30 | Where-Object {$_.entryType -Match “Error”} | format-table -AutoSize

Query Sytem log

Il comando appena mostrato cercherà  nel log SYSTEM e mostrerà  i 30 errori più recenti. Puoi facilmente cambiare l’Event Log con Application o Security.

PowerShell e Active Directory

PowerShell può interagire con qualsiasi sotto-sistema di Windows. Risulta particolarmente utile quando adottata per interrogare Active Directory. Di seguito trovi una selezione di script interessanti ma, prima di vederli, devi verificare la presenza del modulo Active Directory abilitato nella shell. Il modo più semplice è eseguire questi comandi sul domain controller, tuttavia, qualora non fosse possibile, puoi anche aggiungere il ruolo al tuo sistema che deve però far parte del dominio dal quale vuoi estrarre le informazioni.

Digita Add-WindowsFeature RSAT-AD-PowerShell

Add-WindowsFeature RSAT-AD-PowerShell

Completata l’installazione puoi usare la shell per raccogliere informazioni e modificare il dominio Active Directory. Procedi con cautela nel caso tu stia lavorando su un ambiente di produzione.

Dato che la lista di comandi è piuttosto vasta, abbiamo raggruppato per categoria i cmdlets che reputiamo più utili. Puoi sempre lanciare il comando get-help per approfondire nel dettaglio questi cmdlet.

Query Utente

Interrogare gli account utente è molto semplice in PowerShell. I commandi nella tabella di seguito spiegano come cercare degli utenti, individuare quelli con password non-compliant, lock-out, disabilitati e via dicendo.

PowerShell Command What is does Category
Get-ADUser -Filter * -Properties * | where { $_.whenCreated -ge $week } | select Name,whenCreated | Sort Name Utenti creati nell’ultima settimana, ordinati per nome USERS
Get-ADUser -Filter * -Properties PasswordNeverExpires | where { $_.PasswordNeverExpires -eq $true } | select Name | sort Name Utenti con password configurate “senza scadenza”, ordinati per nome USERS
Get-ADUser -Filter “Enabled -eq ‘$false'” | Select Name, UserPrincipalName | Sort name Utenti con account INATTIVI, mostra nome e FQN, ordinati per nome USERS
Search-ADAccount -AccountDisabled -UsersOnly | FT Name,ObjectClass -A Utenti con account DISABILITATI, mostra nome e FQN, ordinati per nome USERS
Search-ADAccount -LockedOut | Format-Table name,lastlogondate, lockedout, objectclass, passwordexpired, passwordneverexpires Trova utenti con account locked USERS
Search-ADAccount -AccountInactive -TimeSpan 90.00:00:00 -UsersOnly |Sort-Object | FT Name,ObjectClass -A Trova account utente non utilizzati per 90 giorni USERS
Get-ADuser -Filter {name -like “*”} -properties *|select @{N=”Account”;E={$_.name}},@{N=”Name”;E={$_.givenname}},@{N=”LastName”;E={$_.surname}},@{N=”Mail”;E={$_.mail}},@{N=”AccountEnabled”;E={$_.enabled}},@{N=”MemberOf”;E={(Get-ADPrincipalGroupMembership $_).name -join (“`r`n”,”,,,,,”)}} | Sort-Object “Account” | FT -AutoSize Gruppi di appartenenza per tutti gli utenti. Ordina i dati come tabella. Usa Export-CSV per restituire un file CSV. USERS
Get-ADUser -Filter * -Properties LastLogonDate | ? { $_.LastLogonDate -eq $null } | Select name,samaccountname

 

Trova gli utenti che non hanno mai eseguito il login USERS

 

 

Query Gruppi

L’appartenenza ad un Gruppo in Active Directory ha importanti ricadute sulla sicurezza. Per tale ragione è molto utile poter determinare rapidamente la presenza in gruppi per ogni utente, in modo da garantire la compliance alle policy di sicurezza interna.

Command What it does Category
get-adgroup -filter * -Properties GroupCategory | Select name, groupcategory | FT -A Tutti i Gruppi presenti in Active Directory GROUPS
Get-ADGroupMember -identity “Administrators” -recursive | select name Tutti gli utenti del gruppo Domain Administrators GROUPS
Get-ADPrincipalGroupMembership -identity Turbogeek | Sort-object | FT -property name, samaccountname -AutoSize Trova i Gruppi ai quali appartiene un utente GROUPS
Get-ADGroupMember -Identity Domain Admins” -Recursive | %{Get-ADUser -Identity $_.distinguishedName -Properties Enabled | ?{$_.Enabled -eq $false}} | Select DistinguishedName,Enabled Trova gli utenti disabilitati nel gruppo Domain Administrators GROUPS

 

Query Active Directory Infrastructure

Questi comandi forniscono informazioni riguardanti l’infrastruttura.
 

Command What it does Category
Get-ADDomainController -Filter * | Format-table name,domain, forest,site, ipv4address, operatingsystem Trova i Domain controller del dominio DC
Get-ADDomainController -Filter {IsGlobalCatalog -eq $true} | Select-Object Name,ipv4address,isglobalcatalog, operatingsystem | FT -A Trova i Global Catalog Server nel dominio, utile se hai più di un domain controller DC
Get-ADDomainController -Filter {IsReadOnly -eq $true} Trova i domain controller read-only se applicabile all’infrastruttura (Branch Servers) DC
Get-ADComputer -Filter ‘Name -like “The-Solving-N1*”‘ -Properties canonicalName, CN, created, IPv4Address, objectclass, OperatingSystem, OperatingSystemServicePack | FT -A Trova i computer nel dominio come “The-Solving-N1”, mostra informazioni utili in tabella DC
Get-ADForest | Select-Object -ExpandProperty ForestMode Ottiene AD Forest level DC
Get-ADDomain | Select-Object -ExpandProperty domainmode Ottieni AD Domain level DC
Get-ADReplicationConnection -Filter {AutoGenerated -eq $true} Ottieni dettagli sulla replica del dominio. Saranno restituiti dati solo se presente più di un domain controller. DC
$datecutoff = (Get-Date)
Get-ADComputer -Filter {LastLogonTimestamp -lt $datecutoff} -Properties Name,LastLogonTimeStamp|  Select Name,@{N=’LastLogonTimeStamp’; E={[DateTime]::FromFileTime($_.LastLogonTimeStamp)}}
Esegui questo script da PowerShell ISE. Configura il $datecutoff e questo indicherà  l’orario dell’ultimo login di un computer. DC

 

Modifica Active Directory

Puoi anche utilizzare PowerShell per modificare il dominio Active Directory. Usa questi comandi con cautela, specie se sei alle prime armi con PowerShell.

Command What it does Category
Disable-ADaccount -identity The-Solving Disabilita l’account The-Solving USERS
Enable-ADaccount -identity The-Solving Abilita l’account The-Solving USERS
Set-ADAccountExpiriation -Identity The-Solving -datetime “07/01/2019” Configura l’account The-Solving per scadere il 7 Gen 2019 USERS
Clear-ADAccountExpiration -identity The-Solving Disabilitare la data di scadenza dell’account USERS
Set-ADAccountPassword -identity The-Solving -reset -newpassword (Convertto-Securestring -asplaintext “Passw0rd123!” -Force) Cambia la password utente cifrando la trasmissione – essenziale USERS
Unlock-ADAccount -identity The-Solving Sblocca l’account The-Solving USERS
New-AdGroup -Name “Test Users” -SamAccountName TestUser -GroupCategory Security -GroupScope Global -displayname ‘Test Users’ -Path “OU=Groups, OU=Resources, DC=TEST, DC=UK -Description “All Test Users” Crea un Security Group chiamato Test Users nelle OU Groups > Resources GROUPS
Set-ADGroup -Identity ‘Test Users’ -groupcategory Distribution -groupscope Universal -Managedby ‘TurboGeek’ Modifica il Gruppo Test Users e lo rende un gruppo universale di distribuzione, gestito da voi GROUPS
search-adaccount -lockedout | unlock-adaccount -passthru -confirm Trova e sblocca tutti gli account “locked” in Active Directory. Una soluzione semplice ed efficace per l’unlock di gruppo. USERS

 
Con questo abbiamo completato la nostra Guida completa a PowerShell. Un viaggio breve ed intenso che ci ha portato a grattare la superficie di questo potente e vastissimo strumento che è PowerShell. Rimanete sintonizzati, usciranno altre guide su questo filone!

Read related articles