Etikettarkiv: Automatisering

Powershell: Avinstallera samtliga patchar på Windows Server

Att avinstallera en patch på en windows server är relativt enkelt via ’Add/Remove Programs’ men att avinstallera samtliga installerade windowspatchar kan vara en plåga.

Ett scenario som jag råkat ut för är att en servern strippats på samtliga oanvända roles and features (av mig ska tilläggas. 😉 ).
När man efter patchning ska lägga på en feature som ligger som ’Removed’ så kan det ibland skita sig.
Lösningen jag hittat är att avinstallera alla patchar, lägga till rollen och sen patcha upp systemet igen. Helt kasst, jag vet. 🙂

Nåja, för att att göra livet lite enklare har jag tagit fram nedanstående script för att avinstallera alla windowspatchar som installerats på en Windows Server. I mitt fall var det en Windows Server 2012.

Vi kommer använda oss av Powershell och WMI-objekt för att få fram en aktuell lista på installerade patchar och avinstallera dessa.

Från början i mitt fall fanns det ca 140 patchar installerade. Efter att ha avinstallerat dessa på en gång ville systemet inte riktigt vara med längre. Så, för att lösa det la jag in en batch på 30 patchar åt gången, sen omstart och så 30 till osv…

Nog snackat, här kommer scriptet. Håll till godo. 🙂

[CmdletBinding()]
Param()

# Script för avinstallation av samtliga windowspatchar på en windows server.
# Batch på 30 patchar åt gången, ändra $limit till önskat antal patchar / körning.
# Jag kör med /log på wusa.exe för att logga händelserna. Loggen lagras i samma mapp som scriptet körs från.
# Du kan därefter öpppna loggen i eventloggen.
# Scriptet är verifierat på Windows Server 2012 men bör fungera på övriga Windows-OS också.
# För att köra utan limit. Sätt $limit = -1

$limit = 30

# Ändra inget nedan.

$reachedLimit = 0

$GetPatches = Get-WmiObject Win32_QuickFixEngineering

# Gå igenom listan
foreach ($patch in $GetPatches){
    # Kör enbart upp till $limit
    if ($reachedLimit -ne $limit){
        $reachedLimit++

        # Rensa patchen på text så enbart KB-numret är kvar.
        $KB = $patch.HotfixId.Replace("KB", "")
        $DeletePatchCmd = "wusa.exe /uninstall /kb:$KB /quiet /log /norestart"
        Write-Verbose "Raderar patchen med följande kommando: $($DeletePatchCmd)"
        Invoke-Expression $DeletePatchCmd

        # Kör en loop för att invänta slutförd avinstallation innan nästa patch kan avinstalleras.
        while (@(Get-Process wusa -ErrorAction SilentlyContinue).Count -ne 0)
        {
            Start-Sleep 3
            Write-Verbose "Väntar på att patchen avinstalleras..."
        }
    }
}

Hyper-V – Automatisering av diskhantering

Spinner vidare på Drakfots guide om initiering, partionering samt formatering av disk på virtuell server.

Har skapat ett script som jobbat mot Hyper-V i Windows Server 2012 (ej R2).
Kommer anpassa scriptet för Hyper-V i 2012 R2 när jag hunnit få upp en sådan maskin.

Stora förändringen mellan Hyper-V i 2012 och 2012 R2 är att du kan utföra allt i drift. I 2012 behöver den virtuella servern stängas ner för att koppla disken osv.

Scriptet tar bara hänsyn till lokala diskar som finns kopplade på Hyper-V-servern.
Har inte lagt in så mycket felhantering utan mer fokuserat på att få upp funktionen.

Krav före exekvering:
1) En fungerande inloggningsmiljö
2) Kontot du exekverar koden med måste vara administratör på Hyper-V-servern samt den virtuella servern du vill installera disken på.
3) Namnet på den virtuella maskinen i Hyper-V måste vara samma som DNS-namnet för att Powershell remoting ska fungera.

