Come ottenere rapidamente con Powershell la lista degli utenti di un dominio ed i relativi indirizzi e-mail di Exchange

Active-Directory-Logo Avete bisogno di una lista di utenti e dei relativi indirizzi e-mail presenti in Exchange? Usate Powershell sul domain controller!

In Active Directory vengono registrati tutti i dati degli utenti compresi gli indirizzi e-mail.

Quindi in un domain controller possiamo recuperare sia i nomi degli utenti, l’account ed anche l’indirizzo e-mail.

Get-ADUser -Filter * -Properties DisplayName, EmailAddress, Title | Select-Object -Property @{Name="Nome"; Expression = {$_.displayname}},@{Name="Indirizzo e-mail"; Expression = {$_.emailaddress}},@{Name="Account"; Expression ={$_.samaccountname}},@{Name="Stato"; Expression = {$_.enabled}}| where {($_."Indirizzo e-mail") -and ($_."Nome")}|Sort-Object Nome

Il risultato che otterremo è questo:

Nome                   Indirizzo e-mail                                  Account              Stato
----                   ----------------                                  -------              -----
Administrator          administrator@acmespa.it                          Administrator         True
Alessandro Rossi       Alessandro.Rossi@acmespa.it                       arossi               False
Antonella Bianchi      acquisti@acmespa.it                               abianchi              True
Antonio Neri           magazzino@acmespa.it                              aneri                 True
Emilio Di Maio         Emilio.DiMaio@acmespa.it                          edimaio               True
IT MAN                 itman@acmespa.it                                  itman                 True
Laboratorio            laboratorio@acmespa.it                            laboratorio           True
Annunci

Disabilitare e subito riabilitare scheda di rete con Powershell

NICdisable Vi capita di voler disabilitare e poi riabilitare una scheda di rete ma essendo connessi in desktop remoto non potete farlo?
Fatelo con Powershell!

Quando siete connessi ad un computer con desktop remoto potreste avere la necessità di staccare un attimo il “cavo di rete”, ma essendo connessi da remoto l’operazione porterebbe solo alla vostra disconnessione senza possibilità di riconnettersi. Ma allora come fare?

Con Powershell è possibile cercare tutte le schede di rete fisiche presenti (ed abilitate) in un computer e disabilitarle per un attimo, per poi riabilitarle subito dopo.

Per cui, aprite una sessione di Powershell con diritti di amministratore (pulsante destro sull’icona di Powershell e quindi “Esegui come amministratore”) e lanciate il seguente comando.

$nic = Get-WmiObject Win32_NetworkAdapter | Where-Object {($_.NetEnabled -eq $true) -and ($_.PhysicalAdapter -eq $true) -and (($_.AdapterTypeID -eq 0) -or ($_.AdapterTypeID -eq 9))};$nic.disable();$nic.enable()

Potete anche testarlo sul vostro PC aprendo la finestra “Connessioni di rete” digitando il comando ncpa.cpl: ritroverete tutte le schede di rete (fisiche e non), e lanciando il comando Powershell vedrete che quella attualmente abilitata si disabiliterà per un attimo per poi riabilitarsi da sola.

Come comandare un Powershell remoto sui PC del dominio?

PSsessionAdmin Spesso vorreste usare Powershell in remoto sui vostri PC del dominio ma l’attivazione delle PSsession vi sembra complessa. Ecco un modo semplice e veloce.

Anzitutto bisognerà avere sul server l’utilità PsExec. Segui il link al precedente post di Sistemisti Senior per sapere come fare per scaricarlo. Ricordarsi di copiare il file PsExec.exe nella cartella %WINDIR%\SYSTEM32 (oppure di aggiungere il percorso alla variabile PATH).

Creare quindi il seguente file .bat

@echo off
title Sessione CMD su computer locale
set TESTATA= cls ^&echo. ^&echo ATTIVA E LANCIA UNA PSSESSION SU UN PC REMOTO ^&echo ============================================= ^&echo. ^&echo. ^&echo.
%TESTATA%
echo ATTENZIONE: per uscire digitare exit al primo prompt ed exit(1) al secondo
echo.
echo.
set /P NOMEPC=Inserire il nome del PC remoto: 
title Sessione CMD su computer remoto
%TESTATA%
echo Avvio PSEXEC sul computer remoto per eventuale 
echo attivazione delle sessioni remote di PowerShell
echo.
echo.
psexec \\%NOMEPC%  -s winrm.cmd quickconfig -q
echo %errorlevel% 
IF %ERRORLEVEL% GEQ 1 echo ************** ERRORE! **************** && pause
color 1f
title Sessione PowerShell su computer remoto
%TESTATA%
echo Avvio Powershell su PC %NOMEPC%
echo.
echo.
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -noexit " & {New-PSSession -ComputerName %NOMEPC% |Enter-PsSession}"
color

