Automatisiertes ioBroker- und Linux-Update-Skript mit Logging

Einleitung

In der heutigen vernetzten Welt sind regelmäßige Updates für Systemsoftware und Anwendungen entscheidend, um Sicherheit und Stabilität zu gewährleisten. Gerade für ioBroker, eine beliebte Plattform zur Steuerung von Smart-Home-Geräten, und Linux-basierte Systeme ist eine kontinuierliche Aktualisierung wichtig, um von den neuesten Funktionen und Sicherheitsupdates zu profitieren.

Mit diesem Bash-Skript stelle ich eine einfache Lösung vor, die den ioBroker sowie das Linux-Betriebssystem automatisch aktualisiert und dabei alle Schritte in einer Logdatei dokumentiert. Das Skript prüft, ob Updates verfügbar sind, installiert diese und startet den ioBroker bei Bedarf neu. Zusätzlich führt es Systemupdates durch und startet das System automatisch neu, falls dies erforderlich ist. So kannst du sicherstellen, dass dein System stets aktuell ist – ganz ohne manuellen Aufwand. Viel Spaß beim Ausprobieren und Anpassen! 😊

Schritt 1: Skript erstellen

Erstelle zunächst das Bash-Skript. Speichere es als iobroker_update.sh auf deinem System.

Ersetze {Username} durch deinen Usernamen

1
2
3
4
mkdir /home/{Username}/skripte
mkdir /home/{Username}/skripte/logs
 
nano /home/{Username}/skripte/iobroker_update.sh

Füge nun folgendes Skript ein:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#!/bin/bash
 
# ioBroker- und Linux-Update-Skript mit Logging
LOGFILE="/home/iobroker/skripte/logs/iobroker_update.log"
 
# Funktion zum Schreiben ins Log
log_message() {
    echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" | tee -a "$LOGFILE"
}
 
log_message "Update-Skript gestartet..."
 
# Wechseln zum ioBroker-Verzeichnis
cd /opt/iobroker || { log_message "Fehler: ioBroker-Verzeichnis nicht gefunden!"; exit 1; }
 
# ioBroker-Update prüfen und durchführen
log_message "Überprüfe auf ioBroker-Updates..."
UPDATE_AVAILABLE=$(iobroker upgrade | grep "Update available")
 
if [ -n "$UPDATE_AVAILABLE" ]; then
    log_message "Update verfügbar. ioBroker wird aktualisiert..."
 
    # Führe das Update von ioBroker selbst aus
    if iobroker upgrade self; then
        log_message "ioBroker erfolgreich aktualisiert."
 
        # Update aller Module durchführen
        if iobroker upgrade; then
            log_message "Alle Module erfolgreich aktualisiert."
 
            # ioBroker neu starten
            if iobroker restart; then
                log_message "ioBroker wurde erfolgreich neu gestartet."
            else
                log_message "Fehler: ioBroker konnte nach dem Update nicht neu gestartet werden."
            fi
        else
            log_message "Fehler beim Update der ioBroker-Module."
        fi
    else
        log_message "Fehler beim Update von ioBroker."
    fi
else
    log_message "Kein Update verfügbar. ioBroker ist auf dem neuesten Stand."
fi
 
# Linux-Systemupdates durchführen
log_message "Überprüfe und installiere Systemupdates..."
 
# Paketlisten aktualisieren
if sudo apt update -y; then
    log_message "Paketlisten erfolgreich aktualisiert."
 
    # Sicherheits- und Systemupdates installieren
    if sudo apt upgrade -y; then
        log_message "Systemupdates erfolgreich installiert."
 
        # Optional: Neustart, falls benötigt
        if [ -f /var/run/reboot-required ]; then
            log_message "Neustart erforderlich. System wird jetzt neu gestartet."
            sudo reboot
        else
            log_message "Kein Neustart erforderlich."
        fi
    else
        log_message "Fehler bei der Installation der Systemupdates."
    fi
else
    log_message "Fehler beim Aktualisieren der Paketlisten."
fi
 
log_message "Update-Skript beendet."

Speicher und schließe das Skript mit STRG+O und STRG+X

Schritt 2: sudo ohne Passwortabfrage für das Skript einrichten

Damit das Skript ohne Passwortabfrage ausgeführt werden kann, müssen wir die sudoers-Datei anpassen. Das gibt dem Benutzer die Erlaubnis, sudo-Befehle wie apt update, apt upgrade und reboot ohne Passwort auszuführen.

