Dateiserver in Azure per WebDAV via PowerShell bereitstellen


Mein amerikanischer Kollege Brian Lewis hat in einem schon älteren Blog-Post beschrieben, wie man einen WebDAV-Server in Microsoft Azure einrichtet, um diesen dann als Netzlaufwerk in Windows einzubinden.

Ist das ganze auch automatisierbar, wurde ich letztens gefragt. Ja, absolut! Statt all die Schritte manuell durchzugehen, habe ich dafür ein Skript erstellt, das die Einrichtung automatisiert.

Für die Automatisierung nutze ich die Erweiterung Custom Scripts der Azure Extensions. Aus dem Grund verwenden wir auch zwei Skripte. Ein Skript, das direkt auf dem Server ausgeführt wird und ein Skript, welches die VM erstellt und das erste Skript bereitstellt. Der Vorteil dieses Ansatzes ist es, dass Installationen und Konfigurationen während der Erstellung der VM durchgeführt werden können.

Einen Überblick über Technologien, die für die automatisierte Konfiguration von Azure-VMs eingesetzt werden können, kann man auch in meinem Kurs in der Microsoft Virtual Academy ansehen: Automatisierte Konfiguration in Azure im Überblick.

Achtung: die Verbindung ist in diesem Beispiel noch nicht verschlüsselt. Das sollte man unbedingt noch einbauen! Allerdings habe ich dies aus Zeitgründen im heutigen Beispiel noch nicht getan.

Die folgenden beiden Skripte sind für die Automatisierung notwendig.

Enable-WebDAV.ps1 installiert die Internet Information Services (IIS) inkl. der WebDAV-Dienste, der Windows-Authentifizierung und der Management Tools auf dem Windows Server. Das geschieht durch folgende Zeile:

Install-WindowsFeature -Name Web-Server, Web-DAV-Publishing, Web-Windows-Auth, Web-Mgmt-Tools

Hierbei brauchen wir auch nicht prüfen, ob diese Windows-Features bereits installiert sind. Sind die Features bereits installiert, gibt es keine Fehlermeldung.

Als nächstes ändere ich die Konfiguration für die Default Web Site: die anonyme Authentifizierung wird abgeschaltet und die Windows-Authentifizierung eingeschaltet.

Set-WebConfigurationProperty -Filter system.webServer/security/authentication/anonymousAuthentication -PSPath "IIS:\Sites" -Location "Default Web Site" -Name Enabled -Value False
Set-WebConfigurationProperty -Filter system.webServer/security/authentication/windowsAuthentication -PSPath "IIS:\Sites" -Location "Default Web Site" -Name Enabled -Value True

Hier war es wichtig, die Default Web Site nicht in den Pfad (PSPath) zu integrieren. Wann immer ich das gemacht habe, gab es eine Fehlermeldung, dass die entsprechende Einstellung nicht verändert werden kann.

Schließlich muss WebDAV für die Default Web Site noch aktiviert werden und eine Autorenregel erstellt werden. Das Einschalten passiert über folgende Skript-Zeile:

Set-WebConfigurationProperty -Filter system.webServer/webdav/authoring -PSPath "MACHINE/WEBROOT/APPHOST" -Location "Default Web Site" -Name Enabled -Value True

Die Regel wird als Hashtable erstellt und dann der Collection authoringRules hinzugefügt.

$newRule = @{
    users="*"
    path="*"
    access="Read, Write, Source"
}

Add-WebConfiguration -Filter system.webServer/webdav/authoringRules -PSPath "MACHINE/WEBROOT/APPHOST" -Location "Default Web Site" -Value $newRule

Es wäre auch möglich, das PowerShell-Skript Enable-WebDAV.ps1 direkt auf dem Server auszuführen, ohne das zweite Skript Create-WebDavVm.ps1 zu verwenden.

Create-WebDavVm.ps1 ist für die komplette Automatisierung des Beispiels zuständig. Das Skript erstellt ein neues Speicherkonto, lädt das Skript Enable-WebDAV.ps1 hoch und erstellt eine neue VM, der für die Provisionierung das erste Skript mitgeteilt wird.

