Compare commits

...

2 Commits

Author SHA1 Message Date
d77bdac13f sharepoint 2026-03-17 08:29:02 +01:00
40fa971f06 . 2026-03-16 12:31:44 +01:00
15 changed files with 272 additions and 741 deletions

View File

@@ -0,0 +1,49 @@
# SOP: Export von Druckprotokollen in MySQL (drucklog_export_v.0.1.ps1)
## 1. Zweck des Skripts
Dieses PowerShell-Skript dient der zentralen Erfassung von Druckvorgängen auf Windows-Servern oder Workstations. Es liest das Ereignisprotokoll `Microsoft-Windows-PrintService/Operational` (Event ID 307) aus und überträgt die Details (Benutzer, Dokumentname, Seitenanzahl, Drucker) in eine MySQL-Datenbank (`drucklog`).
**Nutzen:** Ermöglicht die langfristige Analyse des Druckaufkommens und die Erstellung von Reports für die IT-Administration.
## 2. Voraussetzungen & Installation
Damit das Skript ordnungsgemäß ausgeführt werden kann, müssen folgende Voraussetzungen erfüllt sein:
* **MySQL Connector NET:** Das Skript erwartet die `MySql.Data.dll` im Pfad:
`C:\Program Files (x86)\MySQL\MySQL Connector NET 9.4\MySql.Data.dll`
* **PrintService Log:** Das "Operational"-Protokoll im Windows Event Viewer muss **aktiviert** sein.
* **MySQL Datenbank:** Eine Datenbank namens `drucklog` mit der entsprechenden Tabellenstruktur muss auf dem Host `10.102.1.65` vorhanden sein.
## 3. Zentrale Konfiguration (Skript-Header)
Die Verbindungsparameter sind im Skript wie folgt definiert:
* **MySQL-Host:** `10.102.1.65`
* **Datenbank-Benutzer:** `svc.druckerlog`
* **Datenbank-Passwort:** (Im Skript hinterlegt)
* **Ziel-Datenbank:** `drucklog`
* **Log-Pfad:** `C:\Tools\drucklog_task.log` (Überprüfung der Skriptausführung)
## 4. Ausführung & Automatisierung
Das Skript kann manuell oder über die **Windows Aufgabenplanung (Task Scheduler)** ausgeführt werden.
### Manueller Test (PowerShell):
```powershell
# In das Verzeichnis wechseln und ausführen
.\drucklog_export_v.0.1.ps1
```
### Empfohlene Automatisierung (Task Scheduler):
* **Trigger:** Täglich, Wiederholung alle 1 Stunde.
* **Aktion:** `powershell.exe`
* **Argumente:** `-ExecutionPolicy Bypass -File "C:\Scripts\drucklog_export_v.0.1.ps1"`
## 5. Monitoring & Protokollierung
Das Skript schreibt bei jedem Durchlauf einen Zeitstempel in die lokale Datei:
`C:\Tools\drucklog_task.log`
Bei Fehlern in der Datenbankverbindung prüfen Sie bitte, ob der MySQL-Host `10.102.1.65` vom lokalen System aus erreichbar ist (Port 3306).
## 6. Sicherheitshinweis
**Achtung:** Das Skript enthält Datenbank-Zugangsdaten im Klartext. Stellen Sie sicher, dass die NTFS-Berechtigungen auf dem Windows-Server so gesetzt sind, dass nur das IT-Team Zugriff auf das Skriptverzeichnis hat.
---
*Erstellt für die IT-Dokumentation - Projekt: IT Internal Repository*

View File

@@ -0,0 +1,38 @@
# SOP: Bereinigung alter Datensätze (delete_old_records.py)
## 1. Zweck des Skripts
Dieses Python-Skript dient der automatischen Bereinigung (Housekeeping) unserer MySQL-Datenbanken. Es entfernt veraltete Datensätze, die eine definierte Aufbewahrungsfrist (Retention Period) überschritten haben, um die Datenbankgröße zu kontrollieren und die Abfragegeschwindigkeit zu optimieren.
## 2. Voraussetzungen
* **Python Version:** Mindestens Python 3.8.
* **Bibliotheken:** `mysql-connector-python`, `python-dotenv`.
* **Datenbankzugriff:** Das Skript benötigt einen Benutzer mit `DELETE`-Berechtigungen auf die entsprechenden Tabellen.
## 3. Konfiguration
Die Steuerung des Skripts erfolgt über eine `.env`-Datei oder direkt im Skript-Header:
* **DB_HOST:** IP des Datenbankservers (z. B. `10.102.1.65`).
* **RETENTION_DAYS:** Anzahl der Tage, nach denen Daten gelöscht werden (Standard: X Tage).
* **DRY_RUN:** Wenn auf `True` gesetzt, zeigt das Skript nur an, was gelöscht würde, ohne die Datenbank tatsächlich zu verändern.
## 4. Ausführung
Es wird empfohlen, das Skript regelmäßig als Cronjob (Linux) oder Task Scheduler (Windows) auszuführen.
### Testlauf (Dry-Run):
```bash
python3 delete_old_records.py --mode dry-run
```
### Scharfe Ausführung:
```bash
python3 delete_old_records.py --mode execute
```
## 5. Monitoring & Logs
Alle Löschvorgänge werden in der Standardausgabe und optional in einer Log-Datei protokolliert. Prüfen Sie regelmäßig die Anzahl der gelöschten Datensätze, um sicherzustellen, dass die Logik korrekt arbeitet.
## 6. Sicherheitshinweis
**Achtung:** Gelöschte Daten können nicht ohne Backup wiederhergestellt werden. Führen Sie vor größeren Änderungen an der Aufbewahrungslogik immer ein Datenbank-Backup durch.
---
*Erstellt für die IT-Dokumentation - Projekt: IT Internal Repository*

View File

