martedì 17 settembre 2024

Excel - macro per unire piu file excel in uno solo

 


Mi e' capitato di dover unire differenti files di excel in uno solo.

I file di origine sono tutti generati da RVTools e sono relativi a differenti vcenter.

Quello che volevo ottenere e' un singolo file che racchiudesse tutte le informazioni raccolte da RVTool.

Tutti i file di origine sono quindi strutturati nello stesso modo. Hanno tutti gli stessi fogli di lavoro, chiamati nello stesso modo, ma ciascuno di questi contiene dati differenti. 

Il risultato desiderato e' avere un file excel strutturato con gli stessi fogli di lavoro dei file di origine e che ciscuno di quiesti contenga tutte le righe provenienti dai differenti files.

Ad esempio nel foglio/tab vInfo voglio trovare un elenco di tutte le vm che ci sono in tutti i vcenter che RVTools ha interrogato.

La soluzione che ho utilizzato e' stata quella di creare un file excel di tipo xlsm, cioe che possa utilizzare macro e inserire il seguente codice:


Alt+F11 / VB editor / inserisci modulo

Salva

Alt+F8 per eseguire.


Viene creato un file excel che contiene gli stessi fogli di lavoro de, ma ciascun foglio tutte le righe dei provenienti, con qualche piccolo difetto superabile. Ho effettuato controlli a campione dei dati importati e sembra che non ci siano errori. Il solo problema e' l'intestazione duplicata.

 


Sub UnisciFileExcelConFogli()

    Dim cartella As String

    Dim file As String

    Dim wbOrigine As Workbook

    Dim wsOrigine As Worksheet

    Dim wsDestinazione As Worksheet

    Dim wbDestinazione As Workbook

    Dim ultimaRiga As Long

    Dim nomeFoglio As String

    Dim primaUnione As Boolean

    

    ' Imposta il percorso della cartella contenente i file Excel

    cartella = "C:\test\"

    

    ' Crea un nuovo workbook per i dati uniti

    Set wbDestinazione = Workbooks.Add

    

    ' Imposta il nome del primo file nella cartella

    file = Dir(cartella & "*.xlsx")

    

    primaUnione = True

    

    Do While file <> ""

        ' Apri il file Excel

        Set wbOrigine = Workbooks.Open(cartella & file)

        

        ' Cicla attraverso ogni foglio di lavoro nel file di origine

        For Each wsOrigine In wbOrigine.Worksheets

            nomeFoglio = wsOrigine.Name

            

            ' Controlla se il foglio esiste già nel file di destinazione

            On Error Resume Next

            Set wsDestinazione = wbDestinazione.Sheets(nomeFoglio)

            On Error GoTo 0

            

            ' Se il foglio non esiste, crealo

            If wsDestinazione Is Nothing Then

                Set wsDestinazione = wbDestinazione.Sheets.Add(After:=wbDestinazione.Sheets(wbDestinazione.Sheets.Count))

                wsDestinazione.Name = nomeFoglio

                ' Copia l'intestazione dal foglio di origine al foglio di destinazione

                wsOrigine.Rows(1).Copy wsDestinazione.Rows(1)

            End If

            

            ' Trova l'ultima riga del foglio di destinazione

            ultimaRiga = wsDestinazione.Cells(wsDestinazione.Rows.Count, "A").End(xlUp).Row + 1

            

            ' Copia i dati dal foglio di origine al foglio di destinazione, saltando l'intestazione se non è la prima unione

            If primaUnione Then

                wsOrigine.UsedRange.Copy wsDestinazione.Cells(ultimaRiga, 1)

            Else

                wsOrigine.Range("A2", wsOrigine.Cells(wsOrigine.Rows.Count, wsOrigine.UsedRange.Columns.Count).End(xlUp)).Copy wsDestinazione.Cells(ultimaRiga, 1)

            End If

            

            ' Reimposta wsDestinazione per il prossimo ciclo

            Set wsDestinazione = Nothing

        Next wsOrigine

        

        ' Chiudi il file di origine

        wbOrigine.Close False

        

        ' Passa al file successivo

        file = Dir

        primaUnione = False

    Loop

    

    MsgBox "Unione completata!"