In diesem Skript gibt es etliche Einstellungen, die geändert werden können, aber nicht alle müssen geändert werden. Aus dem Grund habe die Einstellungen in die Bereiche “Must change”, “Can change” und “No need to change” unterteilt. Im Bereich “Must change” muss der Name des eigenen Azure-Abonnements, der gewünschte (und eindeutige) Cloud-Dienst-Name und der Pfad zum Skript Enable-WebDAV.ps1 angegeben werden. Die weiteren Einstellungen sollten selbsterklärend sein. Falls nicht, empfehle ich noch einmal einen Blick in meinen Blog-Post Grundlagen: Azure & PowerShell: VMs erstellen.

Interessant wird es ab Zeile 51, die das Skript Enable-WebDAV.ps1 in unser Speicherkonto in Azure hochlädt.

Set-AzureStorageBlobContent -Container customscripts -File $scriptFile.FullName -Force

Danach folgt die Erstellung der Konfiguration unserer neuen VM. Die Verwendung der PowerShell-Befehle New-AzureVMConfig, Add-AzureProvisioningConfig und New-AzureVM sind hierbei Standard. Falls hier etwas unklar sein sollte, habe ich die entsprechenden Themen noch einmal unten im Bereich “Weiterführende Informationen” aufgelistet.

Für unser Beispiel fügen wir anschließend zwei öffentliche Endpunkte der VM hinzu. Einmal für Port 80 (HTTP) und einmal für den Port 443 (HTTPS). Wie eingangs erwähnt, wird in diesem Beispiel noch keine verschlüsselte Verbindung verwendet. Hier bereite ich zwar auch den Port 443 vor, allerdings wird er hier noch nicht genutzt.

Danach kommt der PowerShell-Befehl Set-AzureVMCustomScriptExtension zum Einsatz, womit wir der VM mitteilen, welches Skript während der Erstellung der VM ausgeführt werden soll. Hier wird über den Parameter ContainerName der Name des Containers angegeben, in dem unser Skript liegt und mit Parameter FileName, welche Datei auf den Windows Server heruntergeladen werden soll. Die Angabe des Parameters Run hätte ich bei nur einer Skript-Datei auch weglassen können, aber so ist es vollständig.

New-AzureVMConfig -ImageName $imageName -InstanceSize $instanceSize -Name $vmName |
    Add-AzureProvisioningConfig -Windows -AdminUsername $adminUsername -Password $adminPassword |
    Add-AzureEndpoint -LocalPort 80 -Name HTTP -Protocol tcp -PublicPort 80 |
    Add-AzureEndpoint -LocalPort 443 -Name HTTPS -Protocol tcp |
    Set-AzureVMCustomScriptExtension -ContainerName customscripts -FileName $scriptFile.Name -Run $scriptFile.Name |

    New-AzureVM -ServiceName $serviceName -Location $location

Weiterführende Informationen

Grundlagen: Azure & PowerShell: VMs erstellen

Grundlagen: Speicherkonten in Azure per PowerShell erstellen

Grundlagen: VMs in Azure per PowerShell provisionieren

Tipp: VM-Vorlagen in Azure per PowerShell auflisten und filtern

PowerShell: Azure-Automatisierung für Einsteiger (Microsoft Virtual Academy)

Automatisierte Konfiguration in Azure im Überblick (Microsoft Virtual Academy)

Skripte

Für den Fall, dass die eingebetteten Skripte auf GitHub Gist nicht aufrufbar sind, sind diese hier noch einmal unformatiert aufgeführt. (Es kann durch das Layout der Blog-Webseite sein, dass die Code-Zeilen abgeschnitten sind. Dann bitte einfach im Quelltext der Seite nachschauen.)

Create-WebDavVm.ps1

# Warning: This script is only for demo purposes.
#          The connection to the WebDAV server is not secured.
#          Content and user credentials are transmitted unencrypted.

# Before using this script, you need the PowerShell commandlets installed, have already an Azure 
# subscription imported and the first three settings in this file changed. (See region Settings.)
# How to do this, you can read here (in German): 
#     http://blogs.msdn.com/b/pkirchner/archive/2015/01/13/grundlagen-powershell-f-252-r-microsoft-azure-installieren.aspx
#     http://blogs.msdn.com/b/pkirchner/archive/2015/01/19/grundlagen-azure-amp-powershell-verwaltungszertifikate-installieren.aspx