@@ -0,0 +1,41 @@
# SOP: Automatisierter PDF-Import aus O365 (import_pdf_from_o365_de.v2.2.py)
## 1. Zweck des Skripts
Dieses Python-Skript automatisiert den Import von PDF-Dokumenten aus der Microsoft 365-Umgebung (z.B. Outlook-Postfächer oder SharePoint) in das lokale IT-Dateisystem. Es dient zur effizienten Digitalisierung von Dokumenten, die als E-Mail-Anhänge eingehen.
## 2. Voraussetzungen & Bibliotheken
Um das Skript auszuführen, sind folgende Module notwendig:
* **Python:** Version 3.8+
* **Module:** `pip install O365 requests python-dotenv`
* **Infrastruktur:** Eine registrierte Anwendung in Azure AD (Entra ID) mit den entsprechenden API-Berechtigungen (`Mail.Read`, `Files.Read`).
## 3. Zentrale Konfiguration
Das Skript benötigt eine `.env`-Datei mit folgenden Zugangsdaten:
* **CLIENT_ID:** Die ID der registrierten Azure-App.
* **CLIENT_SECRET:** Das zugehörige Client-Secret für die Authentifizierung.
* **TARGET_FOLDER:** Der lokale Pfad, in dem die PDF-Dateien gespeichert werden sollen.
* **MAILBOX:** Die E-Mail-Adresse des zu überwachenden Postfachs.
## 4. Ausführung & Betrieb
Das Skript kann sowohl manuell als auch automatisiert über einen Dienst oder Cronjob gestartet werden.
### Manueller Start:
```bash
# Skript manuell aufrufen
python3 import_pdf_from_o365_de.v2.2.py
```
### Fehlerbehebung (Troubleshooting):
* **Authentifizierungsfehler:** Prüfen Sie, ob das Client-Secret abgelaufen ist oder die Berechtigungen in Azure AD korrekt gesetzt sind.
* **Download-Fehler:** Stellen Sie sicher, dass das Zielverzeichnis vorhanden ist und Schreibrechte bestehen.
## 5. Monitoring
Die Ausführung des Skripts wird standardmäßig protokolliert. Bei erfolgreichem Import werden die entsprechenden Log-Einträge erstellt, die den Dateinamen und den Zeitstempel enthalten.
## 6. Sicherheitshinweis
Bewahren Sie die `.env`-Datei sicher auf und geben Sie das **Client-Secret** niemals an unbefugte Personen weiter. Es wird empfohlen, die Secret-Rotation gemäß IT-Sicherheitsrichtlinien regelmäßig durchzuführen.
---
*Erstellt für die IT-Dokumentation - Projekt: IT Internal Repository*

View File

@@ -0,0 +1,71 @@
# SOP: Konfiguration Postfix SMTP Relay (APS-SMTP01)
## 1. Zweck & Übersicht
Diese Dokumentation beschreibt die Konfiguration des zentralen Postfix Mail-Relays (**APS-SMTP01**). Das System dient als Brücke, um internen Geräten (Druckern, Scannern) und automatisierten IT-Skripten den E-Mail-Versand über unseren offiziellen Provider zu ermöglichen.
**System-Details:**
* **Server:** Linux (Ubuntu/Fedora basierend)
* **Hostname:** `aps-smtp01.aps.local`
* **IP-Adresse:** [Bitte interne IP ergänzen]
* **Dienst:** Postfix (MTA - Mail Transfer Agent)
## 2. Zentrale Konfigurationsdateien
Die gesamte Konfiguration befindet sich im Verzeichnis `/etc/postfix/`. Die wichtigsten Dateien sind:
* **`/etc/postfix/main.cf`**: Die Hauptkonfigurationsdatei mit den globalen Parametern.
* **`/etc/postfix/sasl_passwd`**: Enthält die Zugangsdaten für den externen Relay-Host (verschlüsselt via postmap).
* **`/etc/aliases`**: Definiert E-Mail-Weiterleitungen für lokale Benutzer.
## 3. Konfigurations-Ausschnitt (main.cf)
Die folgenden Parameter sind für den Betrieb als Relay entscheidend:
```bash
# Beispiel-Konfiguration für Relay mit Authentifizierung
relayhost = [smtp.dein-provider.de]:587
mynetworks = 127.0.0.0/8, 192.168.1.0/24 [Hier interne Subnetze erlauben]
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_tls_security_level = may
header_size_limit = 4096000
```
## 4. Administrative Befehle & Wartung
Nach Änderungen an der Konfiguration müssen folgende Schritte durchgeführt werden:
### Konfiguration prüfen und laden:
```bash
# Syntax-Check der main.cf
postfix check
# Konfiguration neu laden (ohne Neustart des Dienstes)
systemctl reload postfix
```
### Passwort-Datenbank aktualisieren:
Wenn die `sasl_passwd` geändert wurde, muss die Datenbank neu generiert werden:
```bash
postmap /etc/postfix/sasl_passwd
systemctl restart postfix
```
### Überprüfung der Logs (Fehlersuche):
```bash
# Echtzeit-Überwachung der Mail-Logs
tail -f /var/log/mail.log
# Alternativ via journalctl
journalctl -u postfix -f
```
## 5. Testen des E-Mail-Versands
Um die Funktionalität des Relays direkt auf dem Server zu testen:
```bash
echo "Testmail von APS-SMTP01" | mail -s "Testbetreff" de@deine-domain.de
```
## 6. Bekannte Probleme (Troubleshooting)
* **Relay access denied:** Prüfen Sie den Parameter `mynetworks`. Die IP des sendenden Geräts muss dort erlaubt sein.
* **Connection timed out (Port 25/587):** Prüfen Sie die Firewall-Regeln auf dem Server und im Netzwerk (Ausgehende Verbindung zum Provider).
---
*Erstellt für die IT-Dokumentation - Projekt: IT Internal Repository*

View File