End Sub


domenica 28 aprile 2024

DCDIAG batch

set datetime=%date:~6,4%%date:~3,2%%date:~0,2%%time:~0,2%%time:~3,2%%time:~6,2%

set date=%date:~6,4%%date:~3,2%%date:~0,2%

set time=%time:~0,2%%time:~3,2%%time:~6,2%

echo %datetime%

C:\Windows\System32\dcdiag.exe /e /v /c /fix /f:"c:\temp\%date%_%time%_dcdiag.txt"

REM -con debug- C:\Windows\System32\dcdiag.exe /v /c /d /e /fix /f:"c:\temp\%date%_%time%_dcdiag.txt"



lunedì 29 maggio 2023

Verificare il traffico di rete con Network Monitor e Netsh

 


Verificare il traffico di rete con Network Monitor e Netsh


Abilitare il trace con Netsh

netsh winhttp set tracing level=verbose format=hex output=file max-trace-file-size=512000 state=enabled

netsh trace start scenario=InternetClient

effettuare il tipo di traffico che si sospetta abbia problemi

netsh trace stop

Cercare il log in:

%LOCALAPPDATA%\Temp\NetTraces\NetTrace.etl

Aprire il file di log con Network Monitor 3.4

Ricercare nei log usando una chiave di ricerca. Esempio

description.contains("EnabledProtocols")

N.B.

Questo esempio era relativo ala ricerca di problemi sul traffico che usava il TLS 1.2.


venerdì 28 aprile 2023

Microsoft 365 trial

 Sottoscrizione Microsoft 365 senza carta di credito

Ai seguenti link e' possibile creare una sottoscrizione trial Microsoft 365 


Office 365 Business Premium Trial

http://go.microsoft.com/fwlink/p/?LinkID=510938


Create Office 365 E5 Trial Tenant

https://go.microsoft.com/fwlink/p/?LinkID=698279


Create Office 365 E3 Trial Tenant

https://go.microsoft.com/fwlink/p/?LinkID=403802

REFERENCE

https://www.linkedin.com/pulse/how-create-office-365-trial-subscription-without-creditcard-rawal/

venerdì 24 marzo 2023

Windows DNS - problemi risoluzione nome

 Problemi risoluzione nome DNS

Nei giorni scorsi mi e' capitato un problema molto singolare.

In una rete con diversi domain controller, uno solo non riusciva a risolvere un nome specifico wpad.nomedominio.local

La parte di record DNS era configurata correttamente. Aggiungendo un nome diverso non si verificava il problema. Neppure cancellare e ricreare il record ha avuto esito positivo.

Il problema e' proprio legato al nome: WPAD.

Wpad e' un servizio che viene usato nei browser internet per impostare ed abilitare il proxy. Purtroppo non si tratta di un servizio sicuro ed e' un processo di discovery automatico che non e' possibile controllare. Soprattutto puo essere usato in modo malevolo. Per questo motivo il servizio DNS lo inserisce automaticamente nella lista delle query dns bloccate.

Per sbloccarlo e' stato sufficiente andare in HKLM\System\CurrentControlSet\Services\DNS\PArameters\

e rimuovere dalla chiave: GlobalQueryBlockList il valore wpad.

Ricordarsi di riavviare il servizio.

La stessa limitazione esiste di default anche per ISATAP, che e' un servizio di transizione tra reti IPv6 e reti IPv4. Gli host che utilizzano questo servizio si appoggiano a degli ISATAP router, scoperti tramite la ricerca del nome dns isatap.nomedominio.local (x esempio) 


REFERENCE:

https://support.hpe.com/hpesc/public/docDisplay?docId=c01632046&docLocale=en_US

https://homeworks.it/Pdf/DNS%20Server%20Global%20Query%20Block%20List.pdf

