Printserver Migration Part #4: Import Printer and Settings

Ich stelle hier ein paar Skripte zur Verfügung, welche einem die Migration eines Printservers etwas vereinfachten. Selbstverständlich kann man das auch mir Printmig oder anderen Tools durchführen. Ich wollte meinen neuen Printserver from scratch neu installieren, daher der etwas andere Weg. Die Migration wird in vier Teile erfolgen:

Part #1: Export TCP- und LPR-Ports
Part #2: Export Drucker mit allen Settings in eine XML-Datei
Part #3: Import TCP- und LPR-Ports
Part #4: Import aller Drucker mit allen Settings

WICHTIG: Vor dem nächsten schritt müssen erst alle nötigen Druckertreiber installiert werden. Sollte sich der Name oder die Version der Druckertreiber ändern, dann müssen diese vorher in der exportierten CSV-Datei angepasst werden.
Nachdem die Druckertreiber installiert wurden, kann man mit einem Get-PrinterDriver dir Druckertreiber anzeigen lassen. Hier findet man unter dem Punkt "Name" den Namen, welcher in der CSV entsprechend ausgetauscht werden muss. Sollte der Name nicht übereinstimmen, dann erhält man einen Fehler bei der Erstellung des Druckers, dass der Treiber nicht gefunden wurde. Nachdem dir Treiber installiert sind und die CSV ggf. angepasst wurde, können dir Drucker nun per Powershell erstellt werden (inkl. Konfiguration aus der XML).
Hinweis: Es hat sich gezeigt, dass Etikettendrucker nochmals gesondert geprüft werden müssen, da manche Informationen nicht im Windows-Treiber gespeichert wird (Druckkopf-Konfiguration).
Außerdem benötigt die Erstellung von Druckern, welche offline sind, ca. 1 Minute (TCP-Timeout).

Create-Printers_from_CSV.ps1
<# 
.NAME
    Create-Printers_from_CSV.ps1

.AUTHOR
    Ralf Entner

.SYNOPSIS
    Script creates all printers from a csv file. Config will be restored by import xml file.

.DESCRIPTION 
    Script creates all printers with all settings from a csv and xml file.
    With the testmode $true you can run the script without any changes. It will only show whatif
    A log file will be created
 
.NOTES 
    You have to install the printer drivers on the system before you run the script.
    printer driver names must be changed in the csv file if it differs from the original names.
    If the pritner is offline the creation will take approximal 1 mintue.

.COMPONENT 
    No powershell modules needed

.LINK 
    No Links
 
.Parameter ParameterName 
    $CSVPath - Define export path of the csv file
    $Testmode - Defines testmode: $true = test | $false = live
    $Logpath - Path for log file
#>

#Testmode ($true = active | $false = inactive)
$Testmode = $false

# CSV Import path
$CSVPath = "C:\tgswinv\Printmig\Printers.csv"

# XML import path
$XMLPath = "C:\tgswinv\Printmig\"

# Log File
$Logpath = "C:\tgswinv\Printmig\CreatePrinter.log"

#Start transciption 
Start-Transcript -Path $Logpath -Append

# Import Printers
$Printers = Import-Csv -Path $CSVPath -Delimiter ";"



foreach($Printer in $Printers){

    if(!(Get-Printer -Name $Printer.Name -ErrorAction SilentlyContinue))
    {
        Write-Host "Generating new pritner" $Printer.Name -ForegroundColor Green
        # If port not exists create a new one with parameters from csv import
        Add-Printer -Name $Printer.Name -PortName $Printer.Portname -DriverName $Printer.Drivername -Location $Printer.Location -Comment $Printer.Comment -WhatIf:$Testmode
        Start-Sleep -Seconds 2

        Write-Host "Import printer configuration from xml" $Printer.Name -ForegroundColor Green
        # If port not exists create a new one with parameters from csv import
        # Generate printer configuration path to xml file
        $XMLConfigFile = $XMLPath + $Printer.Name + ".xml"
        # Import printer configuration from xml file
        $XMLConfig = Get-Content $XMLConfigFile | Out-String
        # Set printer configuration from xml file
        Set-PrintConfiguration -PrinterName $Printer.Name -PrintTicketXml $XMLConfig -WhatIf:$Testmode
    }
}