@@ -5,47 +5,37 @@ Egy központi, felhőalapú (O365) platform létrehozása az IT részleg összes
## 2. Webhely Típusa
- **Típus:** SharePoint Team Site (**Privát**)
- **Név javaslat:** `IT Internal Repository`
- **Hozzáférés:** Kizárólag az IT csapat tagjai számára.
- **Név:** `IT Internal Repository`
- **Hozzáférés:** Kizárólag az IT csapat tagjai számára (Tulajdonosok és Tagok).
## 3. Javasolt Struktúra (Dokumentumtárak)
A meglévő helyi struktúra alapján az alábbi könyvtárakat hozzuk létre:
## 3. Végleges Struktúra (Dokumentumtárak)
A SharePoint felületen kialakított mappaszerkezet:
- **01_Infrastructure (Infrastruktúra):**
- Switch konfigok (`Conf/Switch/`), szerver beállítások (`Conf/aps.local/`), hálózati rajzok.
- *Metaadat javaslat:* Eszköz típusa, Gyártó.
- **02_Development_Projects (Projektek):**
- Docker fájlok, n8n munkafolyamatok, Python fejlesztések (`Dev/`).
- *Cél:* Fejlesztési dokumentáció és kódminták.
- **03_Knowledge_Base (Wiki / SOP):**
- Telepítési útmutatók, hibajegy-megoldások, folyamatleírások (`Doc/`).
- *Formátum:* SharePoint Pages vagy Markdown.
- **04_Automation_Scripts (Szkriptek):**
- Bash, PowerShell, Python szkriptek gyűjteménye (`Scripts/`).
- *Előny:* Felhőből bárhonnan elérhető kódminták.
- **05_Archive (Archívum):**
- Régi backupok, kifutott projektek (`Backup/`).
- **01_Infrastructure:** Postfix konfigok, Switch beállítások, hálózati rajzok.
- **02_Software:** Telepítőfájlok (.zip, .exe), szoftveres dokumentációk.
- **03_Knowledge_Base:** Általános IT útmutatók és Markdown (.md) dokumentumok.
- **04_Automation_Scripts:** Python és Bash szkriptek gyűjteménye.
- **05_Archive:** Régi mentések és logok.
## 4. Technikai Funkciók (IT Fókusz)
- **Verziókezelés:** Minden fájl módosítása visszakövethető (SharePoint Version History).
- **OneDrive Sync:** A fájlok helyi (Windows/Linux) szerkesztése és automatikus szinkronizációja (VS Code ajánlott).
- **Markdown és Plain Text (.txt) Stratégia:**
- A technikai dokumentáció (.md) és a nyers konfigurációk (.txt, .conf, .sh) eredeti formátumban maradnak.
- A switch konfigok (.txt) közvetlenül olvashatók és kereshetők a SharePoint webes felületén.
- A verziókövetés lehetővé teszi a konfigurációk közötti különbségek követését.
- A képek megjelenítése miatt a komplex dokumentációhoz a helyi szerkesztés (VS Code + OneDrive) ajánlott.
- **SOP (Wiki) Oldalak:** Modern SharePoint oldalakat használunk a folyamatok leírására (német nyelven a kollégáknak).
- **Code Snippets:** A kódminták szintaxis-kiemeléssel jelennek meg az oldalakon.
- **Verziókezelés:** Minden fájl módosítása visszakövethető.
- **OneDrive Sync:** Windows/WSL környezetből való kényelmes feltöltés és szinkronizáció.
- **Teams Integráció:**
- A SharePoint webhelyhez kapcsolódó Teams csapat automatikusan létrejön.
- A dokumentumtárak (Libraries) külön fülként (Tab) hozzáadhatók a Teams csatornákhoz.
- Gyors elérés: Fájlok megtekintése és alapvető szerkesztése közvetlenül a Teams felületén.
- Központi keresés: A Teams keresője megtalálja a SharePointon tárolt konfigokat és leírásokat is.
## 5. Következő Lépések (Teendők)
## 5. Elvégzett és Következő Lépések
- [x] Célközönség meghatározása (Csak IT).
- [ ] Üres SharePoint Site létrehozása (Privát Team Site).
- [ ] Dokumentumtárak (Libraries) létrehozása a fenti struktúra szerint.
- [ ] Kezdeti adatok feltöltése (OneDrive szinkronizációval).
- [x] Privát SharePoint Team Site létrehozása.
- [x] Dokumentumtárak (Libraries) kialakítása (01-05).
- [x] Kezdőlap (Dashboard) testreszabása (Hero, Schnelllinks).
- [x] Első SOP (Wiki) oldalak létrehozása (Német nyelven).
- [ ] Teljes adatkészlet feltöltése (OneDrive szinkronizáció befejezése).
- [ ] Teams integráció véglegesítése (Tab-ok hozzáadása).
## 6. Megvalósított SOP Oldalak (2026.03.16)
- **SOP: Automatisierter PDF-Import aus O365 (v2.2)**
- **SOP: Bereinigung alter Datensätze (delete_old_records.py)**
- **SOP: Konfiguration Postfix SMTP Relay (APS-SMTP01)**
---
*Ez a dokumentum a Gemini CLI segítségével készült, és a projekt aktuális állapotát tükrözi.*

View File

@@ -1,47 +0,0 @@
$events = Get-WinEvent -LogName "Microsoft-Windows-PrintService/Operational" -MaxEvents 500 |
Where-Object { $_.Id -eq 307 }
$logList = @()
foreach ($event in $events) {
$message = $event.Message
$user = ""
$document = ""
$printer = ""
$pages = ""
# Felhasználó (pl. L.Vogt auf APS-NB072)
if ($message -match "im Besitz von (.+?) wurde auf") {
$user = $matches[1].Trim()
}
# Nyomtató neve (pl. Jasenitz)
if ($message -match "wurde auf (.+?) über Port") {
$printer = $matches[1].Trim()
}
# Oldalszám (pl. Gedruckte Seiten: 1)
if ($message -match "Gedruckte Seiten:\s+(\d+)") {
$pages = $matches[1]
}
# Dokumentum sorszám (pl. Dokument 62) jobb híján
if ($message -match "^Dokument\s+(\d+)") {
$document = "Dokument " + $matches[1]
}
$logList += [PSCustomObject]@{
Datum = $event.TimeCreated
Benutzer = $user
Dokument = $document
Drucker = $printer
Seiten = $pages
}
}
# Exportálás CSV-be
$exportPfad = "$env:USERPROFILE\Desktop\drucklog_export.csv"
$logList | Export-Csv -Path $exportPfad -NoTypeInformation -Encoding UTF8
Write-Host "Exportálás kész: $exportPfad"

View File

@@ -1,54 +0,0 @@
$events = Get-WinEvent -LogName "Microsoft-Windows-PrintService/Operational" -MaxEvents 500 |
Where-Object { $_.Id -eq 307 }
$logList = @()
foreach ($event in $events) {
$message = $event.Message
$user = ""
$computer = ""
$document = ""
$printer = ""
$pages = ""
# Felhasználó és gép különválasztása
if ($message -match "im Besitz von (.+?) wurde auf") {
$fullUser = $matches[1].Trim()
if ($fullUser -match "^(.+?) auf (.+)$") {
$user = $matches[1].Trim()
$computer = $matches[2].Trim()
} else {
$user = $fullUser
}
}
# Nyomtató neve (pl. Jasenitz)
if ($message -match "wurde auf (.+?) über Port") {
$printer = $matches[1].Trim()
}
# Oldalszám (pl. Gedruckte Seiten: 1)
if ($message -match "Gedruckte Seiten:\s+(\d+)") {
$pages = $matches[1]
}
# Dokument sorszám (pl. Dokument 62)
if ($message -match "^Dokument\s+(\d+)") {
$document = "Dokument " + $matches[1]
}
$logList += [PSCustomObject]@{
Datum = $event.TimeCreated
Benutzer = $user
Computer = $computer
Dokument = $document
Drucker = $printer
Seiten = $pages
}
}
# Exportálás CSV-be
$exportPfad = "$env:USERPROFILE\Desktop\drucklog_export.csv"
$logList | Export-Csv -Path $exportPfad -NoTypeInformation -Encoding UTF8
Write-Host "Exportálás kész: $exportPfad"

