Etikettarkiv: Powershell

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
    }
}

Lync 2013 – Installera upp en Lync Trusted Application Server

Detta är steg ett i en serie om att skapa en Lyncbot.

OBS! Denna guide bygger på att du har en fungerande Lyncmiljö uppe.

För att få upp en trusted application server för Lync 2013 behöver ett antal steg utföras.
1) Installera upp en tom Windows Server 2012 R2
2) Anslut servern till Active Directory

Därefter börjar vi anpassa servern för Lync.

1) Lägg på rollen Windows Identity Foundation 3.5
WIF_35

2) Kör Setup.exe från Lync Server 2013 (DVD/ISO)
setup_exe_1

Vi kör ”Install local configuration store”. Kräver ingen manuella inställningar utan sker automatiskt.
setup_exe_step_1_2

Steg 3 handlar om certifikat.
Klicka på Run, markera default certificate och klicka på Assign.
setup_exe_cert_assign

Därefter startar du Lync Management Shell från startmenyn (Powershell).
Kontot du kör som måste ha behörighet i Lync.
lync_management_shell

Dags att slå på replikering mellan denna servern och front-end-servern för Lync 2013.
Det kör man genom att exekvera Enable-CsReplica. Starta därefter om servern.
lync_management_shell_enable_replica

Efter omstarten startar du åter Lync Management Shell och exekverar följande powershell-kommando.
Invoke-CsManagementStoreReplication
lync_management_shell_invoke

Vänta därefter några sekunder och exekvera sedan följande powershell-kommando.
Get-CsManagementStoreReplicationStatus
lync_management_shell_get_replicastatus

När UpToDate är True på samtliga servrar bör du se följande på Front-end-servern i ”Microsoft Lync Server 2013 Control  Panel” -> ”Topology” -> ”Replication”
lync_control_panel_topology

När detta är gjort har du en fungerande Trusted Application Server mot Lync 2013.

Använda Powershell och Lync 2013 SDK för att skriva till Lync 2013 Persistent Chat

Kunde inte låta bli att labba lite med Powershell mot Lync 2013 SDK.
Det krävs ett antal saker installerade på din dator för att få detta att rulla, sen är det bara en enda DLL du behöver läsa in i Powershell. (Du kan även registrera DLL:en manuellt med regsvr32.exe)

Installationerna du behöver göra.
1) Visual Studio 2010 SP1 (Går alldeles utmärkt med Express-versionen)
2) Installera Lync 2013 SDK

DLL-komponenten du behöver är: Microsoft.Lync.Model.DLL

Åh så äntligen scriptet då. Scriptet hanterar alla chatrum som man ”följer”.

# Script för att skriva text till en Lync 2013 Persistent Chat.

# Ladda in DLL för Lync 2013 SDK
$DLL = “C:\Program Files\Microsoft Office\Office15\LyncSDK\Assemblies\Desktop\Microsoft.Lync.Model.DLL”

# Importera DLL:en i sessionen
Import-module $DLL

# Valt rum
$roomName = "Rum"

# Textmeddelande
$textMessage = "Valfri text att skicka till chatten"

# Läser in startad klient
$client = [Microsoft.Lync.Model.LyncClient]::GetClient()

# Läser in alla chattrum användaren följer
$rooms = $client.RoomManager.FollowedRooms

# Sätter meddelandetyp till Regular (sträng)
$MessageType = [Microsoft.Lync.Model.Room.RoomMessageType]::Regular
# Läser igenom alla chattrum
foreach ($room in $rooms){
    # Hämtar properties från varje chattrum.
    $properties = $room.Properties

    # Hämtar och filtrerar properties på Key
    foreach ($property in $properties){
        # Letar upp valt chattrum och publicerar meddelandet.
        if ($property.Key -eq "Title" -and $property.Value -eq $roomName){
            #Skickar meddelandet
            $room.BeginSendMessage($textmessage, $MessageType, $null, $null)
        }
    }
}

När du testat färdigt kan det vara bra att rensa chattrummet på skräpmeddelanden.

Clear-CsPersistentChatRoom -Identity $roomName -EndDate (Get-date) -Confirm:$False