Stop-Transcript


Printserver Migration Part #3: Import TCP- und LPR-Ports

Ich stelle hier ein paar Skripte zur Verfügung, welche einem die Migration eines Printservers etwas vereinfachten. Selbstverständlich kann man das auch mir Printmig oder anderen Tools durchführen. Ich wollte meinen neuen Printserver from scratch neu installieren, daher der etwas andere Weg. Die Migration wird in vier Teile erfolgen:

Part #1: Export TCP- und LPR-Ports
Part #2: Export Drucker mit allen Settings in eine XML-Datei
Part #3: Import TCP- und LPR-Ports
Part #4: Import aller Drucker mit allen Settings

Part #3: Import TCP- und LPR-Ports
Jetzt können wir die TCP- und LPR-Ports auf dem neuen Printserver erstellen lassen.
Auch hier gibt es wieder zwei Skripte, da TCP-Ports anders erzeugt werden als LPD-Ports.
ACHTUNG: Vor der Erstellung der LPR-Ports muss der LPD-Service erst über den Servermanager installiert werden, damit der LPR-Porttype zur Verfügung steht.
TIPP: Sollten die Namen oder die IPs der Ports geändert werden, dann bitte vorher in der CSV anpassen!

Create-Printerports_TCP_from_CSV.ps1
<# 
.NAME
    Create-Printerports_TCP_from_CSV.ps1

.AUTHOR
    Ralf Entner

.SYNOPSIS
    Script creates all TCP Printer Ports from a csv file.

.DESCRIPTION 
    Script creates all TCP Printer Ports with all settings from a csv file. In the csv file there are address, port number and smtp settings.
 
.NOTES 
    With the testmode $true you can run the script without any changes. It will only show whatif

.COMPONENT 
    No powershell modules needed

.LINK 
    No Links
 
.Parameter ParameterName 
    $CSVPath - Define import path of the csv file
    $Testmode - Defines testmode: $true = test | $false = live
#>

$CSVPath = "C:\tgswinv\Printmig\PortsTCP.csv"
$Testmode = $false

# Import CSV with Port Informations
$PrinterPorts = Import-CSV -Path $CSVPath -Delimiter ";"

# Loop through 
Foreach($Port in $PrinterPorts){

Write-Host "Creating Printerport $Name"

# Check if Printerport already exists
if(!(Get-PrinterPort -Name $Port.Name -ErrorAction SilentlyContinue))
    {
        Add-PrinterPort -Name $Port.Name -PrinterHostAddress $Port.PrinterHostAddress -PortNumber $Port.Portnumber -SNMPCommunity $Port.SNMPCommunity -SNMP $true -WhatIf:$Testmode
    }
}

Create-Printerports_LPR_from_CSV.ps1
<# 
.NAME
    Create-Printerports_LPR_from_CSV.ps1

.AUTHOR
    Ralf Entner

.SYNOPSIS
    Script creates all LPR Printer Ports from a csv file.

.DESCRIPTION 
    Script creates all LPR Printer Ports with all settings from a csv file.
    In the csv file there are name, protocol, port nubmer and printer host address.
 
.NOTES 
    With the testmode $true you can run the script without any changes. It will only show whatif

.COMPONENT 
    ATTENTION: You have to install the LPR printer monitor before you add the ports!
    No powershell modules needed

.LINK 
    No Links
 
.Parameter ParameterName 
    $CSVPath - Define import path of the csv file
    $Testmode - Defines testmode: $true = test | $false = live
#>

$CSVPath = "C:\tgswinv\Printmig\PortsLPR.csv"
$Testmode = $false

# Import CSV with Port Informations
$PrinterPorts = Import-CSV -Path $CSVPath -Delimiter ";"

# Loop through 
Foreach($Port in $PrinterPorts){

Write-Host "Creating Printerport "$Port.Name

# Check if Printerport already exists
if(!(Get-PrinterPort -Name $Port.Name -ErrorAction SilentlyContinue))
    {
        #Add-PrinterPort -Name $Port.PrinterName -PrinterHostAddress $Port.hostname -WhatIf:$Testmode
        Add-PrinterPort -PrinterName $Port.Printername -HostName $port.Hostname   -WhatIf:$Testmode
    }
}