View File

@@ -1,75 +0,0 @@
# Printer Log Report 0.3
#
# Get-WinEvent on Englische Windows : Get-WinEvent -LogName "Microsoft-Windows-PrintService/Operational"
# Get-WinEvent on Deutsche Windows : Get-WinEvent -LogName "Microsoft-Windows-PrintService/Betriebsbereit"
$events = Get-WinEvent -LogName "Microsoft-Windows-PrintService/Operational" -MaxEvents 500 |
Where-Object { $_.Id -eq 307 }
$logList = @()
foreach ($event in $events) {
$message = $event.Message
$user = ""
$computer = ""
$document = ""
$printer = ""
$pages = 0
# Felhasználó és gép különválasztása
if ($message -match "im Besitz von (.+?) wurde auf") {
$fullUser = $matches[1].Trim()
if ($fullUser -match "^(.+?) auf (.+)$") {
$user = $matches[1].Trim()
$computer = $matches[2].Trim()
} else {
$user = $fullUser
}
}
# Nyomtató neve (pl. Jasenitz)
if ($message -match "wurde auf (.+?) über Port") {
$printer = $matches[1].Trim()
}
# Oldalszám (pl. Gedruckte Seiten: 1)
if ($message -match "Gedruckte Seiten:\s+(\d+)") {
$pages = [int]$matches[1]
}
# Dokument sorszám (pl. Dokument 62)
if ($message -match "^Dokument\s+(\d+)") {
$document = "Dokument " + $matches[1]
}
$logList += [PSCustomObject]@{
Datum = $event.TimeCreated
Benutzer = $user
Computer = $computer
Dokument = $document
Drucker = $printer
Seiten = $pages
}
}
# Export részletes lista
$exportPfad = "$env:USERPROFILE\Desktop\drucklog_export.csv"
$logList | Export-Csv -Path $exportPfad -NoTypeInformation -Encoding UTF8
# ✅ Összesítés felhasználónként
$summary = $logList | Group-Object -Property Benutzer | ForEach-Object {
$userGroup = $_.Group
[PSCustomObject]@{
Benutzer = $_.Name
Anzahl_Dokumente = $userGroup.Count
Gesamt_Seiten = ($userGroup | Measure-Object -Property Seiten -Sum).Sum
}
}
# Export összesítés
$summaryPfad = "$env:USERPROFILE\Desktop\drucklog_summary.csv"
$summary | Export-Csv -Path $summaryPfad -NoTypeInformation -Encoding UTF8
Write-Host "Exportálás kész:"
Write-Host "- Részletes lista: $exportPfad"
Write-Host "- Felhasználónkénti összesítés: $summaryPfad"

View File

@@ -1,152 +0,0 @@
# Printer Log Report 0.3
#
# Get-WinEvent on Englische Windows : Get-WinEvent -LogName "Microsoft-Windows-PrintService/Operational"
# Get-WinEvent on Deutsche Windows : Get-WinEvent -LogName "Microsoft-Windows-PrintService/Betriebsbereit"
$events = Get-WinEvent -LogName "Microsoft-Windows-PrintService/Operational" -MaxEvents 2000 |
Where-Object { $_.Id -eq 307 }
$logList = @()
foreach ($event in $events) {
$message = $event.Message
$user = ""
$computer = ""
$document = ""
$printer = ""
$pages = 0
if ($message -match "im Besitz von (.+?) wurde auf") {
$fullUser = $matches[1].Trim()
if ($fullUser -match "^(.+?) auf (.+)$") {
$user = $matches[1].Trim()
$computer = $matches[2].Trim()
} else {
$user = $fullUser
}
}
if ($message -match "wurde auf (.+?) über Port") {
$printer = $matches[1].Trim()
}
if ($message -match "Gedruckte Seiten:\s+(\d+)") {
$pages = [int]$matches[1]
}
if ($message -match "^Dokument\s+(\d+)") {
$document = "Dokument " + $matches[1]
}
$logList += [PSCustomObject]@{
Datum = $event.TimeCreated
Tag = $event.TimeCreated.Date.ToString("yyyy-MM-dd")
Woche = Get-Date $event.TimeCreated -UFormat "%Y-W%V"
Benutzer = $user
Computer = $computer
Dokument = $document
Drucker = $printer
Seiten = $pages
}
}
# 🔹 Export részletes lista
$exportPfad = "$env:USERPROFILE\Desktop\drucklog_export.csv"
$logList | Export-Csv -Path $exportPfad -NoTypeInformation -Encoding UTF8
# 🔸 Összesítés felhasználónként (teljes)
$summary = $logList | Group-Object -Property Benutzer | ForEach-Object {
$userGroup = $_.Group
[PSCustomObject]@{
Benutzer = $_.Name
Anzahl_Dokumente = $userGroup.Count
Gesamt_Seiten = ($userGroup | Measure-Object -Property Seiten -Sum).Sum
}
}
$summary | Export-Csv -Path "$env:USERPROFILE\Desktop\drucklog_summary.csv" -NoTypeInformation -Encoding UTF8
# 🔸 Napi összesítés felhasználónként
$dailySummary = $logList | Group-Object -Property Tag, Benutzer | ForEach-Object {
$day = $_.Group[0].Tag
$user = $_.Group[0].Benutzer
$pages = ($_.Group | Measure-Object -Property Seiten -Sum).Sum
$docs = $_.Count
[PSCustomObject]@{
Datum = $day
Benutzer = $user
Dokumente = $docs
Seiten = $pages
}
}
$dailySummary | Export-Csv -Path "$env:USERPROFILE\Desktop\drucklog_daily.csv" -NoTypeInformation -Encoding UTF8
# 🔸 Heti összesítés felhasználónként (ISO hét formátum: pl. 2025-W30)
$weeklySummary = $logList | Group-Object -Property Woche, Benutzer | ForEach-Object {
$week = $_.Group[0].Woche
$user = $_.Group[0].Benutzer
$pages = ($_.Group | Measure-Object -Property Seiten -Sum).Sum
$docs = $_.Count
[PSCustomObject]@{
Woche = $week
Benutzer = $user
Dokumente = $docs
Seiten = $pages
}
}
$weeklySummary | Export-Csv -Path "$env:USERPROFILE\Desktop\drucklog_weekly.csv" -NoTypeInformation -Encoding UTF8
Write-Host "Exportálás kész:"
Write-Host "- Részletes lista: drucklog_export.csv"
Write-Host "- Összesítés: drucklog_summary.csv"
Write-Host "- Napi összesítés: drucklog_daily.csv"
Write-Host "- Heti összesítés: drucklog_weekly.csv"
# 🔸 Nyomtatónkénti összesítés
$printerSummary = $logList | Group-Object -Property Drucker | ForEach-Object {
$printer = $_.Name
$pages = ($_.Group | Measure-Object -Property Seiten -Sum).Sum
$docs = $_.Count
[PSCustomObject]@{
Drucker = $printer
Dokumente = $docs
Seiten = $pages
}
}
$printerSummary | Export-Csv -Path "$env:USERPROFILE\Desktop\drucklog_by_printer.csv" -NoTypeInformation -Encoding UTF8
# 🔸 Napi összesítés nyomtatónként
$dailyPrinterSummary = $logList | Group-Object -Property Tag, Drucker | ForEach-Object {
$day = $_.Group[0].Tag
$printer = $_.Group[0].Drucker
$pages = ($_.Group | Measure-Object -Property Seiten -Sum).Sum
$docs = $_.Count
[PSCustomObject]@{
Datum = $day
Drucker = $printer
Dokumente = $docs
Seiten = $pages
}
}
$dailyPrinterSummary | Export-Csv -Path "$env:USERPROFILE\Desktop\drucklog_daily_by_printer.csv" -NoTypeInformation -Encoding UTF8
# 🔸 Heti összesítés nyomtatónként
$weeklyPrinterSummary = $logList | Group-Object -Property Woche, Drucker | ForEach-Object {
$week = $_.Group[0].Woche
$printer = $_.Group[0].Drucker
$pages = ($_.Group | Measure-Object -Property Seiten -Sum).Sum
$docs = $_.Count
[PSCustomObject]@{
Woche = $week
Drucker = $printer
Dokumente = $docs
Seiten = $pages
}
}
$weeklyPrinterSummary | Export-Csv -Path "$env:USERPROFILE\Desktop\drucklog_weekly_by_printer.csv" -NoTypeInformation -Encoding UTF8