http://certsrv.ru/en/tmg/html/6e65e577-a7ee-4299-b6dc-94e03e0b3cd2.htm



mercoledì 24 agosto 2022

IDRAC - Gestione tramite powershell

POWERSHELL for IDRAC

E' possibile gestire le nuove versioni di IDRAC tramite powershell. La cosa diventa utile nel momento in cui si vuole operare da un unico strumento tramite script, diversamente e' molto piu conveniente utilizzare una console ssh

I moduli IDRAC per powershell vanno installati usando questi comandi:

Find-Module *idrac* |ogv        

Find-Module *idrac* |Install-Module    

#Restituisce lo stato di IDRAC

Set-PowerControlREDFISH -idrac_ip 1.2.3.4 -idrac_username root -idrac_password xxx -get_power_state_only y

Set-PowerControlREDFISH -idrac_ip 1.2.3.4 -idrac_username root -idrac_password xxx -power_request_value On

EXAMPLE WITH AUTH TOKEN

Set-PowerControlREDFISH -idrac_ip 1.2.3.4 get_power_state_only y -x_auth_token 5bd9cc9a8727ec366a9cef5bc83b2708

REFERENCE

https://www.dell.com/support/kbdoc/it-it/000178045/redfish-api-with-dell-integrated-remote-access-controller?dgc=SM&cid=243900&lid=spr5873265198&RefID=dtw22_sm5873265198&linkId=138750710

https://dl.dell.com/manuals/common/dell-emc-poweredge-server-mgmt-idrac-api.pdf

https://github.com/dell/DellPEWSMANTools

https://dl.dell.com/manuals/common/dell-emc-poweredge-server-mgmt-idrac-api.pdf


WSUS - Forzare rilevazione client

 Ciao,


spesso mi capita di non voler aspettare che WSUS rilevi un client. PEr forzare il rilevamento utilizzo questa procedura, che per adesso mi ha sempre dato molte soddisfazione :)

Verifica impostazioni WSUS

regedit hKLM\Software\Policies\Microsoft\Windows\Windows Update\WUSERVER

Forzare rilevamento del client da parte del wsus

Da eseguire sul client

$updateSession = new-object -com "Microsoft.Update.Session"

$Criteria="IsInstalled=0 and IsHidden=0"

$updates=$updateSession.CreateupdateSearcher().Search($criteria).Updates

wuauclt /reportnow


sabato 20 agosto 2022

Installazione e configurazione di OpenSSH su Windows

=========================================================================


=====Installazione - metodo 1=====

# Impostazione local GPO

Computer Configuration\Administrative Templates\System

Specify settings for optional component installation and component repair: Enabled

ed abilitare il flag sull'opzione

Download repair content and optional features directly from Windows Update instead of Windows Server Update Services (WSUS)

# Aggiornamento policy

gpupdate /force

# Verifica dello stato dell'installazione

Get-WindowsCapability -Online | ? name -like "openssh*"

# Installazione OpenSSH server

Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0


=====Installazione - metodo 2=====

# Download OpenSSH server 

## Set network connection protocol to TLS 1.2

## Define the OpenSSH latest release url

 $url = 'https://github.com/PowerShell/Win32-OpenSSH/releases/latest/'

## Create a web request to retrieve the latest release download link

 $request = [System.Net.WebRequest]::Create($url)

 $request.AllowAutoRedirect=$false

 $response=$request.GetResponse()

 $source = $([String]$response.GetResponseHeader("Location")).Replace('tag','download') + '/OpenSSH-Win64.zip'

## Download the latest OpenSSH for Windows package to the current working directory

 $webClient = [System.Net.WebClient]::new()

 $webClient.DownloadFile($source, (Get-Location).Path + '\OpenSSH-Win64.zip')

# Verifica la presenza del file ZIP 

Get-ChildItem *.zip

Estraggo 

# Extract the ZIP to a temporary location

 Expand-Archive -Path .\OpenSSH-Win64.zip -DestinationPath ($env:temp) -Force