Printserver Migration Part #2: Export Printer and Printer Settings

Ich stelle hier ein paar Skripte zur Verfügung, welche einem die Migration eines Printservers etwas vereinfachten. Selbstverständlich kann man das auch mir Printmig oder anderen Tools durchführen. Ich wollte meinen neuen Printserver from scratch neu installieren, daher der etwas andere Weg. Die Migration wird in vier Teile erfolgen:

Part #1: Export TCP- und LPR-Ports
Part #2: Export Drucker mit allen Settings in eine XML-Datei
Part #3: Import TCP- und LPR-Ports
Part #4: Import aller Drucker mit allen Settings

Part #2: Export Drucker mit allen Settings in eine XML-Datei
Mit dem nachfolgenden Skript erfolgt der Export aller installierten Drucker, welche Netzwerkdrucker sind. Es wird eine CSV mit den grundlegenden Druckerinformationen erstellt. Außerdem wird für jeden Drucker die Konfiguration in eine XML-Datei exportiert, welche die komplette Konfiguration der Schächte und Papierquellen etc. enthält. Mit diesen Informationen können später die Drucker vollständig auf dem neuen Server wiederhergestellt werden.

Export-Printer_and_Printerconfiguration.ps1
<# 
.NAME
    Export-Printer_and_Printerconfiguration.ps1

.AUTHOR
    Ralf Entner

.SYNOPSIS
    Script exports all network printers and printer settings.

.DESCRIPTION 
    Script exports all network Printers with all settings to a single csv file.
    The printer configurations are also exported in a xml file for each printer name (printername.xml)
    The export includes name, shared name, port name, driver name, location, comment und publishing information.

.NOTES 
    The script exports only network printers.

.COMPONENT 
    No powershell modules needed

.LINK 
    No Links
 
.Parameter ParameterName 
    $CSVPath - Define export path of the csv file
    $XMLPath - Define export path of xml file for each printer configuration
#>
# Export CSV path
$CSVPath = "C:\Printmig\Printers.csv"
$XMLPath = "C:\Printmig\"

# Get all printers and informtaions
$Printers = Get-Printer | ?{$_.PortName -ne "PORTPROMPT:"} | select Name, ShareName, PortName, DriverName, Location, Comment, Published, Shared

# Export Printers to csv
$Printers | Export-Csv -Path $CSVPath -Delimiter ";" -Encoding UTF8 -NoTypeInformation

Foreach ($Printer in $Printers){

    #Exportpaht for XML

    $XMLFilePath = $XMLPath + $Printer.Name + ".xml"

    # Export PrinterConfiguration to XML
    $GPC = get-printconfiguration -PrinterName $Printer.Name
    $GPC.PrintTicketXML | out-file $XMLFilePath
}

Printserver Migration Part #1: Export TCP- und LPR-Ports

Ich stelle hier ein paar Skripte zur Verfügung, welche einem die Migration eines Printservers etwas vereinfachten. Selbstverständlich kann man das auch mir Printmig oder anderen Tools durchführen. Ich wollte meinen neuen Printserver from scratch neu installieren, daher der etwas andere Weg. Die Migration wird in vier Teile erfolgen:

Part #1: Export TCP- und LPR-Ports
Part #2: Export Drucker mit allen Settings in eine XML-Datei
Part #3: Import TCP- und LPR-Ports
Part #4: Import aller Drucker mit allen Settings

Part #1: Export TCP- und LPR-Ports
Für den späteren Import der zwei Port-Typen werden unterschiedliche Informationen benötigt, daher habe ich hierfür zwei Skripte erstellt, welche die Konfigurationen exportieren:

Export-PrinterPorts_TCP_to_CSV.ps1
<# 
.NAME
    Export-PrinterPorts_TCP_to_CSV.ps1

.AUTHOR
    Ralf Entner

.SYNOPSIS
    Script exports all TCP Printer Ports to a csv file.