View File

@@ -1,98 +0,0 @@
# Drucklog_Export.ps1
# Nyomtatási napló beolvasása Event Log-ból, feldolgozása és mentése SQLite adatbázisba duplikációk nélkül
# Fontos modul SQLite feldolgozäshoz
# Install-Module -Name SQLite -Scope CurrentUser
# Import-Module SQLite
# --- Beállítások ---
$logName = "Microsoft-Windows-PrintService/Operational"
$dbPath = "$env:USERPROFILE\Desktop\drucklog_APS-PRINT01.db"
# $dbPath = "$env:USERPROFILE\Desktop\drucklog_APS-PRINT02.db"
# --- SQLite kapcsolat ---
# Add-Type -Path "C:\Tools\SQLite\System.Data.SQLite.dll"
$connectionString = "Data Source=$dbPath;Version=3;"
$connection = New-Object System.Data.SQLite.SQLiteConnection($connectionString)
$connection.Open()
# --- Tábla létrehozása, ha nem létezik ---
$createTableCmd = $connection.CreateCommand()
$createTableCmd.CommandText = @"
CREATE TABLE IF NOT EXISTS drucklog (
id INTEGER PRIMARY KEY AUTOINCREMENT,
event_id INTEGER UNIQUE,
datum TEXT,
tag TEXT,
woche TEXT,
benutzer TEXT,
computer TEXT,
dokument TEXT,
drucker TEXT,
seiten INTEGER
);
"@
$createTableCmd.ExecuteNonQuery()
# --- Események lekérdezése ---
$events = Get-WinEvent -LogName $logName -ErrorAction SilentlyContinue | Where-Object { $_.Id -eq 307 }
# --- Adatok feldolgozása ---
$logList = foreach ($event in $events) {
$msg = $event.Message
if ($msg -match "im Besitz von (.+?) auf (.+?) wurde auf (.+?) über Port") {
$benutzer = $matches[1]
$computer = $matches[2]
$drucker = $matches[3]
}
else {
continue
}
$dokument = if ($msg -match "Dokument (.+?), Dokument drucken") { $matches[1] } else { "Unbekannt" }
$seiten = if ($msg -match "Gedruckte Seiten: (\d+)") { [int]$matches[1] } else { 0 }
$calendar = [System.Globalization.CultureInfo]::CurrentCulture.Calendar
$weekRule = [System.Globalization.CalendarWeekRule]::FirstFourDayWeek
$firstDay = [System.DayOfWeek]::Monday
$woche = $calendar.GetWeekOfYear($event.TimeCreated, $weekRule, $firstDay)
[PSCustomObject]@{
Id = $event.RecordId
Datum = $event.TimeCreated.ToString("yyyy-MM-dd HH:mm:ss")
Tag = $event.TimeCreated.ToString("yyyy-MM-dd")
Woche = $woche
Benutzer = $benutzer
Computer = $computer
Dokument = $dokument
Drucker = $drucker
Seiten = $seiten
}
}
# --- Adatok mentése adatbázisba, duplikáció nélkül ---
foreach ($row in $logList) {
$checkCmd = $connection.CreateCommand()
$checkCmd.CommandText = "SELECT COUNT(*) FROM drucklog WHERE event_id = @id"
$checkCmd.Parameters.AddWithValue("@id", $row.Id)
$exists = $checkCmd.ExecuteScalar()
if ($exists -eq 0) {
$insertCmd = $connection.CreateCommand()
$insertCmd.CommandText = "INSERT INTO drucklog (event_id, datum, tag, woche, benutzer, computer, dokument, drucker, seiten)
VALUES (@id, @datum, @tag, @woche, @benutzer, @computer, @dokument, @drucker, @seiten)"
$insertCmd.Parameters.AddWithValue("@id", $row.Id)
$insertCmd.Parameters.AddWithValue("@datum", $row.Datum)
$insertCmd.Parameters.AddWithValue("@tag", $row.Tag)
$insertCmd.Parameters.AddWithValue("@woche", $row.Woche)
$insertCmd.Parameters.AddWithValue("@benutzer", $row.Benutzer)
$insertCmd.Parameters.AddWithValue("@computer", $row.Computer)
$insertCmd.Parameters.AddWithValue("@dokument", $row.Dokument)
$insertCmd.Parameters.AddWithValue("@drucker", $row.Drucker)
$insertCmd.Parameters.AddWithValue("@seiten", $row.Seiten)
$insertCmd.ExecuteNonQuery()
}
}
$connection.Close()
Write-Host "Sikeresen frissítve: $($logList.Count) esemény feldolgozva."