Då kör vi. 🙂

# Skapat av Qraze, https://www.qraze.se
# Kommandon som exekveras på den virtuella maskinen är hämtat från http://sleepdontexist.com.
# Scriptnamn: Add_Disk_to_VM.ps1
# Skapat: 2013-12-28
# Exekveras på Hyper-V-servern.

# Hämtar samtliga lokala diskar på Hyper-V-servern. Har filtrerat ut C: och System Reserved då dessa inte ska användas till virtuella maskiner.
# Välj den disk du vill skapa VHDX-filen på.
$selectedPhysicalDisk = Get-Volume | where { $_.DriveLetter -ne "C" -and $_.FileSystemLabel -ne "System Reserved" } | select DriveLetter,@{Name=”Free Space (GB)”;Expression={“{0:N1}” -f($_.SizeRemaining/1gb)}} | Out-GridView -PassThru

# Placerar data från selectedPhysicalDisk i separata variabler för enklare hantering.
$PhysicalDriveLetter = "$($selectedPhysicalDisk.DriveLetter):"
$PhysicalDiskFreeSpace = $selectedPhysicalDisk.'Free Space (GB)'

if (!(Test-Path "$($PhysicalDriveLetter)AutoDisk")){
    New-Item -ItemType Directory -Name AutoDisk -Path $PhysicalDriveLetter
}

# Hämtar samtliga virtuella maskiner.
# Välj den maskin du vill koppla den nya disken till.
$selectedVirtualMachine = Get-VM | Out-GridView -PassThru
$VmName = $selectedVirtualMachine.Name

# Hämtar antal filer för löpnummer
[int]$count = (Get-ChildItem "$($PhysicalDriveLetter)AutoDisk").count
$count++
$count.ToString()
$VHDName = "$($VMname)_disk$($count).vhdx"
$VHDFullPath = "$($PhysicalDriveLetter)AutoDisk$($VHDName)"

# Ange önskad diskstorlek
[int]$diskSize = Read-Host "Ange önskad diskstorlek i GB (Max $($PhysicalDiskFreeSpace)GB) (Ex: 40)"
$diskSizeBytes = $diskSize * 1073741824
New-VHD -Dynamic -Path "$($PhysicalDriveLetter)AutoDisk$($VHDName)" -SizeBytes $diskSizeBytes

# Kontrollerar om den virtuella maskinen är igång, i så fall stängs den av nu.
$VmState = (Get-Vm -Name $VmName).State
if ($VmState -eq "Running"){
    $state = "Running"
    Stop-Computer -ComputerName $VmName -Force
    While ($state -eq "Running"){
        Write-Host "Väntar på att den virtuella maskinen stängs ner."
        $VmState = (Get-Vm -Name $VmName).State
        if ($VmState -eq "Running"){
            Start-Sleep -Seconds 5
        }
        else{
            $state = "Stopped"
            Write-Host "Maskinen har stoppats."
        }
    }
}

Write-Host "Lägger till disken på den virtuella maskinen."
# Kopplar den nya disken till den virtuella maskinen på IDE-port.
ADD-VMHardDiskDrive -VMName $VmName -Path $VHDFullPath

# Startar den virtuella maskinen
Write-Host "Startar den virtuella maskinen"
Start-VM -VMName $VmName

# Väntar 30 sekunder på att maskinen startar och svarar på ping.
Write-Host "Väntar 30 sekunder på att den virtuella maskinen svarar på ping"
Start-sleep -Seconds 30
if (Test-Connection -ComputerName $VmName){
    Write-Host "Maskinen svarar på ping. Exekverar kod remote på maskinen"
    # Kör Powershell remote på den virtuella maskinen för att aktivera den nya disken och formatera den samt generera en ledig enhetsbokstav.
    Invoke-Command -ComputerName $VmName -ScriptBlock {
        # Detta körs inne på den virtuella maskinen.
        Get-Disk | where { $_.PartitionStyle -eq "RAW" } | Initialize-Disk -PartitionStyle GPT -PassThru | New-Partition -AssignDriveLetter -UseMaximumSize | Format-Volume -Confirm:$False
    }
}