.DESCRIPTION 
    Script exports all TCP Printer Ports with all settings to a csv file. In the csv file there are address, port number and smtp settings.
 
.NOTES 
    The script exports only TCP Ports, not LPR Ports (see other script).

.COMPONENT 
    No powershell modules needed

.LINK 
    No Links
 
.Parameter ParameterName 
    $CSVPath - Define export path of the csv file
#>

# Export CSV path
$CSVPath = "C:\Printmig\PortsTCP.csv"

# Get Printerports with all nessesary informations
$Printerports = Get-PrinterPort | ?{$_.Description -like "*TCP*"} | select Name, PrinterHostAddress, PortNumber, SNMPCommunity, SNMPEnabled 

#Export informations to CSV
$Printerports | Export-Csv -Path $CSVPath -Delimiter ";" -Encoding UTF8 -NoTypeInformation


Export-PrinterPorts_LPR_to_CSV.ps1
<# 
.NAME
    Export-PrinterPorts_LPR_to_CSV.ps1

.AUTHOR
    Ralf Entner

.SYNOPSIS
    Script exports all LPR Printer Ports to a csv file.

.DESCRIPTION 
    Script exports all LPR Printer Ports with all settings to a csv file. In the csv file there are name, protocol, port nubmer and printer host address.
 
.NOTES 
    The script exports only LPR Ports, not TCP Ports (see other script).

.COMPONENT 
    No powershell modules needed

.LINK 
    No Links
 
.Parameter ParameterName 
    $CSVPath - Define export path of the csv file
#>
# Export CSV path
$CSVPath = "C:\Printmig\PortsLPR.csv"

# Get Printerports with all nessesary informations
$Printerports = Get-PrinterPort | ?{$_.PortMonitor -eq "LPR Port"} | Select-Object Name, Protocol, PortNumber, PrinterHostAddress

#Export informations to CSV
$Printerports | Export-Csv -Path $CSVPath -Delimiter ";" -Encoding UTF8 -NoTypeInformation


Migration Sharepoint Fondation 2010 auf 2013 inkl. Content

Migration SharePoint Fondation 2010 -> 2013

--- SHAREPOINT 2010 READONLY MODE ---

Ich habe als ersten Schritt den alten Sharepoint 2010 in den ReadOnly-Modus versetzt, damit während der Datenmigration keiner mehr Änderungen durchführt, aber die Daten noch erreichbar sind.

- Öffnen der Zentraladministration
- Im Menü links "Anwendungsverwaltung" auswählen
- In der Übersicht rechts den Unterpunkt "Kontingente und Sperren konfigurieren" bei "Webseitensammlungen" auswählen
- Die gewünschte Webseitensammlung auswählen und den Punkt "Schreibgeschützt" setzen.
- Fertig, jetzt können keine Änderungen mehr vorgenommen werden und die Migration kann beginnen.

--- Prerequisite-Installer ---

Powershell-Installation der nötigen Serverkomponenten, da es sonst zu Fehlermeldungen kommt.
Import-Module ServerManager

Add-WindowsFeature NET-WCF-HTTP-Activation45,NET-WCF-TCP-Activation45,NET-WCF-Pipe-Activation45

Add-WindowsFeature Net-Framework-Features,Web-Server,Web-WebServer,Web-Common-Http,Web-Static-Content,Web-Default-Doc,Web-Dir-Browsing,Web-Http-Errors,Web-App-Dev,Web-Asp-Net,Web-Net-Ext,Web-ISAPI-Ext,Web-ISAPI-Filter,Web-Health,Web-Http-Logging,Web-Log-Libraries,Web-Request-Monitor,Web-Http-Tracing,Web-Security,Web-Basic-Auth,Web-Windows-Auth,Web-Filtering,Web-Digest-Auth,Web-Performance,Web-Stat-Compression,Web-Dyn-Compression,Web-Mgmt-Tools,Web-Mgmt-Console,Web-Mgmt-Compat,Web-Metabase,WAS,WAS-Process-Model,WAS-NET-Environment,WAS-Config-APIs,Web-Lgcy-Scripting,Windows-Identity-Foundation,Server-Media-Foundation,Xps-Viewer

