Bootfähigen USB-Stick mit PowerShell erstellen

Wie in der Kurzmitteilung Windows 7 SP1 Convenience Rollup integrieren angekündigt, werde ich im Folgenden einen bootfähigen USB-Stick mit PowerShell erstellen. Teile des Scripts habe ich von hier: New-BootableUSB. Damit funktionieren nur ISO-Dateien als Quelle. Ich habe das Script von Anfang an neu geschrieben, Windows-Installationsdateien in einem Ordner hinzugefügt und den Kopiervorgang anders gemacht.

Function New-BootableUSBDevice {

    <# .SYNOPSIS
           Zum Erstellen eines startfähigen USB-Sticks.
       .DESCRIPTION
           Diese Funktion erstellt aus einer ISO-Datei oder eines Ordners einen startfähigen USB-Stick.
       .PARAMETER
           ImagePath
           Pfad zu den Windows-Installationsdateien oder zur ISO-Datei.
       .PARAMETER
           USBDriveLetter
           Laufwerksbuchstabe des USB-Sticks.
       .PARAMETER
           FileSystemType
           Dateisystem für den USB-Stick. Standardeinstellung ist FAT32.
       .EXAMPLE
           New-BootableUSB -ImagePath "C:\Daten\SW_DVD5_WIN_ENT_10_1607_64BIT_German_MLF_X21-07112.ISO" -USBDriveLetter "D" -FileSystemType FAT32
           Erstellt von der angegebenen ISO-Datei einen mit FAT32 formatierten, bootfähigen USB-Stick.
       .NOTES
           Erstellt von Dietmar Haimann, Januar 2017
       .LINK
           https://www.einfaches-netzwerk.at/ #>

    [CmdletBinding()]

    param (
        [Parameter(Mandatory=$True)]
        [ValidateScript({ If (Test-Path $_ -Include *.iso) {$true} Else {Test-Path $_ -PathType Container} })]
        [string]$ImagePath,

        [Parameter(Mandatory=$True)]
        [ValidateLength(1,1)]
        [String]$USBDriveLetter,

        [Parameter(Mandatory=$True)]
        [ValidateSet("FAT32","NTFS")]
        [String]$FileSystemType = "FAT32"
    )

    Begin {
        $USBDriveLetter  = $USBDriveLetter.ToUpper()

        If (!((Get-Volume | Where DriveType -eq Removable | Select -ExpandProperty DriveLetter) -contains $USBDriveLetter)) {
            Write-Host ('{0} ist kein USB-Device.' -f $USBDriveLetter) -ForegroundColor Red
            Break
        }
        Else {
            Write-Host ('{0} ist ein USB-Device.' -f $USBDriveLetter) -ForegroundColor Green
        }#If

        If (!(Test-Path $ImagePath)) {
            Write-Host ('Auf {0} kann nicht zugegriffen werden.' -f $ImagePath) -ForegroundColor Red
            Break
        }
        Else {
            Write-Host ('Auf {0} kann zugegriffen werden.' -f $ImagePath) -ForegroundColor Green
        }#If

        If (Test-Path $ImagePath -Include "*.iso") {
            $IsISO = $true
            Write-Host ('{0} ist eine ISO-Datei.' -f $ImagePath) -ForegroundColor Green
        }
        Else {
            $IsISO = $false
            Write-Host ('{0} ist ein Windows-Ordner.' -f $ImagePath) -ForegroundColor Green
            If (!($ImagePath.EndsWith('\'))) {
                $Source = $ImagePath + "\*"
            }
            Else {
                $Source = $ImagePath + "*"
            }#If
        }#If

    }#Begin

    Process {
        Try {
            $Backup = $ErrorActionPreference
            $ErrorActionPreference = 'Stop'

            $Disk = Get-Disk | Where-Object BusType -EQ "USB"
            $Disk | Clear-Disk -RemoveData -Confirm:$false
            $Disk | New-Partition -UseMaximumSize -IsActive -DriveLetter $USBDriveLetter
            Format-Volume -DriveLetter $USBDriveLetter -FileSystem $FileSystemType -Confirm:$false -Force
        }#Try

        Catch {
            Write-Host "Error: $_" -ForegroundColor Red
            Write-Host "Das Script wird abgebrochen." -ForegroundColor Red
            Break
        }#Catch

        Finally {
            $ErrorActionPreference = $Backup
        }#Finally

        If ($IsISO) {
            If (!(Get-DiskImage -ImagePath $ImagePath | Get-Volume)) {
                $DiskMounted = $false
                Try {
                    $Backup = $ErrorActionPreference
                    $ErrorActionPreference = 'Stop' 

                    Mount-DiskImage -ImagePath $ImagePath
                    $DiskMounted = $true
                    Write-Host ('Das Image {0} konnte geladen werden.' -f $ImagePath) -ForegroundColor Green
                }#Try 

                Catch {
                    Write-Host "Error: $_" -ForegroundColor Red
                    Write-Host "Das Script wird abgebrochen." -ForegroundColor Red
                    Break
                }#Catch

                Finally {
                    $ErrorActionPreference = $Backup
                }#Finally
            }
            Else {
                Write-Host ('Das Image {0} ist bereits geladen.' -f $ImagePath) -ForegroundColor Green
            }#If
            $Source = ((Get-DiskImage -ImagePath $ImagePath | Get-Volume).DriveLetter) + ":\*"
        }#If

        $USBDestination = $USBDriveLetter + ":\" 

        Try {
            $Backup = $ErrorActionPreference
            $ErrorActionPreference = 'Stop' 

            Write-Host ('Dateien werden von {0} nach {1} kopiert. USB-Stick nicht vom Computer trennen!'-f $Source, $USBDestination) -ForegroundColor Yellow
            Copy-Item -Path $Source -Destination $USBDestination -Recurse -Force
            }#Try

        Catch {
            Write-Host "Error: $_" -ForegroundColor Red
            Write-Host "Das Script wird abgebrochen." -ForegroundColor Red
            Break
        }#Catch

        Finally {
            $ErrorActionPreference = $Backup
        }#Finally
    }#Process

    End {
        If($DiskMounted) {
            Dismount-DiskImage -ImagePath $ImagePath
        }#If

        Write-Host ('Erstellung des bootfähigen USB-Sticks abgeschlossen!') -ForegroundColor Green
    }#End
}#Function

Das Script unterstützt ISO-Datenträger und Windows-Installationsdateien in einem Ordner, wie es bei oben genanntem Beitrag der Fall ist.

PowerShell-Script als Modul speichern

Wer öfters Windows von einem USB-Stick starten muss, kann das Powershell-Script als Modul abspeichern und in den PowerShell-Ordner kopieren. Danach steht die Funktion sofort zur Verfügung. Wichtig ist, dass der Ordner und die Datei den gleichen Namen haben.

  1. Windows PowerShell ISE starten
  2. Das Script kopieren und in Windows PowerShell ISE einfügen
  3. File > Save As…
  4. Save As
    1. Zum Pfad C:\Program Files\WindowsPowerShell\Modules\ navigieren
    2. Dort den Ornder New-BootableUSBDevice erstellen und hinein navigieren
    3. File name: New-BootableUSBDevice
    4. Save as type: PowerShell Script Modules (*.psm1) > Save
  5. Windows PowerShell ISE schließen

Einen bootfähigen USB-Stick mit PowerShell erstellen

Als nächstes werde ich die Windows-Installationsdateien vom Beitrag Windows 7 SP1 Convenience Rollup integrieren vom USB-Stick startbar machen.

  1. PowerShell als Administator starten
  2. Mit folgendem Befehl die Funktion New-BootableUSBDevice ausführen
    New-BootableUSBDevice -ImagePath C:\W7SP1 -USBDriveLetter E -FileSystemType FAT32

  3. Der Vorgang dauert nur kurz, je nach Schreibleistung des USB-Sticks

Die manuelle Variante

Die wesentlichen Befehle lassen sich auf fünf Zeilen komprimieren, welche man schnell auswendig eintippen kann. Schritt für Schritt:

  1. USB-Stick anstecken
  2. Optional: ISO-Datei einbinden
  3. PowerShell als Administrator starten
  4. Mit folgendem Befehl die Informationen zum USB-Stick in der Variable $Disk speichern
    $Disk = Get-Disk | Where-Object BusType -EQ "USB"

  5. Mit folgendem Befehl den USB-Stick löschen
    $Disk | Clear-Disk -RemoveData -Confirm:$false
  6. Mit folgendem Befehl eine Partition erstellen
    $Disk | New-Partition -UseMaximumSize -IsActive -DriveLetter E

  7. Mit folgendem Befehl den USB-Stick formatieren
    Format-Volume -DriveLetter E -FileSystem FAT32 -Confirm:$false -Force

  8. Und zum Schluss die Dateien kopieren
    Copy-Item -Path C:\W7SP1\* -Destination E:\ -Recurse -Force

Funktioniert genauso einfach, wenn man es nicht oft braucht.

Vielen Dank für’s Lesen!

Teil 28c: Web Application Proxy installieren und konfigurieren

Damit die Arbeitsordner im Internet verwendet werden können, fehlt noch der Reverse Proxy. Ich verwende den in Windows verfügbaren Web Application Proxy. Installieren werde ich den Web Application Proxy am Server WAP1, der über zwei Netzwerkkarten (einmal im Intra- und einmal im Internet) verfügt und nicht zur Domäne hinzugefügt wurde.

Web Application Proxy installieren und konfigurieren – Schritte:

  • Server-Rolle Remote Access installieren
  • Web Application Proxy konfigurieren
  • Arbeitsordner veröffentlichen
  • AuthO aktivieren und update Deviceregistration
  • Mit der Hosts-Datei die internen IP-Adressen für AD FS und Arbeitsordner erzwingen
  • Die Arbeitsordner für die Authentifizierung mittels ADFS konfigurieren

Server-Rolle Remote Access installieren

  1. Als lokaler Administrator an WAP1 anmelden
  2. Die SSL-Zertifikate (adfs.pfx und arbeitsordner.pfx) von \\APP1\Sourcen\ADFS in den Personal Store des Computerkontos importieren
    WAP_001
  3. Server Manager > Manage > Add Roles and Features
  4. Add Roles and Features Wizard
    1. Before You Begin > Next
    2. Installation Type: Role-based or feature-based installation > Next
    3. Server Selection: WAP1 > Next
    4. Server Roles: Remote Access > Next
      WAP_002
    5. Features > Next
    6. Remote Access > Next
      1. Role Services: Web Application Proxy > Next > Add Features > Next
        WAP_003
    7. Confirmation > Install
    8. Results > Finish

Web Application Proxy konfigurieren

  1. Server Manager > Notifications > Open the Web Application Proxy Wizard
    WAP_004
  2. Web Application Proxy Configuration Wizard
    1. Welcome > Next
    2. Federation Server
      1. Federation service name: adfs.einfaches-netzwerk.at
      2. User name: Administrator (lokaler Administrator auf ADFS1!)
      3. Password: Password1 > Next
        WAP_005
    3. AD FS Proxy Certificate: adfs1.intern.einfaches-netzwerk.at > Next
      WAP_006
    4. Confirmation > PublishWAP_013
    5. Results > Close
      WAP_014

Arbeitsordner veröffentlichen

  1. Server Manager > Tools > Remote Access Management
  2. Auf der linken Seite auf Configuration\Web Application Proxy klicken
  3. Auf der rechten Seite auf Publish klicken
    WAP_009
    Weiterlesen „Teil 28c: Web Application Proxy installieren und konfigurieren“

Teil 27a: DirectAccess-Server installieren und konfigurieren

DirectAccess-Server installieren und konfigurieren – Schritte:

  • In Hyper-V eine virtuelle Maschine erstellen und Windows Server 2012 R2 installieren
  • Empfohlene Update für Windows Server 2012 R2 DirectAccess installieren
  • Die Server-Rolle Web Server (IIS) installieren
  • Netzwerk-Adapter konfigurieren
  • Bindings konfigurieren
  • Netzwerkprofil Public für den externen Netzwerk-Adapter konfigurieren
  • Statische Route ins interne Netzwerk hinzufügen

In Hyper-V eine virtuelle Maschine erstellen und Windows Server 2012 R2 installieren

  1. Im Hyper-V-Manager folgende virtuelle Maschine erstellen:
    1. Name: DA1
    2. Generation 2
    3. zwei Netzwerk-Adapter
      1. Adapter 1 im Corpnet, Adapter 2 im Internet
      2. Single-root I/O virtualization aktiviert (benötigt spezielle Hardware, die ich nicht habe – darum deaktiviert; siehe Overview of Single Root I/O Virtualization)
        DA_SERVER-001
      3. Enable MAC address spoofing aktiviert
        DA_SERVER-002
  2. Windows Server 2012 R2 wie in Teil 19c beschrieben aufsetzen

Empfohlene Update für Windows Server 2012 R2 DirectAccess installieren

  1. Alle Updates für Windows Server 2012 R2 von folgender Webseite installieren: Recommended hotfixes and updates for Windows Server 2012 DirectAccess and Windows Server 2012 R2 DirectAccess

Die Server-Rolle Web Server (IIS) installieren

  1. Die Server-Rolle Web Server (IIS) mit Standardeinstellungen installieren (Wizard einfach durchklicken)
    DA_SERVER-023

Netzwerk-Adapter konfigurieren

  1. Als Administrator an DA1 anmelden
  2. Network and Sharing Center öffnen > Change adapter settings
  3. Den internen Adapter nach Intern1 umbenennen
  4. Den externen Adapter nach Extern1 umbenennen, damit die Netzwerk-Adapter in den Dialogfenstern leichter unterschieden werden können
    DA_SERVER-003
  5. Den internen Netzwerk-Adapter (Intern1) konfigurieren
    1. Intern1 rechts anklicken > Properties
    2. Internet Protocol Version 4 markieren > Properties
    3. Internet Protocol Version 4 Properties
      1. IP address: 192.168.150.10
      2. Subnet mask: 255.255.255.0
      3. Default gateway: KEIN GATEWAY
      4. Preffered DNS server: 192.168.150.1
        DA_SERVER-004
    4. Alle Fenster mit OK schließen
  6. Den externen Netzwerk-Adapter (Extern1) konfigurieren
    1. Extern1 rechts anklicken > Properties
    2. Extern1 Properties
      1. Client for Microsoft Network deaktivieren
      2. File and Printer Sharing for Microsoft Network deaktivieren
        DA_SERVER-005
    3. Internet Protocol Version 4 markieren > Properties
    4. Internet Protocol Version 4 Properties
      1. IP address: 131.107.0.10
      2. Subnet mask: 255.255.255.0
      3. Default gateway: 131.107.0.1
      4. Preferred DNS server: KEIN DNS SERVERDA_SERVER-006
    5. Auf Advanced… klicken
      Weiterlesen „Teil 27a: DirectAccess-Server installieren und konfigurieren“