Archivi categoria: Powershell

Azure: come creare una VM personalizzata e distribuirla

Guida passo su come utilizzare Sysprep per creare immagini personalizzate su Azure e deployarle sia utilizzando il tool sysprep dal sistema operativo sia utilizzando i comandi Powershell.

Requisiti

  1. Crea una VM di base: Inizia creando una VM di base con il sistema operativo Windows desiderato installato. Questa VM sarà la base per le tue distribuzioni future.
  2. Personalizza la VM: Configura la VM di base in base alle tue esigenze specifiche, installa le applicazioni necessarie e apporta le personalizzazioni richieste.
  3. Aggiorna il sistema operativo: Assicurati di avere tutte le patch e gli aggiornamenti di sicurezza più recenti installati sulla VM di base.
  4. Esegui Sysprep: Una volta che la VM di base è configurata e aggiornata, puoi eseguire Sysprep per prepararla per la distribuzione.

Creazione dell’immagine personalizzata

Dal sistema operativo (utilizzando Sysprep)

  1. Apri il prompt dei comandi: Apri il prompt dei comandi come amministratore.
  2. Esegui Sysprep: C:\Windows\System32\sysprep\sysprep.exe
  3. Configura le opzioni Sysprep: Nella finestra di dialogo Sysprep, seleziona le seguenti opzioni:
    • Ora (shutdown): Imposta l’opzione su “Spegni” per spegnere la VM dopo il completamento di Sysprep.
    • Generaleize: Assicurati che questa opzione sia selezionata per preparare la VM per l’uso su altre macchine.
  4. Avvia Sysprep: Fare clic su “OK” per avviare il processo Sysprep. Questo processo può richiedere alcuni minuti e la VM verrà quindi arrestata.

Da Powershell

Stop-AzVM -ResourceGroupName "Nome-Gruppo-Risorse" -Name "Nome-VM" -Force
Set-AzVM -ResourceGroupName "Nome-Gruppo-Risorse" -Name "Nome-VM" -Generalized

Creare un’immagine personalizzata su Azure

Dal portale Azure

  1. Accedi al portale di Azure: Accedi al portale di Azure.
  2. Crea una immagine personalizzata: Naviga al servizio “Immagini personalizzate” nel portale di Azure e fai clic su “Aggiungi”.
  3. Configura l’immagine: Compila i dettagli dell’immagine personalizzata.
  4. Seleziona la VM di base: Nella sezione “Origine” dell’immagine personalizzata, seleziona la VM di base dalla quale hai eseguito Sysprep.
  5. Crea l’immagine: Fai clic su “Crea” per avviare il processo di creazione dell’immagine personalizzata. Azure creerà un’immagine basata sulla VM di base con le personalizzazioni apportate durante la configurazione.

Da Powershell

$vm = Get-AzVM -ResourceGroupName "Nome-Gruppo-Risorse" -Name "Nome-VM"
$imageConfig = New-AzImageConfig -Location "Nome-Regione"
$imageConfig = Set-AzImageOsDisk -Image $imageConfig -OsType Windows -OsState Generalized -SnapshotId $vm.StorageProfile.OsDisk.Snapshot.Id
New-AzImage -Image $imageConfig -ResourceGroupName "Nome-Gruppo-Risorse" -ImageName "Nome-Immagine" -Description "Descrizione-Immagine"

Distribuzione di VM personalizzate

Dal portale Azure

  1. Seleziona l’immagine personalizzata: Naviga tra le risorse disponibili e seleziona l’immagine di VM personalizzata che hai creato.
  2. Configura la VM: Segui il processo guidato per configurare la nuova VM utilizzando l’immagine personalizzata.
  3. Avvia la VM: Una volta completata la configurazione, avvia la nuova VM. Sarà basata sull’immagine personalizzata che hai creato su Azure.

Da Powershell

  1. Creazione di una VM da un’immagine personalizzata
    New-AzVm -ResourceGroupName "Nome-Gruppo-Risorse" -Name "Nome-Nuova-VM" -ImageName "Nome-Immagine" -Location "Nome-Regione" -AdminUsername "Nome-Admin" -AdminPassword "Password-Admin"
  2. Avvio della VM
    Start-AzVM -ResourceGroupName "Nome-Gruppo-Risorse" -Name "Nome-Nuova-VM"

Powershell: script autenticazione su Azure CSP con scelta customer e subscription