Jetzt den Sharepoint Prerequisite-Installer starten und durchlaufen lassen:

• Microsoft .NET Framework 4.5: gleichwertige Produkte waren bereits installiert (es ist keine Aktion erfolgt).
• Windows Management Framework 3.0: gleichwertige Produkte waren bereits installiert (es ist keine Aktion erfolgt).
• Anwendungsserverrolle, Webserverrolle (IIS): erfolgreich konfiguriert.
• Systemeigener Client von Microsoft SQL Server 2008 R2 SP1: erfolgreich installiert.
• Microsoft Sync Framework Runtime v1.0 SP1 (x64): erfolgreich installiert.
• Windows Server AppFabric: erfolgreich installiert.
• Microsoft Identity-Erweiterungen: erfolgreich installiert.
• Microsoft Information Protection and Control-Client: erfolgreich installiert.
• Microsoft WCF Data Services 5.0: erfolgreich installiert.
• Microsoft WCF Data Services 5.6: erfolgreich installiert.
• Kumulatives Updatepaket 1 für Microsoft AppFabric 1.1 für Windows Server (KB2671763): erfolgreich installiert.

Reboot

--- SQL EXPRESS INSTALLATION ---

Instanzname : Server=localhost\SQLEXPRESS;Database=master;Trusted_Connection=True;
Version : 14.0.1000.169 (SQL Express 2017)

SQL SERVER MANAGEMENT STUDIO INSTALLATION
Pfad : C:\Program Files (x86)\Microsoft SQL Server Management Studio 18
.NET-Version : 4.7.2

--- SHAREPOINT INSTALLATION ---
Um die Installation erfolgreich durchführen zu können muss die Datei wsssetup.dll getauscht werden, da sonst die .NET-Version nicht erkannt wird, wenn diese höher als 4.5 ist. Dazu müssen wir die Installation entpacken und die Datei austauschen.
Quelle: Setup error if the .NET Framework 4.6 is installed
Zur Installation werden ein Farmadmin-Konto und ein Serviceadmin-Konto benötigt. Bitte brachten, dass diese zwei Konten nur die nötigen Rechte bekommen und kein Domänen-Admin sind.

- sharepoint.exe /extract:C:\SharePointInstaller
- Austausch der wsssetup.dll
- Install Sharepoint (Installationstyp: Vollständig)

--- Sharepoint-Wizard ---

Konfig-Database : \SQLEXPRESS
Konfig-DB-Name : SharePoint_Config
Farmadmin :
Passphrase : xxxxxxxxx
Admin-Center : http://Sservername>:18073/
Auth. Setting : NTLM
Dienst-Konto :

--- Datenmigration ---

- Backup alte Datenbank "WSS_Content" mittels SQL Studio
- Backup-Datei auf neuen Sharepoint kopieren
- Bestehende Sharepoint - 80 Webapplikation löschen (inkl. ISS und Content-Database – NICHT die Central Administration).
- Da die alte WSS-Content-Database mit „windows classic“ Auth daherkommt und die Applikationen aber mit „Claims“ Auth erstellt werden, gibt es Probleme bei der Migration. Somit muss die Sharepoint - 80 Webapplikation manuell über die Powershell erstellt werden:
New-SPWebApplication -Name "Sharepoint Site - 80" -ApplicationPool "SPAppPool" -AuthenticationMethod "Kerberos" -ApplicationPoolAccount (Get-SPManagedAccount "") -Port 80 -URL http://

- Sharepoint-Dienste heruntergefahren und die WSS-Content-Database aus der Sicherungsdatei wiederhergestellen
- Dienste wieder hochgefahren und mit dem nachfolgenden Test die Konfiguration überprüft:
Test-SPContentDatabase -Name WSS_Content –WebApplication http://

Vorsichtshalber noch mal Upgrade der Content-Database durchführen:
Get-SPContentDatabase | Upgrade-SPContentDatabase 