View File

@@ -1,101 +0,0 @@
# Drucklog_Export.ps1
# Nyomtatási napló beolvasása Event Log-ból, feldolgozása és mentése SQLite adatbázisba duplikációk nélkül
# Fontos modul SQLite feldolgozäshoz
# Install-Module -Name SQLite -Scope CurrentUser
# Import-Module SQLite
# --- Beállítások ---
$logName = "Microsoft-Windows-PrintService/Operational"
$dbPath = "$env:USERPROFILE\Desktop\drucklog_APS-PRINT01.db"
# $dbPath = "$env:USERPROFILE\Desktop\drucklog_APS-PRINT02.db"
# --- SQLite kapcsolat ---
# Add-Type -Path "C:\Tools\SQLite\System.Data.SQLite.dll"
$connectionString = "Data Source=$dbPath;Version=3;"
$connection = New-Object System.Data.SQLite.SQLiteConnection($connectionString)
$connection.Open()
# --- Tábla létrehozása, ha nem létezik ---
$createTableCmd = $connection.CreateCommand()
$createTableCmd.CommandText = @"
CREATE TABLE IF NOT EXISTS drucklog (
id INTEGER PRIMARY KEY AUTOINCREMENT,
event_id INTEGER UNIQUE,
datum TEXT,
tag TEXT,
woche TEXT,
benutzer TEXT,
computer TEXT,
dokument TEXT,
drucker TEXT,
seiten INTEGER
);
"@
$createTableCmd.ExecuteNonQuery()
# --- Események lekérdezése ---
$events = Get-WinEvent -LogName $logName -ErrorAction SilentlyContinue | Where-Object { $_.Id -eq 307 }
# --- Adatok feldolgozása ---
$logList = foreach ($event in $events) {
$msg = $event.Message
if ($msg -match "im Besitz von (.+?) auf (.+?) wurde auf (.+?) über Port") {
$benutzer = $matches[1]
$computer = $matches[2]
$drucker = $matches[3]
}
else {
continue
}
$dokument = if ($msg -match "Dokument (.+?), Dokument drucken") { $matches[1] } else { "Unbekannt" }
$seiten = if ($msg -match "Gedruckte Seiten: (\d+)") { [int]$matches[1] } else { 0 }
$calendar = [System.Globalization.CultureInfo]::CurrentCulture.Calendar
$weekRule = [System.Globalization.CalendarWeekRule]::FirstFourDayWeek
$firstDay = [System.DayOfWeek]::Monday
$woche = $calendar.GetWeekOfYear($event.TimeCreated, $weekRule, $firstDay)
[PSCustomObject]@{
Id = $event.RecordId
Datum = $event.TimeCreated.ToString("yyyy-MM-dd HH:mm:ss")
Tag = $event.TimeCreated.ToString("yyyy-MM-dd")
Woche = $woche
Benutzer = $benutzer
Computer = $computer
Dokument = $dokument
Drucker = $drucker
Seiten = $seiten
}
}
# --- Adatok mentése adatbázisba, duplikáció nélkül ---
$ujBejegyzesek = 0
foreach ($row in $logList) {
$checkCmd = $connection.CreateCommand()
$checkCmd.CommandText = "SELECT COUNT(*) FROM drucklog WHERE event_id = @id"
$checkCmd.Parameters.AddWithValue("@id", $row.Id)
$exists = $checkCmd.ExecuteScalar()
if ($exists -eq 0) {
$insertCmd = $connection.CreateCommand()
$insertCmd.CommandText = "INSERT INTO drucklog (event_id, datum, tag, woche, benutzer, computer, dokument, drucker, seiten)
VALUES (@id, @datum, @tag, @woche, @benutzer, @computer, @dokument, @drucker, @seiten)"
$insertCmd.Parameters.AddWithValue("@id", $row.Id)
$insertCmd.Parameters.AddWithValue("@datum", $row.Datum)
$insertCmd.Parameters.AddWithValue("@tag", $row.Tag)
$insertCmd.Parameters.AddWithValue("@woche", $row.Woche)
$insertCmd.Parameters.AddWithValue("@benutzer", $row.Benutzer)
$insertCmd.Parameters.AddWithValue("@computer", $row.Computer)
$insertCmd.Parameters.AddWithValue("@dokument", $row.Dokument)
$insertCmd.Parameters.AddWithValue("@drucker", $row.Drucker)
$insertCmd.Parameters.AddWithValue("@seiten", $row.Seiten)
$insertCmd.ExecuteNonQuery()
$ujBejegyzesek++
}
}
$connection.Close()
Write-Host "Sikeresen frissítve: $($logList.Count) esemény feldolgozva."
Write-Host "Új bejegyzések az adatbázisban: $ujBejegyzesek"

View File