Lo script sotto esegue l’autenticazioni su sottoscrizioni Azure di tipo CSP e la selezione della sottoscrizione da utilizzare tramite due menù di scelta.

<#
Requirement:
Powershell 5.1
Module: 
- Partner Center
- Az
#>

Import-Module PartnerCenter

Connect-PartnerCenter  
# Select customer
$customer = Get-PartnerCustomer | Out-GridView -Title "Select the partner and click OK" -PassThru

Login-Azaccount -TenantId $customer.CustomerId

# Select subscription
$Subscription = Get-AzSubscription | Out-GridView -Title "Select the Subscription and click OK" -PassThru
Select-AzSubscription -SubscriptionId $Subscription.Id -TenantId $Subscription.TenantId

Volendo, è possibile memorizzare le credenziali per evitare che vengano richieste due volte tramite il cmdlet “get-credential”. Nel momento in cui sto scrivendo, parrebbe che il comando “connect-partnercenter” generi un errore nel passaggio delle variabili (nonostante il fatto che l’autenticazione si concluda comunque con successo).

Disclaimer: nessuna garanzia è fornita con questo script. Lo scrivente non è responsabile di qualunque danno possa eventualmente derivarne – lo utilizzate a vostro rischio.

Enterprise Vault: could not load file or assembly kvs.enterprisevault.interop.evpstapi

Scenario.
Server con installata la console di Enterprise Vault.
Script per l’esportazione degli archivi in PST (requisito: da avviare in Poweshell 23 bit)
Verifica se il modulo è di Etnerprise Vault è installato
if (!(Get-Module "enterprisevault")) {import-module enterprisevault}
$exportTOpst = import-csv "C:\temp\test.csv" -Delimiter ";"
foreach ($archive in $exportTOpst){
Write-Host -ForegroundColor Magenta "Dearchiviazione dell'archivio "$archive.ArchiveName
Export-EVArchive -ArchiveId $archive.archiveID -Format PST -OutputDirectory D:\Temp -MaxPSTSizeMB 51200
}

Problema
Durante l’esecuzione dello script, viene generato l’errore “could not load file or assembly kvs.enterprisevault.interop.evpstapi”

Soluzione
Copiare nella directory di installazione di Enterprice Valut (p.e. C:\Program Files (x86)\Enterprise Vault) il file KVS.EnterpriseVault.Interop.EVPstApi.dll (presente nel server EV) e riavviare i servizi di EV

Powershell: script per configurare la scheda di rete in DHCP o con IP statico

Script per configurare la scheda di rete in DHCP o con IP statico. Permette di scegliere quale scheda di rete configurare.

function show-menu-DHCP-or-static
{
    cls
    Write-Host "Press '1' DHCP"
    Write-Host "Press '2' Static"
}

function DHCP {
    $IPtype = "IPv4"
    $interface = $adapter | Get-NetIPInterface -AddressFamily $IPtype

    If ($interface.Dhcp -eq "Disabled") {
        # Remove existing gateway
        Write-Host "Removing existing gateway"
        If (($interface | Get-NetIPConfiguration).Ipv4DefaultGateway) {
            $interface | Remove-NetRoute -Confirm:$false
        }

        # Enable DHCP
        Write-Host "Enabling DHCP on interface"
        $interface | Set-NetIPInterface -DHCP Enabled

        # Configure the  DNS Servers automatically
        Write-Host "Enabling automatic DNS"
        $interface | Set-DnsClientServerAddress -ResetServerAddresses
    }
}

function Static-IP {
    #Variable
    $IP = Read-Host "IP Address"
    $CIDR = Read-Host "CIDR"
    $GW = Read-Host "Gateway"
    $DNS = Read-Host "DNS"
    $IPtype = "IPv4"

        # Remove any existing IP, gateway from our ipv4 adapter
    If (($adapter | Get-NetIPConfiguration).IPv4Address.IPAddress) {
        Write-Host "Removing existing IP"
        $adapter | Remove-NetIPAddress -AddressFamily $IPType -Confirm:$false
    }

    If (($adapter | Get-NetIPConfiguration).Ipv4DefaultGateway) {
        Write-Host "Removing existing gateway"
        $adapter | Remove-NetRoute -AddressFamily $IPType -Confirm:$false
    }

    # Configure the IP address and default gateway
    Write-Host "Configuring new IP"

    $adapter | New-NetIPAddress -AddressFamily $IPType -IPAddress $IP -PrefixLength $CIDR -DefaultGateway $GW

    # Configure the DNS client server IP addresses
    Write-Host "Configuring new gateway"
    $adapter | Set-DnsClientServerAddress -ServerAddresses $DNS
}