100.00% : SPContentDatabase Name=WSS_Content
Upgrade-SPContentDatabase : Das Upgrade wurde mit Fehlern abgeschlossen. Überprüfen Sie die Upgradeprotokolldatei
unter 'C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\15\LOGS\Upgrade-20190926-103708-855.log'.
Die Anzahl der Fehler und Warnungen ist am Ende der Updateprotokolldatei aufgeführt.
In Zeile:1 Zeichen:25
+ Get-SPContentDatabase | Upgrade-SPContentDatabase
+ ~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidData: (Microsoft.Share...ContentDatabase:SPCmdletUpgradeContentDatabase) [Upgrade
-SPContentDatabase], SPUpgradeException
+ FullyQualifiedErrorId : Microsoft.SharePoint.PowerShell.SPCmdletUpgradeContentDatabase


Hiermit noch das Upgrade alle anderen Sharepoint-Datenbanken durchführen um den obrige Fehlermeldung zu lösen
PSConfig.exe -cmd upgrade -inplace b2b -wait -cmd applicationcontent -install -cmd installfeatures -cmd secureresources -cmd services -install

Die Konfiguration der SharePoint-Produkte wurde erfolgreich abgeschlossen.

Gesamtanzahl der ausgeführten Konfigurationseinstellungen: 8
Gesamtanzahl der erfolgreichen Konfigurationseinstellungen: 8
Gesamtanzahl der erfolglosen Konfigurationseinstellungen: 0
Die Konfiguration der SharePoint-Produkte wurde erfolgreich beendet.
Die Konfiguration der SharePoint-Produkte war erfolgreich.

Eigentlich fertig! Bei mir war noch das Problem, dass sich kein Benutzer am Intranet anmelden konnte – ich bekam immer ein Fenster zur Eingabe der Anmeldedaten angezeigt. Das hat mir viele graue Haare gekostet, aber am Ende war die Lösung mal wieder logisch und in den Basics versteckt – IIS Authentifizierung!
Hier war Kerberos als Standard gesetzt und ich habe NTLM eingetragen und schon hat alles funktioniert!

- IIS-Manager öffnen
- Sharepoint-Website suchen und Authentifizierung öffnen
- Hier bei „Windows Authentifizierung“ die „Provider“ auswählen
- Hier nur NTLM setzen
- iisreset durchführen – läuft!

Quellen für Hilfestellungen:
Install SharePoint Foundation 2013 on Windows Server 2016 Solution
SharePoint: Common NTLM Authentication Issues, aka: Consider Ditching NTLM
Live Migration of SharePoint 2010 to SharePoint 2013
SQL Server: Einzelbenutzermodus ausschalten
Change SharePoint Site To Read Only

Exchange 2016: Fehler "Version mismatch was detected" beim Verschieben von Postfächern

Problem:
Ich habe bei der Migration von Exchange 2013 auf 2016 beim Versuch Postfächer zu verschieben folgende Fehlermeldung bekommen:
Ich konnte keine Postfächer auf den neuen Exchange 2016 verschieben

Lösung:
Das Problem ist, dass das Migration-Postfach erst auf den neuen 2016er verschoben werden muss und sich damit auch die Version anhebt. Erst dann ist eine Migration von anderen Postfächern möglich. Das Migrationspostfach ermitteln Sie mittels Powershell:
Get-Mailbox Migration* -Arbitration

Ich habe das Postfach dann einfach in die neue Datenbank auf dem Exchange 2016 verschoben:
Get-Mailbox Migration* -Arbitration | New-MoveRequest -TargetDatabase "Datenbankname"

Nach der erfolgreichen Migration kann man sich auch die Versionsnummer anzeigen lassen. Diese sollte nun nicht mehr 15.0 sondern 15.1 lauten:
Get-Mailbox Migration* -Arbitration | ft Name,AdminDisplayVersion

Jetzt kann man die anderen Postfächer problemlos migrieren.
Generell empfiehlt es sich die Systempostfächer zuerst umzuziehen. Um diese zu ermitteln habe ich auch ein Skript geschrieben: Microsoft Exchange: Ermittlung aller System-Postfächer (Monitoring, Arbitration etc.)
“Das einzig sichere System müsste ausgeschaltet, in einem versiegelten und von Stahlbeton ummantelten Raum und von bewaffneten Schutztruppen umstellt sein.”
Gene Spafford (Sicherheitsexperte)