@@ -1,81 +0,0 @@
# Drucklog_MySQL.ps1
# Install-Module MySQLCmdlets
# Nyomtatási napló export MySQL adatbázisba
# Aufgabeplannung: Taglich um 8.00 Uhr
# Name: Drucklog_MySQL_0.1.ps1
# powershell.exe -ExecutionPolicy Bypass -File "-ExecutionPolicy Bypass -File "C:\Tools\drucklog_export_0.1.ps1"
# Beállítások
$logName = "Microsoft-Windows-PrintService/Operational"
$mysqlHost = "10.101.0.82"
$mysqlUser = "druckloguser"
$mysqlPassword = "Test123#"
$mysqlDatabase = "drucklog"
$quelleServer = $env:COMPUTERNAME # vagy: "Szerver01"
# MySQL .NET csomag betöltése (előzetesen szükséges: MySql.Data.dll)
# Add-Type -Path "C:\Tools\MySql.Data.dll"
# Add-Type -Path "C:\Program Files (x86)\MySQL\MySQL Connector NET 9.4\MySql.Data.dll"
[Reflection.Assembly]::LoadFrom("C:\Program Files (x86)\MySQL\MySQL Connector NET 9.4\MySql.Data.dll") | Out-Null
# Kapcsolódás
$connectionString = "server=$mysqlHost;user id=$mysqlUser;password=$mysqlPassword;database=$mysqlDatabase;SslMode=none"
$connection = New-Object MySql.Data.MySqlClient.MySqlConnection($connectionString)
$connection.Open()
# Lekérés a logból
$events = Get-WinEvent -LogName $logName -ErrorAction SilentlyContinue | Where-Object { $_.Id -eq 307 }
# Kulturális beállítás a heti számításhoz
$calendar = [System.Globalization.CultureInfo]::CurrentCulture.Calendar
$weekRule = [System.Globalization.CalendarWeekRule]::FirstFourDayWeek
$firstDay = [System.DayOfWeek]::Monday
$ujBejegyzes = 0
foreach ($event in $events) {
$msg = $event.Message
if ($msg -match "im Besitz von (.+?) auf (.+?) wurde auf (.+?) über Port") {
$benutzer = $matches[1]
$computer = $matches[2]
$drucker = $matches[3]
} else {
continue
}
$dokument = if ($msg -match "Dokument (.+?), Dokument drucken") { $matches[1] } else { "Unbekannt" }
$seiten = if ($msg -match "Gedruckte Seiten: (\d+)") { [int]$matches[1] } else { 0 }
$woche = $calendar.GetWeekOfYear($event.TimeCreated, $weekRule, $firstDay)
$datum = $event.TimeCreated.ToString("yyyy-MM-dd HH:mm:ss")
$tag = $event.TimeCreated.ToString("yyyy-MM-dd")
$id = $event.RecordId
# Duplikáció ellenőrzés
$checkCmd = $connection.CreateCommand()
$checkCmd.CommandText = "SELECT COUNT(*) FROM drucklog WHERE event_id = @id AND quelle_server = @qs"
$checkCmd.Parameters.AddWithValue("@id", $id)
$checkCmd.Parameters.AddWithValue("@qs", $quelleServer)
$exists = $checkCmd.ExecuteScalar()
if ($exists -eq 0) {
$insertCmd = $connection.CreateCommand()
$insertCmd.CommandText = "INSERT INTO drucklog (event_id, datum, tag, woche, benutzer, computer, dokument, drucker, seiten, quelle_server)
VALUES (@id, @datum, @tag, @woche, @benutzer, @computer, @dokument, @drucker, @seiten, @qs)"
$insertCmd.Parameters.AddWithValue("@id", $id)
$insertCmd.Parameters.AddWithValue("@datum", $datum)
$insertCmd.Parameters.AddWithValue("@tag", $tag)
$insertCmd.Parameters.AddWithValue("@woche", $woche)
$insertCmd.Parameters.AddWithValue("@benutzer", $benutzer)
$insertCmd.Parameters.AddWithValue("@computer", $computer)
$insertCmd.Parameters.AddWithValue("@dokument", $dokument)
$insertCmd.Parameters.AddWithValue("@drucker", $drucker)
$insertCmd.Parameters.AddWithValue("@seiten", $seiten)
$insertCmd.Parameters.AddWithValue("@qs", $quelleServer)
$insertCmd.ExecuteNonQuery()
$ujBejegyzes++
}
}
$connection.Close()
Write-Host "Feldolgozott események: $($events.Count) | Új bejegyzés: $ujBejegyzes"

View File

@@ -1,12 +1,16 @@
# Drucklog_MySQL.ps1
# Drucklog_MySQL.ps1
# Install-Module MySQLCmdlets
# Nyomtatási napló export MySQL adatbázisba
#Teszt
Add-Content -Path "C:\Tools\drucklog_task.log" -Value "$(Get-Date -Format "yyyy-MM-dd HH:mm:ss") - Script futott"
# Beállítások
$logName = "Microsoft-Windows-PrintService/Operational"
$mysqlHost = "10.101.0.82"
$mysqlUser = "druckloguser"
$mysqlPassword = "Test123#"
$mysqlHost = "10.102.1.65"
$mysqlUser = "svc.druckerlog"
$mysqlPassword = "ctqBirh3eEbakLb96Ks1"
$mysqlDatabase = "drucklog"
$quelleServer = $env:COMPUTERNAME # vagy: "Szerver01"
@@ -15,6 +19,7 @@ $quelleServer = $env:COMPUTERNAME # vagy: "Szerver01"
# Add-Type -Path "C:\Program Files (x86)\MySQL\MySQL Connector NET 9.4\MySql.Data.dll"
[Reflection.Assembly]::LoadFrom("C:\Program Files (x86)\MySQL\MySQL Connector NET 9.4\MySql.Data.dll") | Out-Null
# Kapcsolódás
$connectionString = "server=$mysqlHost;user id=$mysqlUser;password=$mysqlPassword;database=$mysqlDatabase;SslMode=none"
$connection = New-Object MySql.Data.MySqlClient.MySqlConnection($connectionString)

View File