Goto Fine



:FINE

Otterrete una bella schermata come questa:

Schermata 2017-12-13 alle 12.11.02

Ricordarsi che:

Per uscire dalla sessione remota di Powershell digitare “exit” o “Exit-PsSession” come nell’esempio:

[NOME-PC_REMOTO]: PS C:\Users\admin\Documents> Exit-PSSession 

Per uscire dalla sessione locale di Powershell e tornare nel prompt dei comandi digitare “exit(1)” come nell’esempio:

PS C:\Windows\system32> exit(1) 

Inventario programmi installati sui PC di un dominio

Find username Vorreste conoscere tutti i programmi installati su ogni PC del vostro dominio ma non sapete fare?

Ecco come realizzare un file txt/csv leggibile da Excel per analizzare i programmi installati.

Ecco come fare:
Create il seguente file con estensione ps1:

$IPconnectedcomputers=Get-WmiObject -class Win32_ServerConnection -computername localhost -namespace root\CIMV2| where-object {$_.computername -like "*.*.*.*"} | 
select-object computername -unique

# o in alternativa se volete controllare solo determinati PC
# $IPconnectedcomputers = @("PC129","PC179","PC120","PC144","PC37","PC182","PC002","PC156","PC20")

$TimestampReport=get-date -Format yyyyMMdd
$ReportSavePath=[environment]::getfolderpath("mydocuments")+"\Report\"+$TimestampReport
new-item $ReportSavePath -type directory -erroraction silentlycontinue

foreach($ip in $IPconnectedcomputers){

if ((test-connection $ip.computername -Count 1 -erroraction silentlycontinue).statuscode -eq 0)
 {
 #$pc=($ip.computername).Insert(0, "\\")
 $pc=[System.Net.Dns]::GetHostEntry($ip.computername).HostName
 write-host Collegamento a $pc
 gwmi win32_product -ComputerName $pc -erroraction silentlycontinue | select-object vendor,caption,version,__SERVER|Export-Csv -NoTypeInformation -force 
"$ReportSavePath\$PC.txt"
 write-host Fine connessione con $pc
 }
else
 {
 write-host Collegamento a $ip IMPOSSIBILE!
 }
}

write-host Elaborazione terminata
write-host premi un tasto per continuare...
read-host

Lanciatelo ed otterete dopo qualche minuto (dipende dal numero dei PC/servers presenti nel dominio) questo risultato:

Report PC da script

 
 
 

 

Saranno elencati tutti i vendors dei programmi ed i relativi programmi e versioni installate.
In un prossimo post spiegherò anche come disinstallare da remoto, con Powershell, i programmi invididuati.

 
N.B.

E’ necessario che gli script Powershell siano resi eseguibili (di default lo sono solo quelli firmati).
Per bypassare il problema e rendere eseguibili anche quelli non firmati lanciate Powershell come amministratore (tenete premuto Ctrl-Shift mentre cliccate sul relativo collegamento) e scrivete:

Set-ExecutionPolicy -ExecutionPolicy bypass

Trovare il numero della settimana corrente con powershell

WeekNumber

In uno script vi serve il numero della settimana corrente per svolgere una determinata azione una settimana sì ed una no?

Usate Powershell!

Spesso capita di voler svolgere una determinata azione a seconda che il numero della settimana sia pari o dispari, ad esempio voglio fare una copia di alcuni files una settimana in un disco e una settimana in un altro.
In soccorso arriva Powershell. Con esso possiamo stabilire il numero della settimana corrente e di conseguenza capire se è pari o dispari, per poi disporre un’azione da eseguire.

Ad esempio volete lanciare un programma se la settimana corrente è dispari:

if((get-date -uformat %W)% 2 -eq 0) 
       {write "Pari. Non faccio niente!"
       } 
    else 
       {write "Dispari. Procedo con le azioni previste..."
        ...azione da eseguire
       } 

Oppure voglio connettere una LUN iScsi per le settimane pari ed un’altra per le settimane dispari:

write Disconnetto tutte le sessioni iScsi...
(iscsicli reporttargetmappings|findstr /i "sess").substring(30,33)| foreach-object -process {invoke-command{iscsicli logouttarget $_}}
if((get-date -uformat %W)% 2 -eq 0) 
       {write "Settimana pari. Attivo la LUN pari"
	iscsicli qlogintarget iqn.1992-04.com.emc:storage.LUN-PARI
       } 
    else 
       {write "Settimana dispari. Attivo la LUN dispari"
	iscsicli qlogintarget iqn.1992-04.com.emc:storage.LUN-DISP
       } 

Interrogare facilmente le classi del .Net framework con Powershell

Classe .Net da Powershell

Lo sapevate che è possibile interrogare (ma anche impostare) una classe del .Net Framework da Powershell in modo rapido? Eccone alcuni esempi. Continua a leggere