#Selection NIC
$nic = Get-NetAdapter | select name

For ($i = 0; $i -lt $nic.Length; $i++){
    $str = ($i + 1).ToString();
    $str = $str + " - ";
    $str = $str + $nic[$i].name;
    Write-Host($str);
}

$response = Read-Host "Type the network number";

$SelectedNic = $nic[$response-1].name;

$adapter = Get-NetAdapter | Where-Object {$_.Name -eq $SelectedNic}
###

#DHCP or Static
show-menu-DHCP-or-static
$Input = Read-Host "Please make a selection"
switch ($input) {
    '1' {
        $Type = 'DHCP'
        DHCP
    }
    '2' {
        $Type = 'Static'
        Static-IP
    }
}

Disclaimer: nessuna garanzia è fornita con questo script. Lo scrivente non è responsabile di qualunque danno possa eventualmente derivarne – lo utilizzate a vostro rischio.

Powershell: importare record DNS da file CSV

Script per importare record A e Cname nel DNS da un file CSV

Esempio di file CSV:
HostName,RecordType,IPAddress
server01,a,192.168.1.1
Service01,cname,server4.mydomain.com

Script

<# CSV example
HostName,RecordType,IPAddress
server01,a,192.168.1.1
Service01,cname,server4.mydomain.com
#>

$CSV = Read-Host "CSV to import:"
$Zone = Read-Host "Zone Name:"
Import-CSV $CSV |
%{
if ($_.RecordType -eq "a") {Add-DnsServerResourceRecordA -Name $_.HostName -ZoneName $zone -IPv4Address $_.IPAddress} 
elseif ($_.RecordType -eq "cname")  {Add-DnsServerResourceRecordCName -Name $_.HostName -ZoneName $zone -HostNameAlias $_.IPAddress}
}

 

Powershell Export And Import Relying Party Trust Claim Rules

Script per esportare, esportare ed importare o importare soltanto le claim AD FS.

 

Add-PSSnapin "Microsoft.ADFS.PowerShell" -ErrorAction SilentlyContinue
$select = Write-Host "Select operation:  (1)Export; (2) Export and Import; (3) Import "
$XMLFilePath = "RPTClaim.xml"

function show-menu 
{
    cls
    Write-Host "==========Export Import AD FS Claim=========="
    Write-Host "Press '1' for Export"
    Write-Host "Press '2' for Export and Import"
    Write-Host "Press '3' for Import"
}

function export
{
    $SourceRelyingPartyTrust = Read-Host "Source Relying Party Trust" #Display Name of Source Relying Party Trust
    Get-ADFSRelyingPartyTrust -Name $SourceRelyingPartyTrust | Export-Clixml $XMLFilePath
    Write-Host "Relying Party Trust Claim Rules Exported"
}

function import{
    $TargetRelyingPartyTrust = Read-Host "Target Relying Party Trust" #Display Name of Target Relying Party Trust
    Import-Clixml $XMLFilePath | foreach-object {Set-ADFSRelyingPartyTrust -TargetName $TargetRelyingPartyTrust -IssuanceTransformRules $_.IssuanceTransformRules}
    Write-Host "Relying Party Trust Claim Rules Imported"
}

function export-import
{
export
import
}


show-menu
$input = Read-Host "Please make a selection "
switch ($input)
{
    '1' 
    {
        cls
        export
    }
    '2'
    {
        cls
        export-import
    }
    '3'
    {
        cls
        import
    }
}

 

Disclaimer: nessuna garanzia è fornita con questo script. Lo scrivente non è responsabile di qualunque danno possa eventualmente derivarne – lo utilizzate a vostro rischio.

Powershell: ottenere tutti i Domain Controller della foresta

Il seguente comando fornisce:

  • Lista di tutti i Domain Controller configurati nella foresta
  • Foresta e dominio di appartenenza
  • Indirizzo IP
  • Site
(Get-ADForest).Domains | % { Get-ADDomainController -Discover -DomainName  $_ } | % { Get-ADDomainController -server $_.Name -filter * } | Select Name, Domain, Forest, IPv4Address, Site | ft

Eseguire le Microsoft Management Console (MMC) con Runas