1. Öffne die sudoers-Datei mit dem Befehl:

      1
      sudo visudo

      2. Füge folgende Zeile am Ende der Datei hinzu (ersetze username durch den tatsächlichen Namen des Benutzers, der das Skript ausführt):

      1
      username ALL=(ALL) NOPASSWD: /usr/bin/apt update, /usr/bin/apt upgrade, /usr/sbin/reboot

      3. Speichere die Änderungen und verlasse den Editor.

      Schritt 3: Skript ausführbar machen

      Um das Skript ausführen zu können, müssen wir die Berechtigungen anpassen:

      1
      chmod +x /home/iobroker/skripte/iobroker_update.sh

      Schritt 4: Automatische Ausführung mit cron

      Du kannst das Skript in regelmäßigen Abständen automatisch ausführen lassen, indem du einen cron-Job einrichtest.

      1. Öffne die Crontab-Datei für den Benutzer:

      1
      crontab -e

      2. Füge folgende Zeile hinzu, um das Skript täglich um 3 Uhr morgens auszuführen:

      1
      0 3 * * * /home/iobroker/skripte/iobroker_update.sh

      Hinweis: Die Zeitangaben kannst du nach Bedarf anpassen.

      3. Speichere und schließe die Crontab-Datei.


      Powershell: Windows 11 Bloatware deinstallieren

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      56
      57
      58
      59
      60
      61
      62
      63
      64
      65
      66
      67
      68
      69
      70
      # Registry-Pfad und Schlüsselname für den Check
      $registryPath = "HKLM:\Software\IT und Veranstaltungstechnik Hense\BloadwareRemovalScript"
      $registryValue = "ScriptExecuted"
       
      # Überprüfen, ob der Registry-Wert bereits gesetzt ist
      if (Test-Path -Path "$registryPath\$registryValue") {
          Write-Host "Das Skript wurde bereits ausgeführt. Beende das Skript."
          exit 0
      }
       
      # Liste der Apps, die entfernt werden sollen, einschließlich Cortana
      $appsToRemove = @(
          "Microsoft.MicrosoftSolitaireCollection",
          "Microsoft.XboxGameOverlay",
          "Microsoft.XboxGameCallableUI",
          "Microsoft.Xbox.TCUI",
          "Microsoft.XboxApp",
          "Microsoft.XboxGamingOverlay",
          "Microsoft.XboxIdentityProvider",
          "Microsoft.XboxSpeechToTextOverlay",
          "Microsoft.ZuneMusic",
          "Microsoft.ZuneVideo",
          "Microsoft.BingNews",
          "Microsoft.WindowsMaps",
          "Microsoft.People",
          "Microsoft.SkypeApp",
          "Microsoft.OneConnect",
          "Microsoft.WindowsFeedbackHub",
          "Microsoft.Messaging",
          "Microsoft.549981C3F5F10",  # Cortana ID
          "Microsoft.Copilot",
          "MicrosoftTeams",
          "MicrosoftCorporationII.MicrosoftFamily",
          "Microsoft.OutlookForWindows",
          "Microsoft.MicrosoftOfficeHub",
          "Microsoft.GetHelp",
          "Microsoft.GamingApp",
          "Microsoft.BingSearch",
          "Microsoft.BingWeather",
          "Microsoft.BingNews",
          "Microsoft.Getstarted",
          "Microsoft.ZuneMusic",
          "Microsoft.ZuneVideo",
          "Microsoft.WindowsFeedbackHub",
          "microsoft.windowscommunicationsapps"
      )
       
      # Vorinstallierte Apps für alle Benutzer durchsuchen und entfernen, wenn sie in der Liste stehen
      Get-AppxPackage -AllUsers | ForEach-Object {
          if ($appsToRemove -contains $_.Name) {
              Write-Host "Entferne App: $($_.Name)"
              Remove-AppxPackage -Package $_.PackageFullName -AllUsers
          }
      }
       
      # Vorinstallierte System-Apps entfernen, wenn sie in der Liste stehen
      Get-AppxProvisionedPackage -Online | ForEach-Object {
          if ($appsToRemove -contains $_.DisplayName) {
              Write-Host "Entferne System-App: $($_.DisplayName)"
              Remove-AppxProvisionedPackage -Online -PackageName $_.PackageName
          }
      }
       
      # Nach erfolgreicher Ausführung den Registry-Wert setzen
      if (-not (Test-Path -Path $registryPath)) {
          New-Item -Path $registryPath -Force
      }
      Set-ItemProperty -Path $registryPath -Name $registryValue -Value $true
       
      Write-Host "Das Skript wurde erfolgreich ausgeführt und der Registry-Wert wurde gesetzt."

      Winget-AutoUpdate Deutsche GPO

      Speicere dieses File unter de-DE auf deinem Domain Controler mit dem namen WAU.adml

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      56
      57
      58
      59
      60
      61
      62
      63
      64
      65
      66
      67
      68
      69
      70
      71
      72
      73
      74
      75
      76
      77
      78
      79
      80
      81
      82
      83
      84
      85
      86
      87
      88
      89
      90
      91
      92
      93
      94
      95
      96
      97
      98
      99
      100
      101
      102
      103
      104
      105
      106
      107
      108
      109
      110
      111
      112
      113
      114
      115
      116
      117
      118
      119
      120
      121
      122
      123
      124
      125
      126
      127
      128
      129
      130
      131
      132
      133
      134
      135
      136
      137
      138
      139
      140
      141
      142
      143
      144
      145
      146
      147
      148
      149
      150
      151
      152
      153
      154
      155
      156
      157
      158
      159
      160
      161
      162
      163
      164
      165
      166
      167
      168
      169
      170
      171
      172
      173
      174
      175
      176
      177
      178
      179
      180
      181
      182
      183
      184
      185
      186
      187
      <?xml version="1.0" encoding="utf-8"?>
      <policyDefinitionResources xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" revision="4.8" schemaVersion="1.0" xmlns="http://schemas.microsoft.com/GroupPolicy/2006/07/PolicyDefinitions">
        <displayName>WinGet-AutoUpdate</displayName>
        <description>WinGet-AutoUpdate GPO-Verwaltung</description>
        <resources>
          <stringTable>
            <string id="WAU">Winget-AutoUpdate</string>
            <string id="SUPPORTED_WAU_1_16_0">Winget-AutoUpdate Version 1.16.0 oder höher</string>
            <string id="SUPPORTED_WAU_1_16_5">Winget-AutoUpdate Version 1.16.5 oder höher</string>
            <string id="ActivateGPOManagement_Name">WAU GPO-Verwaltung aktivieren</string>
            <string id="ActivateGPOManagement_Explain">Diese Richtlinie ist ein überschreibender Schalter für die GPO-Verwaltung von Winget-AutoUpdate.</string>
            <string id="BypassListForUsers_Name">Umgehen der Black/White-Liste für Benutzer</string>
            <string id="BypassListForUsers_Explain">Diese Richtlinie legt fest, ob die Black/White-Liste im Benutzerkontext umgangen wird oder nicht.
       
      Wenn diese Richtlinie deaktiviert oder nicht konfiguriert ist, ist der Standardwert "Nein".</string>
            <string id="DisableAutoUpdate_Name">WAU AutoUpdate deaktivieren</string>
            <string id="DisableAutoUpdate_Explain">Diese Richtlinie legt fest, ob WAU AutoUpdate deaktiviert wird oder nicht:
      Standardmäßig ist WAU AutoUpdate aktiviert.
      Es werden keine Konfigurationen, Symbole (wenn personalisiert) oder die Ausschlussliste überschrieben.
       
      Wenn diese Richtlinie deaktiviert oder nicht konfiguriert ist, ist der Standardwert "Nein".</string>
            <string id="DoNotRunOnMetered_Name">WAU auf getakteten Verbindungen ausführen</string>
            <string id="DoNotRunOnMetered_Explain">Diese Richtlinie legt fest, ob WAU auf getakteten Verbindungen ausgeführt wird oder nicht.
       
      Wenn diese Richtlinie deaktiviert oder nicht konfiguriert ist, ist der Standardwert "Nein".</string>
            <string id="UpdatePrerelease_Name">WAU auf PreRelease-Versionen aktualisieren</string>
            <string id="UpdatePrerelease_Explain">Diese Richtlinie legt fest, ob WAU auf PreRelease-Versionen (über WAU AutoUpdate) aktualisiert wird.
       
      Wenn diese Richtlinie deaktiviert oder nicht konfiguriert ist, ist der Standardwert "Nein".</string>
            <string id="BlackList_Name">Anwendungs-GPO-Blacklist</string>
            <string id="BlackList_Explain">Geben Sie die WinGet-IDs der Anwendungen ein, die ausgeschlossen werden sollen.
       
      Wenn diese Richtlinie deaktiviert oder nicht konfiguriert ist, wird die GPO-Blacklist nicht verwendet.</string>
            <string id="WhiteList_Name">Anwendungs-GPO-Whitelist</string>
            <string id="WhiteList_Explain">Geben Sie die WinGet-IDs der Anwendungen ein, die enthalten sein sollen.
       
      Wenn diese Richtlinie deaktiviert oder nicht konfiguriert ist, wird die GPO-Whitelist nicht verwendet.</string>
            <string id="UseWhiteList_Name">Whitelist anstelle der Blacklist verwenden</string>
            <string id="UseWhiteList_Explain">Diese Richtlinie legt fest, ob eine Whitelist verwendet wird oder nicht.
       
      Wenn diese Richtlinie deaktiviert oder nicht konfiguriert ist, ist der Standardwert "Nein".</string>
            <string id="ListPath_Name">Black/White-Liste von externem Pfad (URL/UNC/GPO/Lokal) abrufen</string>
            <string id="ListPath_Explain">Wenn diese Richtlinie aktiviert ist, können Sie einen (URL/UNC/GPO/Lokal)-Pfad für externe Listen festlegen, die nicht der Standardliste entsprechen.
      Wenn die "Anwendungs-GPO-Blacklist/Whitelist" in diesem GPO festgelegt ist, kann der Pfad "GPO" sein.
       
      Wenn diese Richtlinie deaktiviert oder nicht konfiguriert ist, wird der Standard-ListPath verwendet (WAU-Installationsort).</string>
            <string id="ModsPath_Name">Mods von externem Pfad (URL/UNC/Lokal/AzureBlob) abrufen</string>
            <string id="ModsPath_Explain">Wenn diese Richtlinie aktiviert ist, können Sie einen (URL/UNC/Lokal/AzureBlob)-Pfad für externe Mods festlegen, die nicht dem Standard entsprechen.
       
      Wenn diese Richtlinie deaktiviert oder nicht konfiguriert ist, wird der Standard-ModsPath verwendet (WAU-Installationsort).
       
      Hinweis: Wenn auf 'AzureBlob' gesetzt, stellen Sie sicher, dass auch die 'Azure Blob URL mit SAS-Token' konfiguriert ist.</string>
            <string id="BlobURL_Name">Azure Blob-URL mit SAS-Token festlegen</string>
            <string id="BlobURL_Explain">Wenn diese Richtlinie aktiviert ist, können Sie eine Azure Storage Blob-URL mit SAS-Token für die Verwendung mit der 'Mods'-Funktion festlegen. Die URL muss das SAS-Token enthalten und über 'Lese-' und 'Listen'-Berechtigungen verfügen.
       
      Wenn diese Richtlinie deaktiviert oder nicht konfiguriert ist, ist der Wert leer und die Azure Blob-Speicherung wird NICHT funktionieren.</string>
            <string id="NotificationLevel_Name">Benachrichtigungsstufe</string>
            <string id="NotificationLevel_Explain">Wenn diese Richtlinie aktiviert ist, können Sie die Benachrichtigungsstufe konfigurieren:
      1. Voll (Standard)
      2. Nur Erfolg
      3. Keine
       
      Wenn diese Richtlinie deaktiviert oder nicht konfiguriert ist, gilt die Benachrichtigungsstufe: (1. Voll).</string>
            <string id="NotificationLevel_Full">1. Voll (Standard)</string>
            <string id="NotificationLevel_SuccessOnly">2. Nur Erfolg</string>
            <string id="NotificationLevel_None">3. Keine</string>
            <string id="UpdatesInterval_Name">Update-Intervall</string>
            <string id="UpdatesInterval_Explain">Wenn diese Richtlinie aktiviert ist, können Sie das Update-Intervall konfigurieren:
      1. Täglich (Standard)
      2. Zweitägig
      3. Wöchentlich
      4. Zweiwöchentlich
      5. Monatlich
      6. Nie (z. B. in Kombination mit 'Updates beim Anmelden')
       
      Wenn diese Richtlinie deaktiviert oder nicht konfiguriert ist, ist das Update-Intervall: (1. Täglich).</string>
            <string id="UpdatesInterval_Daily">1. Täglich (Standard)</string>
            <string id="UpdatesInterval_BiDaily">2. Zweitägig</string>
            <string id="UpdatesInterval_Weekly">3. Wöchentlich</string>
            <string id="UpdatesInterval_BiWeekly">4. Zweiwöchentlich</string>
            <string id="UpdatesInterval_Monthly">5. Monatlich</string>
            <string id="UpdatesInterval_Never">6. Nie</string>
            <string id="UpdatesAtLogon_Name">Updates beim Anmelden</string>
            <string id="UpdatesAtLogon_Explain">Diese Richtlinie legt fest, ob WAU beim Benutzeranmelden ausgeführt wird oder nicht.
       
      Wenn diese Richtlinie deaktiviert oder nicht konfiguriert ist, ist der Standardwert "Nein".</string>
            <string id="UpdatesAtTime_Name">Updates zur festgelegten Zeit</string>
            <string id="UpdatesAtTime_Explain">Wenn diese Richtlinie aktiviert ist, können Sie die geplante Update-Zeit konfigurieren:
      Von 01:00 bis 24:00 Uhr (24-Stunden-Zeit)
       
      Wenn diese Richtlinie deaktiviert oder nicht konfiguriert ist, ist die Update-Zeit: (06:00 Uhr).</string>
            <string id="UpdatesAtTime01">01:00 Uhr</string>
            <string id="UpdatesAtTime02">02:00 Uhr</string>
            <string id="UpdatesAtTime03">03:00 Uhr</string>
            <string id="UpdatesAtTime04">04:00 Uhr</string>
            <string id="UpdatesAtTime05">05:00 Uhr</string>
            <string id="UpdatesAtTime06">06:00 Uhr (Standard)</string>
            <string id="UpdatesAtTime07">07:00 Uhr</string>
            <string id="UpdatesAtTime08">08:00 Uhr</string>
            <string id="UpdatesAtTime09">09:00 Uhr</string>
            <string id="UpdatesAtTime10">10:00 Uhr</string>
            <string id="UpdatesAtTime11">11:00 Uhr</string>
            <string id="UpdatesAtTime12">12:00 Uhr</string>
            <string id="UpdatesAtTime13">13:00 Uhr</string>
            <string id="UpdatesAtTime14">14:00 Uhr</string>
            <string id="UpdatesAtTime15">15:00 Uhr</string>
            <string id="UpdatesAtTime16">16:00 Uhr</string>
            <string id="UpdatesAtTime17">17:00 Uhr</string>
            <string id="UpdatesAtTime18">18:00 Uhr</string>
            <string id="UpdatesAtTime19">19:00 Uhr</string>
            <string id="UpdatesAtTime20">20:00 Uhr</string>
            <string id="UpdatesAtTime21">21:00 Uhr</string>
            <string id="UpdatesAtTime22">22:00 Uhr</string>
            <string id="UpdatesAtTime23">23:00 Uhr</string>
            <string id="UpdatesAtTime24">24:00 Uhr</string>
            <string id="UserContext_Name">Ausführung im Benutzerkontext</string>
            <string id="UserContext_Explain">Diese Richtlinie legt fest, ob die Ausführung im Benutzerkontext aktiviert wird oder nicht.
       
      Wenn diese Richtlinie deaktiviert oder nicht konfiguriert ist, ist der Standardwert "Nein".</string>
            <string id="DesktopShortcut_Name">Desktop-Verknüpfung aktivieren [VERALTET]</string>
            <string id="DesktopShortcut_Explain">Diese Richtlinie legt fest, ob eine Desktop-Verknüpfung aktiviert wird oder nicht:
      WAU - Apps auf Updates prüfen
       
      Wenn diese Richtlinie deaktiviert oder nicht konfiguriert ist, ist der Standardwert "Nein".</string>
            <string id="StartMenuShortcut_Name">Startmenü-Verknüpfungen aktivieren [VERALTET]</string>
            <string id="StartMenuShortcut_Explain">Diese Richtlinie legt fest, ob die Startmenü-Verknüpfungen aktiviert werden oder nicht:
      WAU - Apps auf Updates prüfen
      WAU - Protokolle öffnen
      WAU - Web-Hilfe
       
      Wenn diese Richtlinie deaktiviert oder nicht konfiguriert ist, ist der Standardwert "Nein".</string>
            <string id="MaxLogFiles_Name">Protokoll: Anzahl der zulässigen Protokolldateien</string>
            <string id="MaxLogFiles_Explain">Wenn diese Richtlinie aktiviert ist, können Sie die Anzahl der zulässigen Protokolldateien festlegen:
      Wenn MaxLogFiles auf 0 gesetzt ist, werden keine alten archivierten Protokolldateien gelöscht, 1 behält die Originaldatei bei und lässt sie nur weiter wachsen.
      Die Standardanzahl beträgt 3 (0-99).
       
      Wenn diese Richtlinie deaktiviert oder nicht konfiguriert ist, wird die Standardanzahl verwendet.</string>
            <string id="MaxLogSize_Name">Protokoll: Größe der Protokolldatei in Bytes vor dem Drehen</string>
            <string id="MaxLogSize_Explain">Wenn diese Richtlinie aktiviert ist, können Sie die Größe der Protokolldatei in Bytes festlegen, bevor sie rotiert wird.
      Die Standardgröße beträgt 1048576 = 1 MB.
       
      Wenn diese Richtlinie deaktiviert oder nicht konfiguriert ist, wird die Standardgröße verwendet.</string>
          </stringTable>
          <presentationTable>
            <presentation id="BlackList">
              <listBox refId="BlackList">Blacklist:</listBox>
            </presentation>
            <presentation id="WhiteList">
              <listBox refId="WhiteList">Whitelist:</listBox>
            </presentation>
            <presentation id="ListPath">
              <textBox refId="ListPath">
                <label>(URL/UNC/GPO/Lokal) Pfad:</label>
              </textBox>
            </presentation>
            <presentation id="ModsPath">
              <textBox refId="ModsPath">
                <label>(URL/UNC/Lokal/AzureBlob) Pfad:</label>
              </textBox>
            </presentation>
            <presentation id="BlobURL">
                  <textBox refId="BlobURL">
                        <label>Azure Storage-URL mit SAS-Token:</label>
                  </textBox>
            </presentation>
            <presentation id="NotificationLevel">
              <dropdownList refId="NotificationLevel"/>
            </presentation>
            <presentation id="UpdatesInterval">
              <dropdownList refId="UpdatesInterval"/>
            </presentation>
            <presentation id="UpdatesAtTime">
              <dropdownList refId="UpdatesAtTime"/>
            </presentation>
            <presentation id="MaxLogFiles">
              <textBox refId="MaxLogFiles">
                <label>Zulässige Protokolldateien:</label>
              </textBox>
            </presentation>
            <presentation id="MaxLogSize">
              <textBox refId="MaxLogSize">
                <label>Größe der Protokolldatei:</label>
              </textBox>
            </presentation>
          </presentationTable>
        </resources>
      </policyDefinitionResources>


      ADUserTool – Einfaches Erstellen von Active Directory Benutzern mit GUI

      Verwalte Active Directory Benutzer schnell und effizient mit dem ADUserTool! Dieses benutzerfreundliche Tool bietet eine grafische Benutzeroberfläche (GUI), um neue Benutzer einfach zu erstellen und automatisch ein sicheres Passwort zu generieren. Das Tool richtet sich an Administratoren, die eine schnelle und intuitive Lösung suchen, um Active Directory Benutzer hinzuzufügen, ohne komplizierte Skripte schreiben zu müssen.

      Hauptfunktionen:

      • Benutzerfreundliche GUI zur Erstellung neuer AD-Benutzer
      • Automatische Generierung eines sicheren Passworts
      • Erstellung eines Logon-Skripts, das den Benutzern zugewiesen wird (manuell anpassbar)
      • Protokollierung der Benutzererstellung in detaillierten Logdateien
      • Automatische Verknüpfungserstellung auf dem Desktop und im Startmenü

      Installation:

      Laden Sie das Tool herunter und führen Sie die Installation als Administrator aus. Das Tool wird unter C:\Program Files\ADUserTool installiert und erstellt Verknüpfungen, um einen einfachen Zugriff auf das Tool zu gewährleisten.

      Verwendung:

      Nach der Installation können Sie das Tool über die Desktop-Verknüpfung oder das Startmenü starten. Geben Sie die erforderlichen Informationen wie Vorname, Nachname und E-Mail des Benutzers ein, und das Tool erledigt den Rest!


      Download:

      Laden Sie das ADUserTool jetzt herunter und vereinfachen Sie Ihre AD-Benutzerverwaltung:

      Download ADUserTool


      WireGuard Site-to-Site VPN Verbindung mit zwei Linux Server

      Für die Einrichtung einer WireGuard Site-to-Site VPN-Verbindung zwischen zwei Servern benötigen wir zwei Linux-Server, auf denen das Betriebssystem installiert ist. Im folgenden Beispiel werden wir davon ausgehen, dass beide Server über das gleiche Betriebssystem (z. B. Ubuntu oder Debian) verfügen.

      Beispiel Daten die in dieser Doku Verwendet werden:

      Subnet Server-1: 192.168.0.0/24
      Subnet Server-2: 192.168.178.0/24

      Beide Server

      Zunächst solltest du sicherstellen, dass beide Server auf dem neuesten Stand sind, indem du alle verfügbaren Updates installierst. Dies kannst du mit den folgenden Befehlen tun:

      1
      apt-get update && apt-get upgrade -y

      Anschließend installieren wir WireGuard auf beiden Servern. Auf beiden Servern kannst du dies mit dem folgenden Befehl tun:

      1
      apt install wireguard

      Damit der Server Daten zwischen den Netzwerken weiterleiten kann, muss die IP-Weiterleitung aktiviert werden. Dies erfolgt durch die Bearbeitung der Datei /etc/sysctl.conf. Öffne die Datei mit einem Texteditor:

      1
      2
      3
      nano /etc/sysctl.conf
       
      uncomment net.ipv4.ip_forward=1

      Suche die Zeile mit net.ipv4.ip_forward=1 und entferne das Kommentarzeichen (#) davor. Dadurch wird die IP-Weiterleitung aktiviert. Speichere die Datei und schließe den Editor. Wende die Änderungen an, indem du den folgenden Befehl ausführst:

      1
      sysctl -p

      WireGuard benötigt für jede Verbindung ein Public/Private Key-Paar. Dies kannst du auf jedem Server generieren:

      1
      2
      3
      cd /etc/wireguard
       
      umask 077; wg genkey | tee privatekey | wg pubkey > publickey

      Dieser Befehl generiert ein PrivateKey und ein PublicKey, die du später in der Konfiguration verwenden wirst.

      Server 1

      Für Server 1 erstellen wir die Datei wg0.conf, welche die Verbindungseinstellungen enthält. Öffne dafür die Konfigurationsdatei:

      1
      nano /etc/wireguard/wg0.conf

      Füge die folgenden Konfigurationen ein, wobei du die Platzhalter <site-1 private-key> und <site-2 public-key> durch die entsprechenden Schlüssel ersetzt:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      [Interface]
      PrivateKey = <site-1 private-key>
      Address = 10.0.0.1/24
      SaveConfig = true
      PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
      PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
      ListenPort = 51820
       
      [Peer]
      PublicKey = <site-2 public-key>
      AllowedIPs = 10.0.0.0/24, 192.168.178.0/24
      PersistentKeepalive = 25

      Erklärung:

      • PrivateKey: Der private Schlüssel von Server 1.
      • Address: Die IP-Adresse, die Server 1 im VPN-Netzwerk verwenden soll.
      • PostUp und PostDown: Befehle, die ausgeführt werden, wenn die VPN-Verbindung gestartet oder gestoppt wird, um die Netzwerkrouten zu konfigurieren.
      • Peer: Hier definieren wir Server 2 als Peer und geben den öffentlichen Schlüssel von Server 2 sowie die erlaubten IP-Bereiche an.

      Server 2

      Für Server 2 erstellst du ebenfalls eine wg0.conf-Datei. Öffne die Konfigurationsdatei mit:

      1
      nano /etc/wireguard/wg0.conf

      Füge die folgenden Konfigurationen ein, wobei du die Platzhalter <site-2 private-key> und <site-1 public-key> durch die entsprechenden Schlüssel ersetzt und den Platzhalter <FQDN> durch deinen Öffentlichen DYNDNS Namen.

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      [Interface]
      PrivateKey = <site-2 private-key>
      Address = 10.0.0.3/24
      SaveConfig = true
      PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
      PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
       
      [Peer]
      PublicKey = <site-1 public-key>
      Endpoint = <FQDN>:51820
      AllowedIPs = 10.0.0.0/24, 192.168.0.0/24
      PersistentKeepalive = 25

      Erklärung:

      • PrivateKey: Der private Schlüssel von Server 2.
      • Address: Die IP-Adresse, die Server 2 im VPN-Netzwerk verwenden soll.
      • Endpoint: Die öffentliche IP-Adresse oder der FQDN von Server 1.
      • AllowedIPs: Hier definieren wir, welche IP-Bereiche von Server 2 erreichbar sind.

      Beide Server

      Nachdem die Konfigurationsdateien auf beiden Servern erstellt wurden, kannst du die VPN-Verbindung starten:

      1
      wg-quick up wg0

      Um den Status der VPN-Verbindung zu überprüfen, kannst du den folgenden Befehl verwenden:

      1
      wg show

      Um sicherzustellen, dass die VPN-Verbindung bei jedem Neustart des Servers automatisch gestartet wird, kannst du WireGuard so konfigurieren, dass es beim Hochfahren des Systems startet:

      1
      systemctl enable wg-quick@wg0

      Damit ist die VPN-Verbindung automatisch aktiv, wenn der Server hochfährt.

      Wenn man den Wireguard Dienst beenden will muss man folgenden Befehl verwenden.

      1
      wg-quick down wg0

      Mit dieser Konfiguration hast du nun eine funktionierende WireGuard Site-to-Site VPN-Verbindung zwischen zwei Linux-Servern eingerichtet.


      Gezielter AD-Join mit Powershell Skript

      Allgemeine Informationen

      Dieses PowerShell-Skript ermöglicht es, einen Computer automatisch umzubenennen und anschließend einer spezifischen Active Directory-Domäne beizutreten. Zusätzlich wird der Computer in eine vorgegebene Organizational Unit (OU) verschoben. Standardmäßig führt das Skript nach diesen Änderungen einen Neustart durch, um sicherzustellen, dass alle Anpassungen wirksam werden.

      Skript

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      56
      57
      58
      59
      60
      61
      62
      63
      64
      65
      66
      67
      68
      69
      # Funktion zur Überprüfung, ob das Skript als Administrator ausgeführt wird
      function Ensure-RunAsAdministrator {
          $currentUser = [Security.Principal.WindowsIdentity]::GetCurrent()
          $isAdmin = (New-Object Security.Principal.WindowsPrincipal($currentUser)).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)
       
          if (-not $isAdmin) {
              Write-Host "Das Skript wird nicht als Administrator ausgeführt. Starte das Skript als Administrator neu."
              Start-Process powershell -ArgumentList "-NoProfile -ExecutionPolicy Bypass -File `"$PSCommandPath`"" -Verb RunAs
              exit
          }
      }
       
      # Funktion zur Überprüfung der Windows-Edition (muss mindestens "Pro" oder höher sein)
      function Check-WindowsEdition {
          $edition = (Get-WmiObject -Class Win32_OperatingSystem).OperatingSystemSKU
       
          # Windows Pro und höher haben die folgenden SKU-Codes: 48 = Pro, 49 = Pro N, 50 = Enterprise, 51 = Education, etc.
          $allowedEditions = @(48, 49, 50, 51)
       
          if ($allowedEditions -notcontains $edition) {
              Write-Host "Das Betriebssystem unterstützt keinen Beitritt zur Domäne. Es wird mindestens Windows Pro oder eine höhere Version benötigt."
              pause
              exit
          } else {
              Write-Host "Das Betriebssystem unterstützt den Beitritt zur Domäne."
          }
      }
       
      # Admin-Rechte sicherstellen
      Ensure-RunAsAdministrator
       
      # Überprüfen, ob die Windows-Edition "Pro" oder höher ist
      Check-WindowsEdition
       
      # Variablen definieren
      $domäne = "DeineDomäne.local"  # Hier die Domäne eintragen
      $Benutzername = "DomänenBenutzer"  # Hier den Domänenbenutzernamen eintragen
      $Passwort = "DomänenPasswort"  # Hier das Domänenpasswort eintragen
      $ou = "OU=Computer,OU=Standort,DC=DeineDomäne,DC=local"  # Hier die gewünschte OU eintragen
      $AdminBenutzer = "$domäne\$Benutzername"
      $neuerComputername = Read-Host "Bitte geben Sie den neuen Computernamen ein"
       
      # Funktion zum Join in die Domäne mit spezieller OU und ohne Neustart
      function Join-ComputerToDomain {
          $securePassword = ConvertTo-SecureString $Passwort -AsPlainText -Force
          $credentials = New-Object System.Management.Automation.PSCredential($AdminBenutzer, $securePassword)
             
          Add-Computer -DomainName $domäne -NewName $neuerComputername -Credential $credentials -OUPath $ou -PassThru -Force | Out-Null
          Write-Host "Der Computer wurde in die Domäne $domäne in die OU $ou aufgenommen"
      }
       
      # Funktion um Benutzer nach Neustart zu fragen (Standard ist Neustart)
      function Prompt-Restart {
          $response = Read-Host "Möchten Sie den Neustart abbrechen? (nein/ja) [nein]"
             
          if ($response -eq "ja") {
              Write-Host "Neustart wurde abgebrochen. Änderungen werden nach einem manuellen Neustart aktiv."
          } else {
              Write-Host "Der Computer wird jetzt neu gestartet..."
              Restart-Computer -Force
          }
      }
       
      # Ausführen
      # Computer zur Domäne hinzufügen
      Join-ComputerToDomain
       
      # Benutzer nach Neustart fragen (Standard ist Neustart)
      Prompt-Restart

      Skript ausführen

      Schritt 1: PowerShell-Skript herunterladen und anpassen

      1. Erstelle das Skript lokal auf deinem Rechner.
      2. Öffne das Skript in einem Texteditor (z. B. Notepad, Visual Studio Code) und passe die folgenden Variablen entsprechend deinen Anforderungen an:
      • $domäne: Hier den Namen deiner Domäne eintragen (z. B. DeineDomäne.local).
      • $Benutzername: Der Benutzername eines Domänenadministrators.
      • $Passwort: Das Passwort des Domänenadministrators (Achtung: Verwende starke Passwörter!).
      • $ou: Die Organisationseinheit (OU), in der die Computer hinzugefügt werden sollen.

      Speichere die Änderungen ab, sobald du alle Variablen angepasst hast.

      Schritt 2: PowerShell ausführen

      Öffne die CMD als Administrator und gebe folgenden Befehl ein.

      1
      powershell.exe -ExecutionPolicy Bypass -File C:\Pfad\Zu\Deinem\Skript.ps1

      Yourls URL Shorter unter Linux installieren

      apt install lamp-server^
      mysql
      CREATE DATABASE yourls;
      CREATE USER 'yourlsuser'@'localhost' IDENTIFIED BY 'password_here';
      GRANT ALL PRIVILEGES ON yourls.* TO 'yourlsuser'@'localhost';
      FLUSH PRIVILEGES;
      EXIT;
      apt install git
      cd /var/www/
       
      mv YOURLS yourls
      cd yourls/user
      cp config-sample.php config.php
       
      nano config.php
      chown -R www-data:www-data /var/www/yourls
      chmod -R 775 /var/www/yourls
      nano /etc/apache2/apache2.conf
       
      Change the: AllowOverride None to AllowOverride All
      a2enmod rewrite
      nano /etc/apache2/sites-available/yourls.conf
      &lt;VirtualHost *:80>
          ServerName short.domain.com
          DocumentRoot "/var/www/yourls"
       
          &lt;Directory "/var/www/yourls">
              Require all granted
              Options Indexes FollowSymLinks
              AllowOverride All
              Order allow,deny
              Allow from all
          &lt;/Directory>
       
         ErrorLog ${APACHE_LOG_DIR}/error.log
         CustomLog ${APACHE_LOG_DIR}/access.log combined
          
      &lt;/VirtualHost>
      a2ensite yourls.conf
      service apache2 restart
      chmod 0600 /var/www/yourls/user/config.php
      apt install certbot python3-certbot-apache
       
      certbot --apache -m master@domain.com -d cloud.domain.com

      Nextcloud – Datenspeicher auf eine Mount Point umziehen

      Ich wollte meinen Nextcloud Speicher auf mein NAS umziehen.

      Bedeutet die Nextcloud läuft weiterhin auf einer VM nur die Hochgeladenen Dateien sollen auf dem NAS liegen.

      Vorbereitungen

      Als erstes musst du einen neuen User auf deinem NAS erstellen.

      NAS Mounten

      Gehe hierfür in den fstab

      nano /etc/fstab
      //IP-Adresse_vom_NAS/Freigabe_Ordner  /mountpoint_Verzeichniss cifs username=Username_vom_NAS,password=Passwort_vom_NAS,uid=33,gid=33 0 0

      Systemlink erstellen

      ln -s /Pfad/zum/MountPoint /Pfad/zum/symlink /Pfad/zum/Systemlink

      Rechte setzen

      chown -R www-data:www-data /Pfad/zum/Systemlink
       
      chmod -R 755 /Pfad/zum/Systemlink

      Nextcloud – Daten Automatisch löschen

      Ich hatte die Anforderung das die Daten in der Nextcloud nach 30 Tagen automatisch gelöscht werden sollen. Dann habe ich mich hingesetzt und ein Bash Skripte geschrieben. Ebenfalls sollten bestimmte User ausgenommen werden. Das habe ich auch mit aufgenommen.

      #!/bin/sh
      # Script zum löschen der Nextcloud Dateien nach X Tagen
       
      # 0 = 24 Stunden
      LOESCHEN_NACH_TAGEN=29
      NEXTCLOUD_DATA=/mnt/ncdata
       
      dirs=$(find $NEXTCLOUD_DATA -maxdepth 1 -type d -printf "%f\n" | awk  '!match($0,/^(ncdata|Allgemein|appdata_oc65lc0lmz8d|root|files_external|\
      Admin|\
      8561CAA3-924D-4591-9AB4-2077C4076AD3|\
      B8F060D2-A833-4F3D-AD19-4992243E587E|\
      F3031267-8C27-4141-8826-6CA337742B67\
      )$/)')
       
      echo "\nFolgende Ordner werden gescannt:"
      echo $dirs
       
      for d in $dirs; do
          if [ -d "$NEXTCLOUD_DATA/$d/files" ]; then
            echo "\n\n#############################################################################"
            echo "\nPruefe auf Daten im Benutzerordner $NEXTCLOUD_DATA/$d/files - diese Dateien werden gelöscht:"
            find $NEXTCLOUD_DATA/$d/files/ -type f -ctime +$LOESCHEN_NACH_TAGEN -delete
            find $NEXTCLOUD_DATA/$d/files/ -mindepth 1 -type d -ctime +$LOESCHEN_NACH_TAGEN -delete
            echo "\nExplizite Bereinigung und Pruefung des Benutzers $d auf Konsistenz"
            sudo -u www-data /usr/bin/php /var/www/nextcloud/occ files:scan --path $d/files
          else
            echo "\n\n#############################################################################"
            echo "\n$d wird uebersprungen, da der Ordner $NEXTCLOUD_DATA/$d/files nicht vorhanden ist"
          fi
      done
       
       
      for d in $dirs; do
          if [ -d "$NEXTCLOUD_DATA/$d/files_trashbin/files" ]; then
            echo "\n\n#############################################################################"
            echo "\nPruefe auf Daten im Benutzerordner $NEXTCLOUD_DATA/$d/files - diese Dateien werden gelöscht:"
            find $NEXTCLOUD_DATA/$d/files/ -type f -ctime +$LOESCHEN_NACH_TAGEN -delete
            find $NEXTCLOUD_DATA/$d/files/ -mindepth 1 -type d -ctime +$LOESCHEN_NACH_TAGEN -delete
            echo "\nExplizite Bereinigung und Pruefung des Benutzers $d auf Konsistenz"
            sudo -u www-data /usr/bin/php /var/www/nextcloud/occ files:scan --path $d/files
          else
            echo "\n\n#############################################################################"
            echo "\n$d wird uebersprungen, da der Ordner $NEXTCLOUD_DATA/$d/files nicht vorhanden ist"
          fi
      done
       
       
      echo "\n\n#############################################################################"
      echo "\nFinale Bereinigung und pruefen der Benutzerdaten auf Konsistenz"
      sudo -u www-data /usr/bin/php /var/www/nextcloud/occ files:scan --all
      sudo -u www-data /usr/bin/php /var/www/nextcloud/occ files:scan-app-data
      sudo -u www-data /usr/bin/php /var/www/nextcloud/occ files:cleanup
       
      echo "\nScript abgeschlossen"

      Im Anschluss muss noch das Skript ausführbar gemacht werden und in den Crontab eingebunden werden.

      sudo chmod +x ./Skriptname.sh
      sudo crontab -e
      0 0 * * * /root/nextcloud_autodelete.sh > /var/log/nextcloud_autodelete_`date +\%Y-\%m-\%d_\%H:\%M:\%S-cron.log`

      Heimdall installation unter Linux im Docker

      Was ist Heimdall

      Heimdall ist ein Dashboard mit dem du dir all deine Webanwendungen organisieren kannst. Es ist auch möglich eine Suchzeile für Google, Bing und DuckDuckGo einzubinden.

      Installation

      Docker

      apt-get update &amp;&amp; apt-get upgrade -y
       
      apt install docker.io docker-compose -y
       
      mkdir /heimdall
       
      cd /heimdall
       
      mkdir /heimdall-data
       
      nano docker-compose.yml
      version: "2.2"
      services:
        heimdall:
          image: linuxserver/heimdall
          container_name: heimdall
          volumes:
            - /heimdall-data:/config
          environment:
            - PUID=1000
            - PGID=1000
            - TZ=Europe/Berlin
          ports:
            - 80:80
            - 443:443
          restart: unless-stopped
      docker-compose up -d