#region Settings - enter your settings here

# Must change:
# Your subscription name.
$subscriptionName = "MSFT MVA Stage"
# Change this service name to a unique name. If the name is not unique, creation will fail.
$serviceName = "webdavservertest54191"
# Change the path to the Enable-WebDAV.ps1 file. Should be the folder where you unpacked the current file.
$scriptFile = New-Object System.IO.FileInfo ("C:\Users\pkirch\OneDrive @ Microsoft\FY15\Content\2014-11-28 New Era Day 3\Enable-WebDAV.ps1")

# Can change:
$adminUsername = "adm_demo"
$adminPassword = "Azureisttoll!"
$storageAccountName = $serviceName
$vmName = "webdavserver"
$instanceSize = "Small" # Get-AzureRoleSize

# No need to change:
$imageFamily = "Windows Server 2012 R2 Datacenter"
$location = "West Europe" # Get-AzureLocation

#endregion

# In case you have more than one Azure subscription, select one.
Select-AzureSubscription -SubscriptionName $subscriptionName

# Get latest image for defined image family.
$imageName = Get-AzureVMImage | 
                Where-Object -Property ImageFamily -eq $imageFamily | 
                Sort-Object -Property PublishedDate -Descending | 
                Select-Object -ExpandProperty ImageName -First 1

# Create storage account and set is as current.
New-AzureStorageAccount -Location $location -StorageAccountName $storageAccountName -Type Standard_LRS
Set-AzureSubscription -SubscriptionName $subscriptionName -CurrentStorageAccountName $storageAccountName

# Create destination container in storage if it does not exist.
New-AzureStorageContainer -Name customscripts -Permission Off -ErrorAction Ignore

# Upload PowerShell file
Set-AzureStorageBlobContent -Container customscripts -File $scriptFile.FullName -Force

# Create new VM configuration, add provisioning data to it, and start it.
New-AzureVMConfig -ImageName $imageName -InstanceSize $instanceSize -Name $vmName |
    Add-AzureProvisioningConfig -Windows -AdminUsername $adminUsername -Password $adminPassword |
    Add-AzureEndpoint -LocalPort 80 -Name HTTP -Protocol tcp -PublicPort 80 |
    Add-AzureEndpoint -LocalPort 443 -Name HTTPS -Protocol tcp |
    Set-AzureVMCustomScriptExtension -ContainerName customscripts -FileName $scriptFile.Name -Run $scriptFile.Name |
    New-AzureVM -ServiceName $serviceName -Location $location

Write-Host "Your action: Map network drive via Windows Explorer to: http://$serviceName.cloudapp.net/" -ForegroundColor DarkGreen

Enable-WebDAV.ps1

# This script file has to be executed on the Azure VM.

# If you want to automatically create an Azure VM, install IIS and WebDAV

# DO NOT execute this file. Instead use the script in file Create-WebDavVm.ps1.

# Install IIS.

Install-WindowsFeature -Name Web-Server, Web-DAV-Publishing, Web-Windows-Auth, Web-Mgmt-Tools

# Configure IIS.

Set-WebConfigurationProperty -Filter system.webServer/security/authentication/anonymousAuthentication -PSPath "IIS:\Sites" -Location "Default Web Site" -Name Enabled -Value False

Set-WebConfigurationProperty -Filter system.webServer/security/authentication/windowsAuthentication -PSPath "IIS:\Sites" -Location "Default Web Site" -Name Enabled -Value True

Set-WebConfigurationProperty -Filter system.webServer/webdav/authoring -PSPath "MACHINE/WEBROOT/APPHOST" -Location "Default Web Site" -Name Enabled -Value True

$newRule = @{

    users="*"

    path="*"

    access="Read, Write, Source"

}

Add-WebConfiguration -Filter system.webServer/webdav/authoringRules -PSPath "MACHINE/WEBROOT/APPHOST" -Location "Default Web Site" -Value $newRule

Comments (0)

Skip to main content