# Move the extracted ZIP contents from the temporary location to C:\Program Files\OpenSSH\

 Move-Item "$($env:temp)\OpenSSH-Win64" -Destination "C:\Program Files\OpenSSH\" -Force

# Unblock the files in C:\Program Files\OpenSSH\

 Get-ChildItem -Path "C:\Program Files\OpenSSH\" | Unblock-File

Installo OpenSSH 

& 'C:\Program Files\OpenSSH\install-sshd.ps1'

=========================================================================


Imposto il servizio 

## changes the sshd service's startup type from manual to automatic.

 Set-Service sshd -StartupType Automatic

## starts the sshd service.

 Start-Service sshd


#Aggiungo le regole di firewall

New-NetFirewallRule -Name sshd -DisplayName 'Allow SSH' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22

oppure

# Confirm the Firewall rule is configured. It should be created automatically by setup. Run the following to verify

if (!(Get-NetFirewallRule -Name "OpenSSH-Server-In-TCP" -ErrorAction SilentlyContinue | Select-Object Name, Enabled)) {

    Write-Output "Firewall Rule 'OpenSSH-Server-In-TCP' does not exist, creating it..."

    New-NetFirewallRule -Name 'OpenSSH-Server-In-TCP' -DisplayName 'OpenSSH Server (sshd)' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22

} else {

    Write-Output "Firewall rule 'OpenSSH-Server-In-TCP' has been created and exists."

}


# Imposto Powershell come console predefinita per i collegamenti in SSH

New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -PropertyType String -Force


# Verifico la connessione con password (client)

ssh administrator@1.2.3.4

ssh scpuser@1.2.3.4


# Creo la coppia di chiavi per l'autenticazione (sul client)

ssh-keygen -t ed25519


# Creo la cartella dentro cui copiare la chiave pubblica *.pub (sul server)

New-Item -Type Directory -Path "C:\key_to_add\"


# Accedo al server ssh con un utente NON amministratore di macchina


# Creo directory e file dove salvare le chiavi pubbliche per accedere senza password - user

New-Item -Type Directory -Path $env:USERPROFILE\.ssh\

New-Item -Type File -Path $env:USERPROFILE\.ssh\authorized_keys


# Creo il file dove salvare le chiavi pubbliche per accedere senza password - admin

New-Item -Type File -Path C:\ProgramData\ssh\administrators_authorized_keys


# copio il file .pub sul server e la importo nel file delle chiavi (powershell come admin)

$authorizedKey = Get-Content -Path "C:\key_to_add\id_ed25519.pub"

Add-Content -Force -Path $env:USERPROFILE\.ssh\authorized_keys -Value "$authorizedKey"

Add-Content -Force -Path C:\ProgramData\ssh\administrators_authorized_keys -Value "$authorizedKey"


# Imposto i permessi del file copiandoli da un altro

get-acl C:\ProgramData\ssh\ssh_host_dsa_key | set-acl C:\ProgramData\ssh\administrators_authorized_keys


oppure


icacls.exe "C:\ProgramData\ssh\administrators_authorized_keys" /inheritance:r /grant "Administrators:F" /grant "SYSTEM:F"


# Verifico la connessione senza password (client)

ssh administrator@1.2.3.4

ssh scpuser@1.2.3.4


# verifico la copia dei file da remoto

scp administrator@1.2.3.4:'c:\sshtest\*.txt' .

scp administrator@1.2.3.4:'c:\sshtest\*.txt' C:\testw10\


N.B. attenzione, se sto eseguendo la powershell come admin potrebbe non funzionare.


# modifica sshdconfig aggiungendo quanto segue.

queste istruzioni limitano gli host da cui e possible accedere e consentono solo l'autenticazione tramite chiavi

=========================================================================#PasswordAuthentication yes

PasswordAuthentication no

ChrootDirectory C:\SSHTest

PermitTunnel no

#AllowAgentForwarding yes

AllowAgentForwarding no

