# Anleitungen

# Bitwarden/Vaultwarden

# Als Browser-Plugin



# Was ist Bitwarden?

# Die Zwei-Faktor-Authentifizierung (2FA) mit Vaultwarden einrichten

Hier erfahrt ihr, wie man die neue, erzwungene Zwei-Faktor-Authentifizierung von Microsoft mit Vaultwarden erledigen könnt ohne euch eine zusätzliche Authenticator-App zu installieren.

# Die böse Microsoft-Anmeldung

Ihr kennt es alle. Man möchte sich nichtsahnend in seinen Microsoft-Account einloggen, weil Outlook mal wieder zickt und schon kommt diese geheimnisvolle Meldung, in der Microsoft mitteilt, dass es hier nicht weiter geht, bevor man nicht einige zusätzliche Schritte getan hat.

Was genau Microsoft von euch will und wie ihr das mit Hilfe von Vaultwarden erledigen könnt, ist hier nachzulesen. Auch als Bilderbuch.

[![image.png](https://helpme.schlichter.biz/uploads/images/gallery/2024-08/scaled-1680-/drNimage.png)](https://helpme.schlichter.biz/uploads/images/gallery/2024-08/drNimage.png)

Bis dahin kommen wir ja noch ganz normal. Wir klicken auf anmelden und jetzt das...

[![Bildschirmfoto 2024-07-30 um 13.06.39.png](https://helpme.schlichter.biz/uploads/images/gallery/2024-08/bildschirmfoto-2024-07-30-um-13-06-39.png)](http://192.168.110.15/uploads/images/gallery/2024-08/bildschirmfoto-2024-07-30-um-13-06-39.png)

Wir denken uns nichts dabei und klicken auf **<span style="background-color: rgb(35, 111, 161); color: rgb(236, 240, 241);">Weiter</span>.** Aber oh Graus, was ist das?

[![image.png](https://helpme.schlichter.biz/uploads/images/gallery/2024-08/scaled-1680-/xr9image.png)](https://helpme.schlichter.biz/uploads/images/gallery/2024-08/xr9image.png)

Und hier geht unsere Anleitung dann so richtig los.

Wir klicken <span style="text-decoration: underline;">**NICHT**</span> auf <span style="color: rgb(236, 240, 241); background-color: rgb(35, 111, 161);">**Weiter**</span> sondern auf <span style="color: rgb(53, 152, 219);">Ich möchte eine andere Authentifikator-App verwenden<span style="color: rgb(0, 0, 0);">, was uns dann hierhin führt:</span></span>

[![image.png](https://helpme.schlichter.biz/uploads/images/gallery/2024-08/scaled-1680-/9JLimage.png)](https://helpme.schlichter.biz/uploads/images/gallery/2024-08/9JLimage.png)

Hier klicken wir natürlich auf **<span style="background-color: rgb(35, 111, 161); color: rgb(236, 240, 241);">Weiter</span><span style="background-color: rgb(35, 111, 161);"> </span>,** was uns dann hierhin führt:

[![image.png](https://helpme.schlichter.biz/uploads/images/gallery/2024-08/scaled-1680-/IVtimage.png)](https://helpme.schlichter.biz/uploads/images/gallery/2024-08/IVtimage.png)

Den QR-Code scannen wir **NICHT** sondern klicken auf **<span style="background-color: rgb(206, 212, 217);">Das Bild wird nicht gescannt?</span>**

[![image.png](https://helpme.schlichter.biz/uploads/images/gallery/2024-08/scaled-1680-/VOmimage.png)](https://helpme.schlichter.biz/uploads/images/gallery/2024-08/VOmimage.png)

Wir klicken in diesem Bild dann auf das[![image.png](https://helpme.schlichter.biz/uploads/images/gallery/2024-08/scaled-1680-/zmvimage.png)](https://helpme.schlichter.biz/uploads/images/gallery/2024-08/zmvimage.png)Symbol. Das kopiert uns den geheimen Schlüssel in die Zwischenablage. <sup>(Zum Glück, sonst müssten wir das Kauderwelsch auch noch abtippen.)</sup>

Jetzt öffnen wir ein neues Browserfenster oder einen neuen Tab und öffnen unseren Vaultwarden unter [https://pwd.schlichter.biz](https://pwd.schlichter.biz)

[![Bildschirmfoto 2024-07-30 um 13.08.38.png](https://helpme.schlichter.biz/uploads/images/gallery/2024-08/scaled-1680-/DJ8bildschirmfoto-2024-07-30-um-13-08-38.png)](https://helpme.schlichter.biz/uploads/images/gallery/2024-08/DJ8bildschirmfoto-2024-07-30-um-13-08-38.png)

Hier geben wir natürlich unsere -Mail-Adresse an

[![image.png](https://helpme.schlichter.biz/uploads/images/gallery/2024-08/scaled-1680-/ny5image.png)](https://helpme.schlichter.biz/uploads/images/gallery/2024-08/ny5image.png)

gefolgt von unserem Passwort und schon sind wir drin...

Wir suchen uns den Eintrag von Microsoft Office und klicken drauf

[![image.png](https://helpme.schlichter.biz/uploads/images/gallery/2024-08/scaled-1680-/mdEimage.png)](https://helpme.schlichter.biz/uploads/images/gallery/2024-08/mdEimage.png)

In das Feld **Authentifizierungsschlüssel (TOTP)** fügen wir den kopierten geheimen Schlüssel ein. Entweder mit Strg+V oder per Rechtsklick in das Feld und dann Einfügen. Anschliessend klicken wir auf **<span style="background-color: rgb(35, 111, 161); color: rgb(255, 255, 255);">Speichern</span>**

[![image.png](https://helpme.schlichter.biz/uploads/images/gallery/2024-08/scaled-1680-/oFzimage.png)](https://helpme.schlichter.biz/uploads/images/gallery/2024-08/oFzimage.png)

Jetzt sehen wir in dem Feld dahinter einen sechsstelligen Zahlen-Code den wir uns kopieren. Ab jetzt müssen wir uns etwas beeilen, da sich der Code alle 30 Sekunden ändert.

[![image.png](https://helpme.schlichter.biz/uploads/images/gallery/2024-08/scaled-1680-/XIsimage.png)](https://helpme.schlichter.biz/uploads/images/gallery/2024-08/XIsimage.png)Jetzt nochmal auf **<span style="color: rgb(255, 255, 255); background-color: rgb(35, 111, 161);">Weiter</span>** geklickt...

[![image.png](https://helpme.schlichter.biz/uploads/images/gallery/2024-08/scaled-1680-/zeYimage.png)](https://helpme.schlichter.biz/uploads/images/gallery/2024-08/zeYimage.png)

Jetzt ein letztes Mal auf **<span style="color: rgb(255, 255, 255); background-color: rgb(35, 111, 161);">Fertig</span>** klicken und ihr seid drin. War doch gar nicht so schlimm...

Und nein, das müsst ihr nicht jedes Mal machen. Nach dieser Einrichtung meldet ihr euch wie gewohnt an, und wenn der Code abgefragt wird kopiert ihr nur den sechstelligen Zahlencode und fügt den dann ein.

Dieser Code gilt für alle Microsoft-Apps und auch ie Webseiten office.com und teams.com.

Auch hier gilt: Einloggen mit E-Mail und Kennwort und bei Abfrage den Code auf den Vaultwarden.

Viel Erfolg!

# E-Mail für dich

Hier wird kurz beschrieben, wie man eine E-Mail verfasst und die Felder richtig benutzt.

# Eine Mail verfassen - Am Beispiel von Outlook

# IT-Support und wie Ihr unterstützen könnt

Eine Anleitung zur Erstellung korrekter Supportanfragen per Mail

# Eine Support-E-Mail verfassen

Im Prinzip verhält es sich mit einer Support-Anfrage wie mit dem Anruf bei der Notrufzentrale. Je genauer eure Angaben sind, desto schneller kann euch geholfen werden.

Meldungen wie **"Hier geht nix!"** oder **"Tut nich!"** sind nicht unbedingt hilfreich.

**AN:**

Also fangen wir mal vorne an, mit der korrekten E-Mail-Adresse. Wenn ihr schnelle Hilfe wünscht, schickt eure Mail an **<administrator@schlichter.biz>**

in dieses Postfach gehen dann alle Anfragen gesammtelt ein und werden von allen Admins der Reihe nach gelesen und abgearbeitet. Niemand wird bevorzugt und auch niemand übergangen. Bei uns sind alle gleich.

**CC: und BCC:**

Diese Felder könnt ihr ignorieren. Wen auch immer ihr da mit hinzuziehen wollt, vorgezogen werdet ihr trotzdem nicht.

**BETREFF:**

Hier wird's das erste Mal interessant. Im Betreff sollte schon der erste Hinweis auf euer Problem stehen. Mit diesen Hinweisen können wir eure Anfragen auch immer wiederfinden und auch feststellen, wie oft eine bestimmte Anfrage von verschiedenen Kollegen kommt. Und nein, auch hier kommt nicht **"Tut nich"** rein. Richtig wäre z.B.: **"Outlook startet nicht"**, **"Fehlermeldung in Unitrade"** oder **"Kennwort vergessen"**.

**NACHRICHTENTEXT:**

Hier beschreibt bitte ganz sachlich euer Problem, den Fehler oder euer Anliegen nach folgendem Schema:

Was ist passiert? Was hast Du gemacht bzw. wo hast du geklickt oder getippt, als der Fehler auftrat? Passiert das bei anderen Kollegen auch?

Emotionen, Flüche und Verwünschungen gehören hier nicht rein. Stattdessen macht lieber einen [Screenshot](http://192.168.110.15/books/anleitungen/page/screenshot-erstellen "Screenshot erstellen") oder ein [Screenrecording](http://192.168.110.15/books/anleitungen/page/screenrecord-erstellen "Screenrecord erstellen") von dem Fehler. Screenshots sind hilfreich bei einer bestehenden Fehlermeldung, die ihr selbst nicht bestätigen oder wegklicken könnt. Screenrecordings sind hilfreich bei reproduzierbaren Fehlern, also Fehlern die bei den gleichen Tätigkeiten an der gleichen Stelle wieder auftreten.

Wenn dann alles passt, sollte das Ganze ungefähr so aussehen:

[![grafik.png](http://192.168.110.15/uploads/images/gallery/2024-08/scaled-1680-/grafik.png)](http://192.168.110.15/uploads/images/gallery/2024-08/grafik.png)

Auf Senden klicken und auf Support warten

# Screenshot und Screenrecording

# Screenshot erstellen

Ein Screenshot ist ein wunderbares Hilfsmittel um einen Programmzustand festzuhalten z.B. im Falle einer Fehlermeldung. So etwas ist sehr Hilfreich um dem Support einen Zustand oder Umstand mitzuteilen, der sich für den normalen User nicht oder nur schwer in Worte fassen lässt. Getreu dem Motto: Ein Bild sagt mehr als tausend Worte!

Und so könnt ihr Screenshots erstellen

**Windows**

Unter Windows gibt es mehrere Arten um einen Screenshot zu erstellen.

1. Ihr sucht auf eurer Tastatur die Taste **Druck**. Das löst automatisch einen Screenshot eures Bildschirms aus, Windows macht also quasi ein Foto und legt es in die Zwischenablage. Von hier kann es mit Str+V in die Mail eingefügt werden.
2. Das geht auch noch differenzierter indem man die Tasten Shift + Druck betätigt. Damit wird dann nur das aktive Fenster geknipst. Der Rest funktioniert wie bei Punkt 1
3. Das Snipping Tool. Zu finden im Startmenü unter Zubehör. Hier kann man einen Rahmen um den Bereich ziehen, den man knipsen möchte.
4. 

**iPhone/iPad**

Bei modernen iPhones und iPads macht man einen Screenshot indem man die Lauter-Taste zusammen mit der Power-Taste drückt. Man hört dann auch ein Auslösegeräusch wie bei einer Kamera. Das Bild wird in der Foto-App abgelegt und kann von da aus versendet werden.

[**Android**](http://192.168.110.15/books/begriffe/page/android "Android")

Machen wir nicht....

# Screenrecord erstellen

Ein Screenrecord ist die Videoversion des Screenshots. Die meisten aktuellen Windows-Versionen haben ein Tool integriert um einen solchen Screenrecord aufzuzeichnen. Das Tool wurde zwar eigentlich zur Aufzeichnung von Spielesitzungen entwickelt, erfüllt aber auch hier seinen Zweck.

Drückt einfach die Windows-Taste und G. Das startet die Gamebar und am rechten Bildschirmrand findet ihr einen Aufnahmeknopf. Wenn ihr fertig seid, stoppt ihr die Aufnahme über eben diesen Knopf und das Video wird auf der Festplatte unter Videos abgespeichert.

# AddOne

# Nachunternehmer-Bescheinigungen & Ablage im Doku-Archiv

Nachunternehmer-Bescheinigungen sind Dokumente, die von Subunternehmern bereitgestellt werden, um ihre Eignung und Qualifikation für einen Auftrag nachzuweisen.

### 01 Rechtliche Informationen (vom 04.09.2024)

Karl Schlichter hat die wichtigsten Stellen des folgenden Schreibens markiert, es aber nochmal einfach und für alle verständlich zusammengefasst:

> Um nicht in die Haftung für Nachunternehmer zu kommen, muss ein Auftraggeber Unbedenklichkeitsbescheinigungen der Krankenkassen und eine qualifizierte (= mit Angabe der geltenden Betriebsteile mit den zugehörigen Lohnsummen der Unfallversicherung) Unbedenklichektsbescheinigungen der Unfallversicherung (BG) alle 3 Monate vorliegen.
> 
> Für den Zeitraum der Beauftragung des NUs muss der Nachweis **lückenlos** sein!!
> 
> &gt;&gt; Haftung gilt ab einer Gesamtsumme der beauftragten NU-Leistungen eines Hauptauftrages &gt; 275 TEUR

<details id="bkmrk-die-haftung-des-bauu"><summary>Die Haftung des Bauunternehmers für den Nachunternehmer - Teil1 (08/2024)</summary>

[![2024-09-23 Nachunternehmer-Bescheinigungen & Ablage im Doku Archiv_1.png](https://helpme.schlichter.biz/uploads/images/gallery/2024-09/scaled-1680-/2024-09-23-nachunternehmer-bescheinigungen-ablage-im-doku-archiv-1.png)](https://helpme.schlichter.biz/uploads/images/gallery/2024-09/2024-09-23-nachunternehmer-bescheinigungen-ablage-im-doku-archiv-1.png)

[![2024-09-23 Nachunternehmer-Bescheinigungen & Ablage im Doku Archiv_2.png](https://helpme.schlichter.biz/uploads/images/gallery/2024-09/scaled-1680-/2024-09-23-nachunternehmer-bescheinigungen-ablage-im-doku-archiv-2.png)](https://helpme.schlichter.biz/uploads/images/gallery/2024-09/2024-09-23-nachunternehmer-bescheinigungen-ablage-im-doku-archiv-2.png)

[![2024-09-23 Nachunternehmer-Bescheinigungen & Ablage im Doku Archiv_3.png](https://helpme.schlichter.biz/uploads/images/gallery/2024-09/scaled-1680-/2024-09-23-nachunternehmer-bescheinigungen-ablage-im-doku-archiv-3.png)](https://helpme.schlichter.biz/uploads/images/gallery/2024-09/2024-09-23-nachunternehmer-bescheinigungen-ablage-im-doku-archiv-3.png)

[![2024-09-23 Nachunternehmer-Bescheinigungen & Ablage im Doku Archiv_4.png](https://helpme.schlichter.biz/uploads/images/gallery/2024-09/scaled-1680-/2024-09-23-nachunternehmer-bescheinigungen-ablage-im-doku-archiv-4.png)](https://helpme.schlichter.biz/uploads/images/gallery/2024-09/2024-09-23-nachunternehmer-bescheinigungen-ablage-im-doku-archiv-4.png)

</details>### 02 Hinweise zu Bescheinigungen und Gültigkeit

Nachfolgend die Informationen aus dem Merkblatt vom 10.07.2024, wie die Bescheinigungen im Programm AddOne abgelegt werden sollen:

**01 Betriebshaftpflicht**  
\- Ohne Ausnahme Pflicht  
\- Gültigkeit <span style="text-decoration: underline;">3 Monate</span> ab Ausstellungsdatum, sofern nicht anders beschrieben

**02 Berufsgenossenschaft**  
\- Nicht notwenidig bei NU mit Sitz im Ausland  
\- Nicht notwendig, wenn keine Mitarbeiter vorhanden  
\- Gültigkeit steht auf der Bescheinigung <span style="text-decoration: underline;">(ca. 6 - 12 Monate)</span>

**03 Krankenkasse**  
\- Nicht notwendig, wenn keine Mitarbeiter vorhanden  
\- NU mit Sitz im EU-Ausland müssen eine A1 Bescheinigung vorlegen (Gültigkeit A1: Dauer des Einsatzes, längstens 24 Monate)  
\- Gültigkeit <span style="text-decoration: underline;">3 Monate</span>, wenn nicht anders beschrieben

**04 Finanzamt / Bescheinigung in Steuersachen**  
\- Ohne Ausnahme Pfllicht  
\- NU mit Sitz im Ausland haben zugewiesene Finanzämter siehe PDF  
\- Gültigkeit <span style="text-decoration: underline;">3 Monate</span>

**05 Handwerksrolle**  
\- Nicht notwendig, wenn Gewerbeanmeldung vorhanden  
\- Gültigkeit <span style="text-decoration: underline;">für immer</span>

**06 Gewerbeanmeldung**  
\- Ohne Ausnahme Pflicht  
\- Gültigkeit <span style="text-decoration: underline;">für immer</span>

**07 Freistellungsbescheinigung zum Steuerabzug bei Bauleistung §48b**  
\- Ohne Ausnahme Pflicht  
\- Gültigkeit steht auf der Bescheinigung <span style="text-decoration: underline;">(ca. 1 Jahr)</span>

**08 SOKA BAU**  
\- NU mit Sitz im Ausland: Abteilungsleiter fragen  
\- Nicht notwendig, wenn keine Mitarbeiter vorhanden  
\- Gültigkeit <span style="text-decoration: underline;">1 Jahr</span>, wenn nicht anders beschrieben

**09 Diverse / Sonstige Bescheinigungen &amp; Unterlagen**  
\- z. B. Nachweis Steuerschuldnerschaft §13 (Gültigkeit <span style="text-decoration: underline;">ca. 6 Monate</span>)  
\- Gewerbezantralregister / Gewerbekarte  
\- Ausweise / Versichertenkarten  
\- Eintragungen ins Handelsregister / HRA  
\- Erteilung von Steuernummern  
\- Führungszeugnis  
\- Wartungsverträge  
 Unter 09 darf alles abgelegt werden, was sonst noch unter Bescheinigungen abgelegt werden muss.

**10 Selbstauskunft &amp; Checkliste NU**  
\- gültig immer bis zum<span style="text-decoration: underline;"> 31.12. des laufenden Jahres</span>

### 03 Bearbeitung in AddOne  


#### 03.1 Ablage im Dokumenten-Archiv  


Kategorie: 01.03.07.01: aktuelle Bescheinigungen

[![Ablage im Doku-Archiv.png](https://helpme.schlichter.biz/uploads/images/gallery/2024-08/scaled-1680-/ablage-im-doku-archiv.png)](https://helpme.schlichter.biz/uploads/images/gallery/2024-08/ablage-im-doku-archiv.png)

z. B.:

<table border="1" id="bkmrk-name%3A-01-betriebshaf" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 11.7263%;"></col><col style="width: 88.3929%;"></col></colgroup><tbody><tr><td>Name:  
</td><td>01 Betriebshaftpflicht bis 25.07.2024 (Datum = Gültigkeit)  
(01 - 10: Nummernvergabe vom Merkblatt)

</td></tr><tr><td>Kategorie:  
</td><td>01.03.07.01 Aktuelle Bescheinigungen</td></tr><tr><td>Datum:  
</td><td>1 Tag VOR Ablaufdatum</td></tr><tr><td>Kostenstelle:  
</td><td>4: Dummy für Bescheinigungen  
</td></tr><tr><td>Adresse:  
</td><td>Firmenname auswählen  
</td></tr></tbody></table>

<p class="callout info">Wichtig!! Wenn eine Bescheinigung abgelaufen ist, unbedingt in abgelaufene Bescheinigungen (Kategorie: 01.03.07.02) verschieben!  
</p>

Sonst ist es üblich, dass bei Dokumenten-Ablage im Dokumenten-Archiv das Datum im amerikanischen Format davor geschrieben wird. Das muss in diesem Fall (ausnahmsweise) nicht davor geschrieben werden, da es hier irrelevant ist.

#### 03.2 Eintragung unter NU-/Lieferantendaten  


Nach erfolgter Ablage im Dokumentenarchiv werden die Daten im Adressstamm des NUs eingepflegt.

&gt; Add One  
&gt; Adressen  
&gt; NU auswählen  
&gt; Adressen-Details  
&gt; 3. NU-/Lieferantendaten

<span class="wpaicg-chat-message" id="bkmrk-die-reihenfolge-in-a-1">Die Reihenfolge in AddOne folgt der Nummerierung von 01 bis 08, wie sie unter "02 Allgemeine Hinweise zu Bescheinigungen und Gültigkeit" angegeben ist. Für jede Bescheinigung werden das Beginn- und Enddatum der aktuellsten Version eingetragen. Bei Bescheinigungen, die kein Enddatum haben (wie beispielsweise bei einer Gewerbeanmeldung), wird der 01.01.2999 als Enddatum verwendet. In der Spalte "Herkunft" wird der Absender der Bescheinigung vermerkt.</span>

NU = Nachunternehmer

# Kohlhammer-Übertragung

# GWS-Kohlhammer-Drucker einrichten

<span style="white-space: pre-wrap;">Um den PDF-Druck zu Kohlhammer mit Textextrahierbarer PDF zu realisieren muss ein Script auf dem jeweiligen Server eingerichtet werden. </span>

### Voraussetzungen installieren

#### .NET SDK

<span style="white-space: pre-wrap;">Zuerst muss das Microsoft </span>[.NET SDK](https://dotnet.microsoft.com/en-us/download/dotnet/thank-you/sdk-10.0.102-windows-x64-installer)<span style="white-space: pre-wrap;"> installiert werden. Ob alles richtig installiert ist, kann man mit diesem Befehl prüfen:</span>

```powershell
dotnet --info
```

#### Powershell 7

<span style="white-space: pre-wrap;">Zur korrekten Ausführung benötigen wir auch Powershell 7, das man </span>[hier](https://github.com/PowerShell/PowerShell/releases/download/v7.5.4/PowerShell-7.5.4-win-x64.msi)<span style="white-space: pre-wrap;"> laden kann.</span>

#### Ordnerstruktur anlegen

Danach legen wir die Ordnerstruktur an. Das kann automatisch mit diesen Befehlen erfolgen:

```
$folders = @(
    "C:\PDF\IN",
    "C:\PDF\OUT",
    "C:\PDF\ERROR",
    "C:\PDF\TEMP"
)

foreach ($folder in $folders) {
    New-Item -ItemType Directory -Path $folder -Force | Out-Null
}
```

```powershell
$work = "C:\Tools\itext_bundle"
New-Item -ItemType Directory -Path $work -Force | Out-Null
Set-Location $work
```

Den Installationspfad kann man je nach Umgebung natürlich anpassen.

#### Mini-Projekt erstellen

Die folgenden Befehle führen wir alle in Poershell 7 aus.

```powershell
dotnet new console -n ITextBundle
Set-Location "$work\ITextBundle"
```

#### iText + Adapter als NuGet-Pakete hinzufügen

```powershell
dotnet add package itext --version 9.5.0
dotnet add package itext.bouncy-castle-adapter --version 9.5.0
```

jetzt müssen wir das Ganze noch in einen Publish-Ordner ausgeben

```powershell
$pub = "$work\publish"
dotnet publish -c Release -o $pub
```

jetzt noch prüfen, ob die notwendigen Abhängigkeiten vorhanden sind:

```powershell
Get-ChildItem $pub -Filter "Microsoft.Extensions.Logging.dll" | Select Name, FullName
Get-ChildItem $pub -Filter "itext*.dll" | Select Name
Get-ChildItem $pub -Filter "*BouncyCastle*.dll" | Select Name
```

Die eingentlichen Powershell-Scripte:

##### [pdf\_worker.ps1](https://helpme.schlichter.biz/attachments/13)

```powershell
param(
  [Parameter(Mandatory)] [string] $InputPdf,
  [Parameter(Mandatory)] [string] $OutputPdf,
  [Parameter(Mandatory)] [string] $WatermarkPdf,
  [Parameter(Mandatory)] [string] $ITextDllDir,
  [Parameter(Mandatory)] [string] $LogFile,
  [Parameter(Mandatory)] [string] $AddDebugMarker
)

Set-StrictMode -Version Latest
$ErrorActionPreference = "Stop"

  $AddDebugMarkerBool = ($AddDebugMarker -eq "True") #Dies setzt, den wieder aktiviert, einen Debug-Marker, der unten Links WM1 oder WM2 andruckt, damit man sehen kann, ob die richtigen Seiten des Briefpapiers genutzt werden.

function Write-Log([string]$msg) {
  $line = "[{0}] {1}`r`n" -f (Get-Date), $msg
  try {
    [System.IO.File]::AppendAllText($LogFile, $line)
  } catch {
    # Fallback, falls LogFile kaputt/leer/nicht schreibbar ist
    $fallback = Join-Path $env:TEMP "pdf_worker_fallback.log"
    [System.IO.File]::AppendAllText($fallback, $line)
  }
}

function Import-IText7 {
  param([Parameter(Mandatory)] [string] $DllDir)

  if (-not (Test-Path $DllDir)) { throw "IText-DLL-Verzeichnis existiert nicht: $DllDir" }

  # PS7 / .NET: sauberes Laden über AssemblyLoadContext, ohne Resolve-Handler
  Add-Type -AssemblyName "System.Runtime.Loader" -ErrorAction Stop
  $alc = [System.Runtime.Loader.AssemblyLoadContext]::Default

  # Lade alle DLLs aus dem Ordner. Wichtig: erst commons/io, dann kernel/layout etc.
  $preferredOrder = @(
    "itext.commons.dll",
    "itext.io.dll",
    "itext.kernel.dll",
    "itext.layout.dll",
    "itext.barcodes.dll"
  )

  # 1) bevorzugte zuerst (wenn vorhanden)
  foreach ($name in $preferredOrder) {
    $p = Join-Path $DllDir $name
    if (Test-Path $p) {
      $full = (Resolve-Path $p).Path
      [void]$alc.LoadFromAssemblyPath($full)
    }
  }

  # 2) dann alle übrigen DLLs (z.B. BouncyCastle Adapter/Abhängigkeiten), die noch nicht geladen sind
  $dlls = Get-ChildItem -LiteralPath $DllDir -Filter "*.dll" -File | Sort-Object Name
  foreach ($dll in $dlls) {
    try {
      $full = $dll.FullName
      # Wenn bereits geladen, skip (heuristisch über Name)
      $already = [AppDomain]::CurrentDomain.GetAssemblies() |
        Where-Object { $_.GetName().Name -ieq [IO.Path]::GetFileNameWithoutExtension($dll.Name) }
      if ($already) { continue }

      [void]$alc.LoadFromAssemblyPath($full)
    } catch {
      # absichtlich leise: manche DLLs sind evtl. native/inkompatibel, wir wollen nicht hier abbrechen
    }
  }
}



function Add-StationeryWatermark {
  param(
    [Parameter(Mandatory)] [string] $InputPdf,
    [Parameter(Mandatory)] [string] $OutputPdf,
    [Parameter(Mandatory)] [string] $WatermarkPdf,
    [bool] $AddDebugMarker
  )

  $PdfReaderType  = [iText.Kernel.Pdf.PdfReader]
  $PdfWriterType  = [iText.Kernel.Pdf.PdfWriter]
  $PdfDocType     = [iText.Kernel.Pdf.PdfDocument]
  $PdfCanvasType  = [iText.Kernel.Pdf.Canvas.PdfCanvas]

  $reader=$null; $writer=$null; $pdf=$null
  $wmReader=$null; $wmDoc=$null

  try {
    $reader = New-Object $PdfReaderType($InputPdf)
    $writer = New-Object $PdfWriterType($OutputPdf)
    $pdf    = New-Object $PdfDocType($reader, $writer)
    $pages  = $pdf.GetNumberOfPages()

    $wmReader = New-Object $PdfReaderType($WatermarkPdf)
    $wmDoc    = New-Object $PdfDocType($wmReader)
    $wmPages  = $wmDoc.GetNumberOfPages()

    Write-Log ("INFO InputPages={0} WatermarkPages={1} WM={2}" -f $pages, $wmPages, $WatermarkPdf)

    if ($wmPages -lt 1) { throw "Wasserzeichen-PDF hat keine Seiten: $WatermarkPdf" }

    $wmFirstXObj = $wmDoc.GetPage(1).CopyAsFormXObject($pdf)
    $wmNextXObj  = if ($wmPages -ge 2) { $wmDoc.GetPage(2).CopyAsFormXObject($pdf) } else { $wmFirstXObj }

    for ($p=1; $p -le $pages; $p++) {
      $page = $pdf.GetPage($p)
      $canvas = New-Object $PdfCanvasType($page.NewContentStreamBefore(), $page.GetResources(), $pdf)

      $use = if ($pages -eq 1 -or $p -eq 1) { 1 } else { 2 }
      if ($use -eq 1) { $canvas.AddXObjectAt($wmFirstXObj, 0, 0) | Out-Null }
      else            { $canvas.AddXObjectAt($wmNextXObj,  0, 0) | Out-Null }

# Debug-Marker: macht sofort sichtbar, ob Seite 2 wirklich benutzt wird
      if ($AddDebugMarker) {
        $canvas2 = New-Object $PdfCanvasType($page.NewContentStreamAfter(), $page.GetResources(), $pdf)
        $canvas2.BeginText() | Out-Null
        $canvas2.SetFontAndSize([iText.Kernel.Font.PdfFontFactory]::CreateFont(), 8) | Out-Null
        $canvas2.MoveText(10, 10) | Out-Null
        $canvas2.ShowText(("WM{0}" -f $use)) | Out-Null
        $canvas2.EndText() | Out-Null
        $canvas2.Release()
      }

      $canvas.Release()
    }
  }
  finally {
    foreach ($o in @($wmDoc,$pdf,$wmReader,$reader,$writer)) {
      try { if ($null -ne $o) { $o.Close() } } catch {}
    }
  }
}

try {
  Write-Log ("START Input={0} Out={1}" -f $InputPdf, $OutputPdf)

  if (-not (Test-Path $InputPdf))     { throw "Input-PDF nicht gefunden: $InputPdf" }
  if (-not (Test-Path $WatermarkPdf)) { throw "Wasserzeichen nicht gefunden: $WatermarkPdf" }
  if (-not (Test-Path $ITextDllDir))  { throw "ITextDllDir nicht gefunden: $ITextDllDir" }

  Import-IText7 -DllDir $ITextDllDir

  Add-StationeryWatermark -InputPdf $InputPdf -OutputPdf $OutputPdf -WatermarkPdf $WatermarkPdf -AddDebugMarker:$AddDebugMarkerBool

  Write-Log "OK"
  exit 0
}
catch {
  Write-Log ("FAIL :: {0}" -f $_.Exception.Message)
  $e = $_.Exception
  while ($e) {
    Write-Log ("EX: {0}: {1}" -f $e.GetType().FullName, $e.Message)
    $e = $e.InnerException
  }
  exit 2
}
```

Dazu brauchen wir dann noch das Ausführungs-Script.

[run\_once.ps1](https://helpme.schlichter.biz/attachments/14)

```powershell
Set-StrictMode -Version Latest
$ErrorActionPreference = "Stop"

$InputDir        = "C:\PDF\IN"
$ExportDir       = "C:\PDF\OUT"
$ErrorDir        = "C:\PDF\ERROR"
$TempDir         = "C:\PDF\TEMP"

$WatermarkPdf    = "C:\PDF\briefpapier.pdf"      # MUSS 2 Seiten haben (1+2)
$ITextDllDir     = "C:\Tools\itext_bundle\publish"
$WorkerScript    = "C:\PDF\pdf_worker.ps1"

$DeleteOriginalAfterSuccess = $true
$AddDebugMarker = $true   # setzt klein "WM1"/"WM2" ins PDF, damit man sieht, ob die richtige Siete gewählt wurde. Auf $false setzen, wenn fertig

function Initialize-Directories {
  foreach ($d in @($InputDir, $ExportDir, $ErrorDir, $TempDir)) {
    if (-not (Test-Path $d)) { New-Item -ItemType Directory -Path $d | Out-Null }
  }
}

function New-SafeOutputName {
  param([Parameter(Mandatory)] [string] $InputPath, [Parameter(Mandatory)] [string] $OutDir)
  $base = [IO.Path]::GetFileNameWithoutExtension($InputPath)
  $ext  = [IO.Path]::GetExtension($InputPath)
  $out  = Join-Path $OutDir ($base + $ext)
  if (-not (Test-Path $out)) { return $out }
  $ts = Get-Date -Format "yyyyMMdd_HHmmss_fff"
  return Join-Path $OutDir ("{0}_{1}{2}" -f $base, $ts, $ext)
}

function Quote-Arg([string]$s) {
  if ($null -eq $s) { return '""' }
  '"' + ($s -replace '"','\"') + '"'
}

Initialize-Directories

if (-not (Test-Path $WorkerScript)) { throw "Worker-Script fehlt: $WorkerScript" }
if (-not (Test-Path $WatermarkPdf)) { throw "Wasserzeichen-Datei fehlt: $WatermarkPdf" }
if (-not (Test-Path $ITextDllDir))  { throw "ITextDllDir fehlt: $ITextDllDir" }

$runLog = Join-Path $ErrorDir ("run_{0}.log" -f (Get-Date -Format "yyyyMMdd_HHmmss"))
# Logfile garantiert anlegen, damit “keine Log-Datei” ausgeschlossen ist
[System.IO.File]::WriteAllText($runLog, ("[{0}] RUN START`r`n" -f (Get-Date)))

$files = @(Get-ChildItem -LiteralPath $InputDir -Filter "*.pdf" -File -Force | Sort-Object LastWriteTime)
if ($files.Count -eq 0) {
  Write-Host "Keine PDFs gefunden in: $InputDir"
  Write-Host "Log: $runLog"
  exit 0
}

Write-Host ("Gefunden: {0} PDF(s)" -f $files.Count)
Write-Host "Log: $runLog"

foreach ($file in $files) {
  $tempOut  = New-SafeOutputName -InputPath $file.FullName -OutDir $TempDir
  $finalOut = New-SafeOutputName -InputPath $file.FullName -OutDir $ExportDir

  Write-Host ("Worker startet: {0}" -f $file.Name)

  # WICHTIG: Argumente als EIN String mit sicherem Quoting -> keine Param-Zerlegung bei Leerzeichen
  $argString = @(
    "-NoProfile",
    "-ExecutionPolicy Bypass",
    "-File", (Quote-Arg $WorkerScript),
    "-InputPdf", (Quote-Arg $file.FullName),
    "-OutputPdf", (Quote-Arg $tempOut),
    "-WatermarkPdf", (Quote-Arg $WatermarkPdf),
    "-ITextDllDir", (Quote-Arg $ITextDllDir),
    "-LogFile", (Quote-Arg $runLog),
    "-AddDebugMarker", (Quote-Arg ($AddDebugMarker.ToString()))
  ) -join " "

  $p = Start-Process -FilePath "pwsh.exe" -ArgumentList $argString -Wait -PassThru -WindowStyle Hidden

  if ($p.ExitCode -eq 0 -and (Test-Path $tempOut)) {
    Move-Item -LiteralPath $tempOut -Destination $finalOut -Force
    if ($DeleteOriginalAfterSuccess) { Remove-Item -LiteralPath $file.FullName -Force }
    Write-Host ("OK: {0}" -f $file.Name)
  }
  else {
    if (Test-Path $tempOut) { Remove-Item -LiteralPath $tempOut -Force -ErrorAction SilentlyContinue }
    $errDest = New-SafeOutputName -InputPath $file.FullName -OutDir $ErrorDir
    try { Move-Item -LiteralPath $file.FullName -Destination $errDest -Force } catch {}
    Write-Host ("FAIL (ExitCode {0}): {1}" -f $p.ExitCode, $file.Name)
  }
}

Write-Host "Fertig."
Write-Host "Log: $runLog"
```

Hier können in den ersten Zeilen die Pfade angepasst werden.

Diese beiden Scripte müssen in den PDF-Ordner gelegt werden und run\_once.ps1 zur gewünschten Zeit ausgeführt werden, am Besten per Taskplaner.

Das das Script etwas braucht, bis alle PDFs gelesen/geschrieben sind, werden, deshalb werden die Dateien etwas zeitversetzt durch ein separates Script in eine .zip-Datei verpackt und per FTP zu Kohlhammer übertragen.

# komprimieren in .ZIP

Die Rechnungen, Gutschriften und Mahnungen müssen in einer ZIP-Datei zu Kohlhammer übertragen werden.

Dazu erfasst ein Script alle fertigen PDF-Dateien, egal ob Gutschrift oder Rechnung, und fügt sie in ein ZIP-Archiv mit dem Dateinamen &lt;Date&gt;\_schlichter.zip ein. Das Datum wird als Präfix gesetzt, damit, wenn durch Urlaub, Feiertage usw. Rechnungen nicht unmittelbar gedruckt werden können, die noch nicht verarbeitete Datei durch eine neue ersetzt wird und die vorherigen Rechnungen dadurch verloren sind.

Zusätzlich werden die PDF-Dateien in ein separates Dokumentenarchiv gelesen und dann gelöscht.

```

```

# Microsoft 365-Synchronisation auf dem iPhone neu starten

Wenn E-Mails, Kalender oder Kontakte auf dem iPhone nicht mehr richtig synchronisiert werden, kann die Synchronisation des Microsoft-365-Kontos einmal aus- und wieder eingeschaltet werden.

Die folgende Anleitung gilt für die **Apple-Mail-App mit einem als Microsoft Exchange eingerichteten M365-Konto**. Exchange kann dabei E-Mails, Kontakte, Kalender, Erinnerungen und Notizen synchronisieren.

#### 1. Einstellungen öffnen

Öffne auf dem iPhone:

**Einstellungen → Apps → Mail![Einen E-Mail-Account auf deinem iPhone oder iPad hinzufügen - Apple ...](https://cdsassets.apple.com/live/7WUAS350/images/ios/locale/de-de/ios-18-iphone-16-pro-settings-apps-mail.png)**

**Tippe anschließend auf **„Mail-Accounts“**.**

**![How to delete an email account on iPhone, iPad, and Mac](https://images.openai.com/static-rsc-4/YuesIu_wf4qAW9_GOF-ViylSeE4T6Pv5YWWKfEavWDUM4q0_Up5vGzXxGLbeGeF8QOIUhMNu_XP3-JS1MNvbYxMAFxZjeCxionQeVyh4VRO_IHZ3lZrIx2QiJXrRL3Mbo82ScI1-LoJGf0b2bOmcgeBgGeME_tl0xsg7vmsPF_fBcJwzzReO4Hz1pJph-H8Y?purpose=fullsize)**

#### 2. Microsoft-365-Konto auswählen

Unter **Mail-Accounts** werden die auf dem iPhone eingerichteten E-Mail-Konten angezeigt.

Wähle hier dein **Microsoft-365- bzw. Exchange-Konto** aus.

#### 3. Synchronisation ausschalten

Im ausgewählten Exchange-Konto findest du Schalter für die verschiedenen Datenarten.

Schalte **Mail** aus.

Wenn auch andere Bereiche nicht richtig synchronisiert werden, kannst du zusätzlich **Kontakte**, **Kalender**, **Erinnerungen** oder **Notizen** ausschalten.

Warte anschließend etwa **30 Sekunden**.

<p class="callout warning">**Wichtig:** Nicht auf **„Account löschen“** oder **„Abmelden“** tippen. Das Konto soll lediglich vorübergehend deaktiviert werden. Apple sieht das Deaktivieren von „Mail“ ausdrücklich als Möglichkeit vor, einen Account vorübergehend nicht zu verwenden.</p>

#### 4. Synchronisation wieder einschalten

Gehe wieder zu:

**Einstellungen → Apps → Mail → Mail-Accounts → \[Microsoft-365-Konto\]**

Aktiviere jetzt **Mail** und gegebenenfalls die zuvor deaktivierten Bereiche wieder.

#### 5. Synchronisation prüfen

Öffne anschließend die **Mail-App**. Das iPhone beginnt nun wieder mit der Synchronisation des Microsoft-365-Postfachs.  
Falls auch **Kalender** oder **Kontakte** neu aktiviert wurden, öffne die entsprechenden Apps ebenfalls einmal.  
Je nach Größe des Postfachs kann es einige Minuten dauern, bis wieder alle Daten angezeigt werden.

### Wenn das nicht hilft

Erst wenn das Aus- und Einschalten keine Wirkung zeigt, sollte als nächster Schritt das Microsoft-365-Konto **vollständig vom iPhone entfernt und anschließend neu als „Microsoft Exchange“ eingerichtet** werden. Das ist ein deutlich stärkerer Eingriff und sollte nicht der erste Schritt sein. Frage hierzu einen Administrator oder, wenn Du dir das selbst zutraust, folge dieser Anleitung: [Microsoft-Konto auf dem iPhone oder iPad einrichten](https://helpme.schlichter.biz/books/anleitungen/page/exchange-activesync-auf-deinem-iphone-oder-ipad-einrichten "Exchange ActiveSync auf deinem iPhone oder iPad einrichten").

# Exchange ActiveSync auf deinem iPhone oder iPad einrichten

Mit Exchange ActiveSync kannst du E-Mail, Kontakte, Kalender, Erinnerungen und Notizen deines Exchange-Accounts mit deinem Apple-Gerät synchronisieren.

<p class="callout info">Wenn du dich nicht an einem vertrauten Ort befindest, musst du zuerst „Schutz für gestohlene Geräte“ deaktivieren, bevor du einen Exchange-Account konfigurierst. Anschließend kannst du diese Option wieder aktivieren.</p>

<p class="callout warning">Du musst unbedingt dein Microsoft-Kennwort (Nein, es ist nicht das, mit dem Du dich jeden morgen am PC anmeldest) zur Hand haben. Im Normalfall, solltest Du auf die IT-Guys gehört haben, steht es in deinem Passwort-Safe!</p>

## Deinen Exchange-Account hinzufügen und konfigurieren

Du kannst deinen Exchange-Account in der Mail-App auf deinem iPhone, iPad oder deiner Apple Vision Pro hinzufügen.

1. Gehe zu „Einstellungen“, und tippe dann auf „Apps“.
2. Tippe auf „Mail“.
    
    
    - Tippe auf dem iPhone oder iPad auf „Mail-Accounts“.
    - Tippen bei der Apple Vision Pro auf „Accounts“.
3. Tippe auf „Account hinzufügen“, und tippe dann auf „Microsoft Exchange“.
4. Gib deine E-Mail-Adresse ein, und tippe auf „Weiter“. Du kannst außerdem eine Beschreibung für den Account eingeben.

![iphone-xs-ios13-settings-account-add-exchange-steps-crop](https://cdsassets.apple.com/live/7WUAS350/images/ios/locale/de-de/iphone-xs-ios13-settings-account-add-exchange-steps-crop.png)

### Zum Konfigurieren des Exchange-Accounts anmelden

Nachdem du deine E-Mail-Adresse eingegeben hast, wirst du aufgefordert, dich anzumelden, um deinen Exchange-Account entweder automatisch oder manuell zu konfigurieren.

#### Automatisch anmelden

Das ist die einfachste und bei uns im Betrieb die favorisierte Methode. Die sollte eigentlich immer funktionieren.

1. Tippe auf „Anmelden“, um die Informationen deines Exchange-Accounts automatisch zu ermitteln.
2. Gib dein E-Mail-Passwort ein, und tippe auf „Weiter“.

Wenn dein Account [moderne Authentifizierung](https://support.apple.com/guide/deployment/dep158966b23) verwendet, wirst du durch einen benutzerdefinierten Authentifizierungsworkflow geführt.

#### Deinen Account manuell konfigurieren

Diese Anmeldemethode kommt nur in wenigen, sehr speziellen Fällen bei uns zum Tragen. Also lasst das lieber....

1. Tippe auf „Manuell konfigurieren“, um deinen Account mit der Standardauthentifizierung einzurichten.
2. Gib dein E-Mail-Passwort ein, und tippe auf „Weiter“.

Unter Umständen wirst du zur Eingabe zusätzlicher Serverinformationen aufgefordert. Diese erhältst du von deinem Exchange Server-Administrator.

![iphone-xs-ios13-settings-account-add-exchange-server-steps-crop](https://cdsassets.apple.com/live/7WUAS350/images/ios/locale/de-de/iphone-xs-ios13-settings-account-add-exchange-server-steps-crop.png)

## Inhalte synchronisieren

Nachdem du deinen Exchange-Account eingerichtet hast, kannst du E-Mails, Kontakte, Kalender, Erinnerungen und Notizen synchronisieren. Aktiviere die Daten, die du synchronisieren möchtest, und tippe dann auf „Sichern“.

![iphone-xs-ios13-settings-account-add-exchange-save-steps-crop](https://cdsassets.apple.com/live/7WUAS350/images/ios/locale/de-de/iphone-xs-ios13-settings-account-add-exchange-save-steps-crop.png)

## Die Einstellungen deines Exchange-Accounts bearbeiten

1. Gehe zu „Einstellungen“, und tippe dann auf „Apps“.
2. Tippe auf „Mail“. 
    1. Tippe auf dem iPhone oder iPad auf „Mail-Accounts“.
    2. Tippen bei der Apple Vision Pro auf „Accounts“.
3. Tippe auf deinen Exchange-Account, und wähle die Einstellungen aus, die du ändern möchtest. 
    1. Lege für jede App fest, ob du sie synchronisieren möchtest, indem du sie aktivierst bzw. deaktivierst.
    2. Tippe auf „Mail synchronisieren“, um die Anzahl der Tage zu ändern, an denen Mail mit deinem Exchange-Postfach synchronisiert wird.\*
    3. Tippe auf „Automatische Antwort“, um automatische Abwesenheitsnotizen einzurichten.

Um erweiterte Einstellungen wie [SSL und S/MIME](https://support.apple.com/102245) zu finden und zu ändern, tippe auf den Account-Namen, und tippe dann auf „Erweiterte Einstellungen“.