Guide: Installera och konfigurera en Linuxserver (Redhat) på EC2

För att underlätta för er som vill testa Amazons tjänst EC2 (virtuell server) så kommer här en enkel guide där vi börjar med att beställa servern i webbgränssnittet med allt vad det innebär och sen går vi vidare till inloggning via SSH med Putty och privat nyckel.

Denna guide utgår från att du registrerat dig på http://aws.amazon.com/ec2/.

Steg 1) Logga in i webbgränsnittet.
01_Login

Steg 2) Välj tjänst, EC2
02_valj_EC2

Steg 3) Välj site
(Detta är ett väldigt viktigt val, default är nämligen US-west vilket för oss i Sverige innebär långa svarstider. Mitt förslag är att man väljer Irland.)
03_valj_site

Steg 4) Beställ server (Launch Instance)
04_launch_instance

Steg 5) Serverkonfiguration

Steg 5.1) Välj operativsystem
05_select_os

Steg 5.2) Utökad konfiguration
06_instance_type

Steg 5.3) Antal instanser/servrar (Lämna allt default)07_instance_type_02

Steg 5.4) Skapa disk (30GB ingår utan kostnad, default är 6GB)
08_valj_disk

Steg 5.5) Namnge servern (Jag har valt testserver01)
09_namnge_server

Steg 5.6) Säkerhetskonfiguration
(Det är rekommenderat att bara tillåta SSH-anslutning från din publika ipadress men kan vara bökigt om man har dynamiskt IP så vi låter här default vara ok, dvs alla kan ansluta mot SSH.)
010_security

Steg 5.7) Sammanfattning (Klicka på Launch)
011_review

Steg 5.8) Skapa nytt nyckelpar. (Används för att autentisera sig mot servern via SSH)012_keys

När du klickat på Launch Instances skapas din server upp och startas. Du blir tilldelad en publik ipadress och kan därefter ansluta med ex. Putty till servern.

Steg 5.9) Visa dina servrar (View Instances)
013_view_instances

013_view_instances_02

Under Public IP ser du den publika ipadress du fått tilldelad till servern.

Grattis! Din server är nu installerad och tillgänglig via SSH (Port 22).
Det som återstår är att ansluta sig till servern för att kunna installera de applikationer man vill ha osv. Jag guidar er igenom hur detta görs med Putty.

Steg 6) Ladda ner Putty och PuttyGen
Gå till http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html
Ladda ner putty.exe och PuttyGen.exe som du ser i bilden nedan.
014_putty_download

Steg 7) Konvertera nyckelparen från .pem till .ppk (Kan läsas av Putty)

Starta puttyGen.exe och välj Load -> Välj .pem-filen du laddade ner när du skapade servern.
Därefter klickar du på ’Save Private key’
015_puttygen

Svara ja på nedanstående fråga och spara filen.
016_putty_warning

Nu är du redo att konfigurera Putty och ansluta till servern.

Steg 8) Starta Putty och konfigurera den.

Du hamnar direkt i Session-fliken. Fyll i din servers publika ipadress och port.
017_putty_konfiguration

Gå till SSH -> Auth -> Browse -> Välj din .ppk-fil du genererade från PuttyGen.exe

Nu är du redo att ansluta. Default hos Amazon (EC2) ska du logga in med ec2-user och inte root.

Klicka på Open i Putty.
018_putty_open

Svara ja på säkerhetsvarningen
019_putty_sec_alert

Logga in med ec2-user
020_pytty_ec2_user

Grattis! Du är nu inloggad och denna guide är avslutad.
021_putty_logged_in


Håll till godo och lycka till! 🙂