#AllowTcpForwarding yes

AllowTcpForwarding no

GatewayPorts no


#AllowUsers scpuser@1.2.3.6 administrator@1.2.3.6

AllowUsers scpuser@1.2.3.6

#AllowUsers scpuser@1.2.3.6 administrator@1.2.3.6 scpuser@1.2.3.6 administrator@1.2.3.6

#AllowUsers scpuser gippi\scpuser@1.2.3.6 dmz\scpuser@1.2.3.6 scpuser@dmz.local@1.2.3.6 scpuser@dom.local@1.2.*

#AllowUsers dmz\scpuser@1.2.3.6 scpuser@dmz.local@1.2.3.6

AllowUsers dmz\scpuser@1.2.3.6

DenyGroups Administrators

DenyGroups Administrators


Match user scpuser

ChrootDirectory C:\SSHTest

# ForceCommand internal-sftp

PermitTunnel no

AllowAgentForwarding no

AllowTcpForwarding no

GatewayPorts no


#Match Group administrators

# AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys

# ChrootDirectory C:\SSHTest

# PermitTunnel no

# AllowAgentForwarding no

# AllowTcpForwarding no

# GatewayPorts no


# Match Group SSHUsers

# AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys

# ChrootDirectory C:\SSHTest

# # ForceCommand internal-sftp

# PermitTunnel no

# AllowAgentForwarding no

# AllowTcpForwarding no

# GatewayPorts no

=========================================================================


N.B.

i permessi processati nel seguente ordine:

DenyUsers

AllowUsers

DenyGroups

AllowGroups


# restart servizio

get-service -name sshd | restart-service


# verifica dell'accesso e della copia dei file (sul client)

scp scpuser@1.2.3.4:'*.txt' C:\sshtest\


# impostazione del servizio ssh-agent (sul client)

set-service ssh-agent StartupType 'Automatic'

Start-Service ssh-agent