Si ha l’esigenza, molte volte, di dover aprire le MMC (ad esempio i tools per la gestione di Active Directory) con credenziali differenti rispetto al dominio di appartenenza. Occorre quindi utilizzare il comando Runas con lo switch netonly.

Il comando, per esempio, per eseguire la MMC di Active Directory Users and Computers è:

runas.exe /netonly /user:user@domain.local "mmc %SystemRoot%\system32\dsa.msc /domain=domain.local /server:server"

Ho configurato uno script in Powershell con le MMC di Active Directory Management Tools:

function Show-Menu
{
     param (
           [string]$Title = 'Runas_MMC.ps1'
     )
     cls
     Write-Host "================ $Title ================"
     
     Write-Host "1: Press '1' for Active Directory Users and Computers."
     Write-Host "2: Press '2' for Active Directory Sites and Services."
     Write-Host "3: Press '3' for Active Directory Domain and Trusts."
     Write-Host "4: Press '4' for ADSI Edit."
     Write-Host "Q: Press 'Q' to quit."
}

do
{
     Show-Menu
     $input = Read-Host "Please make a selection"
     $server = Read-Host "Server"
     $user = Read-Host "Domain\User"
     switch ($input)
     {
           '1' {
                cls
                runas.exe /netonly /user:"$user" "mmc c:\windows\system32\dsa.msc /server=$server"
           } 
           '2' {
                cls
                runas.exe /netonly /user:"$user" "mmc c:\windows\system32\dssite.msc /server=$server"
           } 
           '3' {
                cls
                runas.exe /netonly /user:"$user" "mmc c:\windows\system32\domain.msc /server=$server"
           } 
           '4' {
                cls
                runas.exe /netonly /user:"$user" "mmc c:\windows\system32\adsiedit.msc /server=$server"
           }
           'Q' {
                return
           }
     }
     pause
}
until ($input -eq 'q')

Esecuzione dello script

E’ possibile modificare lo script aggiungendo o eliminando le varie console.

Disclaimer: Nessuna garanzia è fornita con questo script. Lo scrivente non è responsabile di qualunque danno possa eventualmente derivarne – lo utilizzate a vostro rischio.

Powershell – recuperare informazioni dischi

Piccolo script per recuperare le seguenti informazioni sui dischi:

  • Nome
  • Etichetta
  • Allocation Unit Size
  • Dimensionamento
  • Spazio libero

 

Get-CimInstance -ClassName Win32_Volume | Select-Object Name, Label, BlockSize, @{n='Size (Gb)' ;e={"{0:n2}" -f ($_.capacity/1gb)}},@{n='FreeSpace (Gb)';e={"{0:n2}" -f ($_.freespace/1gb)}} | ft -AutoSize

L’output sarà similare a questo:

Creare lista delle VM configurate in Azure Resource Manager con Powershell

Il seguente script esporta in un file CSV la lista e le configurazioni delle VM configurate in Azure Resource Manager.

Configurazioni esportate:

  • Nome macchina
  • Resource Group
  • Utenza amministratrice locale
  • Indirizzo IP
  • Informazioni dischi
$vms = get-azurermvm
$nics = get-azurermnetworkinterface | where VirtualMachine -NE $null 
$VMArray = @()

foreach($nic in $nics)
    {
        $vm = $vms | where-object -Property Id -EQ $nic.VirtualMachine.id
        $IPprv =  $nic.IpConfigurations | select-object -ExpandProperty PrivateIpAddress
        $AlMeth =  $nic.IpConfigurations | select-object -ExpandProperty PrivateIpAllocationMethod
        
        $VMArray += New-Object PSObject -Property @{`
        Name = $vm.Name;
        ResourceGroup = $vm.ResourceGroupName;
        AdminUserName = $vm.AdminUsername;
        PrivateIPAddress = $IPprv ;
        IPAllocation = $AlMeth;
        Location = $vm.Location;
        Size = $vm.HardwareProfile.VmSize;
        ImageSKU = $vm.StorageProfile.ImageReference.Sku;
        OSType = $vm.StorageProfile.OsDisk.OsType;
        DataDiskCount = $vm.StorageProfile.DataDisks.Count;
        DataDisks = $vm.StorageProfile.DataDisks;
        }
    

}
$VMArray | export-csv "AzureRMInventory.csv"

Disclaimer: Nessuna garanzia è fornita con questo script. Lo scrivente non è responsabile di qualunque danno possa eventualmente derivarne – lo utilizzate a vostro rischio.