@@ -1,91 +0,0 @@
# Requires -Modules @{ModuleName='Microsoft.Graph.Applications';ModuleVersion='1.19.0'}, @{ModuleName='Microsoft.Graph.Mail';ModuleVersion='1.19.0'}
# ==============================================================================
# KONFIGURÁCIÓ
# ==============================================================================
# Adatok az Azure App Regisztrációból
# Tennant ID : caee3499-03f8-4175-9fa8-a935248d0ece
$TENANT_ID = "caee3499-03f8-4175-9fa8-a935248d0ece"
# Client Id : 3a08b279-1fc3-419f-a77e-31f12a0f65f7
$CLIENT_ID = "3a08b279-1fc3-419f-a77e-31f12a0f65f7"
# Key : Rk-8Q~nJ.sZ-xUiNxtEDdzVgoFFosODLVHX~jdrh (érték, nem Secret ID)
$CLIENT_SECRET = "Rk-8Q~nJ.sZ-xUiNxtEDdzVgoFFosODLVHX~jdrh"
# Figyelt postafiók
$USER_EMAIL = "i.meszely@aps-hh.de"
# Microsoft Graph API végpontok (alapértelmezett, nem kell módosítani)
$GRAPH_API_ENDPOINT = "https://graph.microsoft.com/v1.0"
# Scopes needed for the application
# Mail.ReadWrite for reading, marking as read, and eventually moving emails
$SCOPES = @("Mail.ReadWrite")
# ==============================================================================
# FÜGGVÉNYEK
# ==============================================================================
Function Connect-GraphAPI {
<#
.SYNOPSIS
Csatlakozik a Microsoft Graph API-hoz kliens hitelesítő adatokkal.
.DESCRIPTION
Ez a függvény megpróbál csatlakozni a Microsoft Graph API-hoz az Azure AD alkalmazás regisztrációjában megadott
kliens hitelesítő adatok (Tenant ID, Client ID, Client Secret) segítségével.
Sikeres kapcsolat esetén egy Access Token-t ad vissza. Hiba esetén null-t ad vissza és hibaüzenetet ír ki.
.OUTPUTS
Access Token (String) vagy $null
#>
[CmdletBinding()]
Param()
Write-Host "Graph API-hoz való csatlakozás megkezdése..." -ForegroundColor Cyan
try {
# Ellenőrizzük, hogy a szükséges modulok telepítve vannak-e
$requiredModules = @("Microsoft.Graph.Applications", "Microsoft.Graph.Mail")
foreach ($module in $requiredModules) {
if (-not (Get-Module -ListAvailable -Name $module)) {
Write-Warning "A(z) '$module' PowerShell modul nincs telepítve. Kérjük telepítse futtatás előtt: Install-Module $module"
return $null
}
}
# Csatlakozás a Graph API-hoz kliens hitelesítő adatokkal
# A -Scopes paraméterben az alkalmazásengedélyek neveit kell megadni
$connectResult = Connect-MgGraph -TenantId $TENANT_ID -ClientId $CLIENT_ID -ClientSecret $CLIENT_SECRET -Scopes $SCOPES -ErrorAction Stop
if ($connectResult) {
Write-Host "Sikeresen csatlakozott a Graph API-hoz." -ForegroundColor Green
# Lekérjük az Access Token-t
$token = (Get-MsalToken).AccessToken
return $token
} else {
Write-Error "Nem sikerült csatlakozni a Graph API-hoz."
return $null
}
}
catch {
Write-Error "Hiba történt a Graph API-hoz való csatlakozás során: $($_.Exception.Message)"
Write-Host "Kérjük, ellenőrizze a konfigurációs beállításokat (TENANT_ID, CLIENT_ID, CLIENT_SECRET) és az alkalmazásengedélyeket az Azure AD-ben." -ForegroundColor Yellow
return $null
}
}
# ==============================================================================
# FŐ LOGIKA
# ==============================================================================
function Main {
$accessToken = Connect-GraphAPI
if (-not $accessToken) {
Write-Error "Nem sikerült Access Token-t szerezni. Kilépés."
return
}
Write-Host "Access Token sikeresen lekérve. Kész a Graph API hívásokhoz." -ForegroundColor Green
# Itt fogjuk később implementálni az e-mailek feldolgozását
}
# Fő függvény meghívása
Main

View File

@@ -21,8 +21,44 @@ Für unsere Anforderungen ist eine klassische **SharePoint Team Site** die optim
### 4. Unterstützung technischer Formate
* Die Team Site ermöglicht eine schnelle Vorschau und Suche innerhalb von **Plain-Text-Dateien (.txt)** und **Markdown (.md)** direkt im Browser, was für Switch-Konfigurationen und Anleitungen essenziell ist.
## Fazit
Um die Agilität der IT-Abteilung zu gewährleisten und eine einfache, synchronisierbare Ablage zu schaffen, sollte auf die Erstellung eines Inhaltscenters verzichtet und stattdessen eine **private Team Site** implementiert werden.
---
## Umsetzung & Fortschritt (Stand: 16.03.2026)
Das Projekt wurde erfolgreich gestartet und die Basis-Infrastruktur steht bereit.
### 1. Implementierte Web-Struktur
Der SharePoint wurde als **private Team Site** unter dem Namen `IT Internal Repository` erstellt.
**Verzeichnisstruktur in der Dokumentenbibliothek (Documents):**
* `01_Infrastructure`: Konfigurationen (z. B. Postfix, Switches) und Netzwerkpläne.
* `02_Software`: Installationsdateien, Lizenzschlüssel und Software-Dokumentation.
* `03_Knowledge_Base`: Allgemeine IT-Anleitungen und Knowledge-Base-Artikel (.md).
* `04_Automation_Scripts`: Zentrale Ablage für Python, Bash und PowerShell Skripte.
* `05_Archive`: Veraltete Backups und Protokolle.
### 2. Dashboard & Navigation
Die Startseite wurde als **IT Dashboard** konfiguriert:
* **Hero-Bereich:** Direkte Verlinkung zu Infrastruktur, Software und Wiki.
* **Schnelllinks:** Schnellzugriff auf alle Hauptverzeichnisse (01-05).
* **News/Updates:** Automatische Anzeige der neuesten SOP-Seiten.
### 3. Erstellte Dokumentationen (SOPs)
Folgende Standard Operating Procedures (SOPs) wurden bereits auf SharePoint-Seiten sowie lokal als `.md` Dateien implementiert:
* `SOP: Automatisierter PDF-Import aus O365 (v2.2)`
* `SOP: Bereinigung alter Datensätze (delete_old_records.py)`
* **SOP: Konfiguration Postfix SMTP Relay (APS-SMTP01)**
* **SOP: Export von Druckprotokollen in MySQL (PowerShell)**
### 4. Integrationen
* **Microsoft Teams:** Die SharePoint-Seite ist mit dem Team `Informationstechnologie` (Private Gruppe) verbunden.
* **OneNote:** Das gemeinsame Notizbuch (Notizbuch) wurde integriert und lokale Abschnitte erfolgreich migriert.
* **OneDrive Sync:** Die Synchronisation für die Bearbeitung via Windows Explorer und WSL ist vorbereitet.
### 5. Nächste Schritte
* Vollständiger Upload des Software-Archivs via OneDrive.
* Integration von Switch-Konfigurationen in `01_Infrastructure`.
* Erweiterung der Wissensdatenbank durch das IT-Team.
---
*Erstellt für das IT-Team Projekt: Internal Repository*
*Aktualisiert für das IT-Team Projekt: Internal Repository*