ssh-add "C:\Users\user\.ssh\id_ed25519" (eseguire con l'utente che deve effettuare la copia)


# Creazione archivio protetto da password della cartella C:\Users\user\.ssh\

prima di procedere alla rimozione procedere alla creazione di un archivio protetto che contiene priv key, pub key e known_hosts. salvare il file in un posto sicuro


# Cancellazione chiave privata (solo dopo aver impostato l'agent)

remove-item "C:\Users\user\.ssh\id_ed25519"


REFERENCE

https://docs.microsoft.com/it-it/windows-server/administration/openssh/openssh_overview

https://github.com/powershell/win32-openssh/wiki

https://adamtheautomator.com/openssh-windows/

https://techietown.info/2017/05/restrict-ssh-access-for-users-from-specific-ip-address/

http://woshub.com/using-ssh-key-based-authentication-on-windows/

https://www.concurrency.com/blog/may-2019/key-based-authentication-for-openssh-on-windows

https://social.technet.microsoft.com/Forums/en-US/251804c1-883e-4ec8-a378-352dabbe87dd/openssh-server-install-failed-contact-your-administrator-to-get-this-feature?forum=ws2019

https://thesysadminchannel.com/solved-add-windowscapability-failed-error-code-0x800f0954-rsat-fix/

https://bobcares.com/blog/install-and-configure-openssh-on-windows/

https://winscp.net/eng/docs/guide_windows_openssh_server

https://docs.microsoft.com/en-us/windows-server/administration/openssh/openssh_server_configuration

https://docs.microsoft.com/en-us/windows-server/administration/openssh/openssh_install_firstuse?tabs=gui


Installazione OpenSSH su Windows Server

Windows Server 2019 e Windows 10 tra le APP includono anche un server OpenSSH

Questo server consente il trasferimento sicuro di file da un server ad un'altro usando il protocollo SSH.

La porta utilizzata e' la 22.

Aprire powershell e digitare il seguente comando per verificare se e' gia installato

Get-WindowsCapability -Online | ? name -like "openssh*"

Eseguire il seguente comando per installare il server SSH

Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0

Il primo problema che ho incontrato e' stata l'installazione. Se nella rete locale e' bloccato l'accesso di 

Windows Update verso l'esterno anche l'installazione delle app ed il Microsoft store potrebbero essere 

impattati (quasi sicuramente lo saranno).


ERRORE RISCONTRATO

=========================================================================Add-WindowsCapability : Add-WindowsCapability failed. Error code = 0x800f0954

At line:1 char:1

+ Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0

+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    + CategoryInfo          : NotSpecified: (:) [Add-WindowsCapability], COMException

    + FullyQualifiedErrorId : Microsoft.Dism.Commands.AddWindowsCapabilityCommand

=========================================================================

E possibile verificare i log dell'ionstallazione qui:

C:\Windows\Logs\DISM\dism.log


Per risolvere ho dovuto modificare le impostazioni delle policy locali del server.

Computer Configuration\Administrative Templates\System

Specify settings for optional component installation and component repair: Enabled

ed abilitare il flag sull'opzione

Download repair content and optional features directly from Windows Update instead of Windows Server Update Services (WSUS)

Attendere un attimo per dare il tempo alla policy di venire elaborata e quindi rieseguire l'installazione

Get-WindowsCapability -Online | ? name -like "openssh*"

Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0

Se tutto ha funzionato correttamente vedremo questi 2 servizi installati in Windows:

OpenSSH Authentication Agent

OpenSSH SSH Server

Perfetto. Siamo riusciti ad installare OpenSSH.
Adesso non rimane che configurarlo e collegarsi per verificarne il funzionamento
I passaggi successi sono configurare il server e verificarne il funzionamento.

venerdì 19 agosto 2022

Installazione componenti di Windows

 Molto spesso nelle reti aziendali gli aggiornamenti sono distribuiti internamente, bloccando l'accesso a Windows Update. Questa e' una situazione sana per diversi motivi: occupazione di banda, gestione degli aggiornamenti. Bloccare l'aggiornamento a Windows Update, purtroppo porta anche ad alcuni disservizi. Si porta a malfunzionamenti di Windows Store (che salvo rare eccezioni non serve) e all'impossibilita di installare alcuni componenti di Windows come RSAT, o nel mio caso OPENSSH server (potrei aggirare scaricando ed installando manualmente il tutto).

Ad ogni modo ho bisogno di sbloccare la possibilita del sistema in questione di scaricare i componenti opzionali di Windows. Ho fatto in questo modo:

gpedit.msc - computer - Administrative template - System - Specify setting for optional component installation and component repair = enable

Flag sulla voce: Download repair content and optional ...

quindi eseguire il comando

gpupdate /force per aggiornare le policy.

Nel mio caso ha funzionato senza riavvio

 

giovedì 4 agosto 2022

Teams - impossibile accedere - CAA20002 AADSTS1002016 - errore TLS

Ciao a tutti,

non riuscivo ad accedere a Teams, e Word mi chiedeva di rieffettuare l'accesso con il mio account.

Anche se un po scettico ho provato a seguire il consiglio dell'articolo riportato in fondo. La cosa che mi ha sbalordito di piu e' che ha funzionato!!!

Errore TLS - CAA20002 AADSTS1002016

Risoluzione:

pannello di controllo - opzioni internet - impostazioni avanzate - ripristina impostazioni avanzate

Credo che siano state reimpostate le impostazioni TLS.

========================================================

Hello friend, my name is Lucas and I'm from Brazil but I know how to help you. Go to "Control Panel" then "Internet Options", then click the "Advanced" tab, then click "Restore Advanced Settings", click "Apply" and then "OK". Hope this helps !

========================================================

REFERENCE

https://community.spiceworks.com/topic/2458811-teams-error-caa20002


mercoledì 3 agosto 2022

Powershell - Matrici Array

In powershell e' molto importante saper maneggiare matrici ed array. Un'altra cosa molto importante e' capire se si sta lavorando con degli oggetti o con dei valori. I primi sono dotati di proprieta che e' possibile interrogare e modificare. I secondi sono oggetti molto piu semplici. Lavorando con ImportExcel ho acquisito un intero foglio di lavoro in una singola variabile. A questo punto dovevo capire come maneggiarla. 

Importare il conenuto del foglio VpnUsers in una variabile

$test = import-excel .\elencoUtenti.xlsx -WorksheetName VpnUsers -ImportColumns @(1,2,3,4,5,6,7,8,9,10,11,12) -startrow 1 -endrow 15

$test2 = import-excel .\elencoUtenti.xlsx -WorksheetName VpnUsers


Visualizzo il contenuto delle variabili. Sembrerebbero degli arrays (vedo un simbolo @)

write-host $test

write-host $test2

Verifico il tipo esatto di variabile 

$test.gettype()

$test2.gettype()

$test.gettype() | fl

$test2.gettype() | fl


Verificare i tipi di elementi di una matrice

$test |get-member


Contare gli elementi dell'arrays

Se il risultato mi dice che ho 14 elementi, significa che l'array ha gli elementi da [0 a 13] valorizzati. L'elemento [14] non e' valorizzato

$test.count


Cosa contiene il primo elemento della matrice

$test[0]

Cosa contengono il primo ed il tredicesimo elemento

$test[0,12]


Ruotare i valori della matrice

Per utilizzare gli elementi, probabilmente dovro ruotarli, con un ciclo foreach o simile


$test = import-excel .\elencoUtenti.xlsx -WorksheetName VpnUsers

$test | ForEach-Object {"Item: [$PSItem]"}


foreach ( $node in $test ) {

"Item: [$node]"

}



Matrici di oggetti


Matrici oggetti

Le matrici possono anche contenere degli oggetti, come elementi.


Esempio

$data = @(

    [pscustomobject]@{FirstName='Kevin';LastName='Marquette'}

    [pscustomobject]@{FirstName='John'; LastName='Doe'}

)


Esempio

$processList = Get-Process


La caratteristica principale degli oggetti e che essi hanno delle proprieta

ESEMPIO


$temp[0]  - mi restituisce il contenuto del singolo elemento

$test[0].givenname - mi restisce il valore della colonna givenname per il primo record


Elencare il contenuto del campo Surname di tutti gli elementi dell'array

$test | ForEach-Object {$_.Surname}


In alcuni casi potrebbe essere necessario le proprieta estese

$test | Select-Object -ExpandProperty LastName


Filtrare il contenuto di un'array


Vengono restituiti tutti gli elementi con Marco nel givenname

$test | Where-Object {$_.givenname -eq 'Marco'}

$data | Where FirstName -eq Kevin


REFERENCE

https://docs.microsoft.com/it-it/powershell/scripting/learn/deep-dives/overview?view=powershell-7.2

https://docs.microsoft.com/it-it/powershell/scripting/learn/deep-dives/everything-about-arrays?view=powershell-7.2


Powershell - importexcel

Mi e' capitato di dover lavorare con il modulo powershell ImportExcel. Questi sono alcuni degli appunti che mi sono segnato. 

get-services | Export-excel -now

Crea il file 

get-services | Export-excel c:\temp\testdemo.xlsx

Crea il file e lo apre

get-services | Export-excel c:\temp\testdemo.xlsx -show

Crea il file e lo apre, impostando filtri sulle colonne ed autosize

get-services | Export-excel c:\temp\testdemo.xlsx -show -autosize -autofilter

Cancellare un file 

rm test.xlsx -ErrorAction Ignore

Usare la formattazione condizionale

$data = get-service | Select Status, Name, DisplayName, StartType

$data | Export-Excel test.xlsx -Show -Autosize

rm test.xlsx -ErrorAction Ignore

$text1 = New-ConditionalText stop

$data | Export-Excel test.xlsx -Show -Autosize -ConditionalText $text1

$text2 = New-ConditionalText runn Blue Cyan

rm test.xlsx -ErrorAction Ignore

$data | Export-Excel test.xlsx -Show -Autosize -ConditionalText $text1, $Text2

$text3 = New-ConditionalText svc Wheat Green

rm test.xlsx -ErrorAction Ignore

$data | Export-Excel test.xlsx -Show -Autosize -ConditionalText $Text1, $Text2, $$Text3

$data = get-process | Where Company | Select Company, Name, PM, Handles, *mem*

$cfmt = New-ConditionalFormattingIconSet -range "C:C" -ConditionalFormat ThreeIconSet - IconType Arrows

rm test.xlsx -ErrorAction Ignore

$data | Export-Excel test.xlsx -Show -Autosize -ConditionalFormat $cfmt

$ctext = New-ConditionalText Microsoft Wheat Green

rm test.xlsx -ErrorAction Ignore

$data | Export-Excel test.xlsx -Show -Autosize -ConditionalFormat $cfmt -ConditionalText $ctext

Importare i valori dal foglio di lavoro

import-excel .\elencoUtenti.xlsx -WorksheetName VpnUsers -ImportColumns @(1,2,3,4,5,6,7,8,9,10,11,12) -startrow 1 -endrow 15

DEMO

1 - Compilare un file  excel

ps excel -ErrorAction ignore | kill

$xl =  New-Object -ComObject excel.application

$xl.visible =  $True

$wb = $xl.workbooks.add()

$ws = $wb.worksheets["Sheet1"]

$ws.Cells[1,1].value = "ID"

$ws.Cells[1,2].value = "Product"

$ws.Cells[1,3].value = "Quantity"

$ws.Cells[1,4].value = "QPrice"

$ws.Cells[1,5].value = "Value"

$ws.Cells[2,1].value = 12001

$ws.Cells[2,2].value = "Nails"

$ws.Cells[2,3].value = 37

$ws.Cells[2,4].value = 3,99

$ws.Cells[2,5].formula = "=C2*D2"

$ws.Cells[3,1].value = 12002

$ws.Cells[3,2].value = "Hammer"

$ws.Cells[3,3].value = 5

$ws.Cells[3,4].value = 12,10

$ws.Cells[3,5].formula = "=C3*D3"

$ws.Cells[4,1].value = 12003

$ws.Cells[4,2].value = "Saw"

$ws.Cells[4,3].value = 12

$ws.Cells[4,4].value = 15,37

$ws.Cells[4,5].formula = "=C4*D4"

2 - creare un file excel con contenuto

#Hello World

"Hello World" | Export-Excel

3 - Creare una colonna con intestazione Data ed inserire hello world come primo valore

[PSCustomObject]@{Data="Hello World"} | Export-Excel

4 - chiudere il processo di excel e rimuovere eventuali file creati per test

ps excel -ErrorAction Ignore

rm '.\demo.xlsx' -ErrorAction Ignore

5 - esportare tutti i processi in excel

get-process |export-excel '.\demo.xlsx'

invoke-item .\demo.xlsx (si apre solo se excel e' installato)

6 - esportare solo alcune proprieta dei processi in excel

ps excel -ErrorAction Ignore

rm '.\demo.xlsx' -ErrorAction Ignore

get-process | select company, pm, handles | export-excel '.\demo.xlsx' -show

7 - importare dati da un csv ed esportarle in excel

ps excel -ErrorAction Ignore

rm '.\demo.xlsx' -ErrorAction Ignore

import-csv data.csv | Export-Excel test.xlsx -show -TableName Itemms -AutoSize

8 - importare dati da un file excel in una variabile per poi elaborarli

$UserA = import-excel .\elencoUtenti.xlsx -WorksheetName VpnUsers

9 - importare dati da un file excel, solo alcune colonne, in una variabile per poi elaborarli

$UserB = import-excel .\elencoUtenti.xlsx -WorksheetName VpnUsers -ImportColumns @(1,2,3,4,5,6,7,8,9,10,11,12) -startrow 1 -endrow 15