Skip to content

Daniels Tagesmeldungen

Kleine IT-Episoden, der Diabetes & das wahre Leben

  • Startseite
  • About me…
    • Lebenslauf
    • Weiterbildung
  • Diabetes melitus
    • Diabetes melitus – Definition/Typen
    • Diabetes melitus – Podcasts
    • Diabetes Typ-2 – Erläuterung
    • Medikament – Forxiga (Dapagliflozin)
    • Medikament – Eylea (Aflibercept)
    • Medikament – Lucentis (Ranibizumab )
    • Medikament – Metformin
  • Disclaimer
  • Toggle search form

Kategorie: Windows Server 2019

Powershell: Onpremise-Gruppenmitgliedschaften nach Datum entfernen

Posted on 14. Mai 202512. Mai 2025 By Daniel Lensing Keine Kommentare zu Powershell: Onpremise-Gruppenmitgliedschaften nach Datum entfernen

Ich hatte die Problematik, dass während eines Projektes Gruppenberechtigungen datumsgesteuert entfernt werden sollten. Während des Projektes wurden mehrere Gruppen definiert, bei der Gruppenmitgliedschaften verarbeitet werden sollten.

Entsprechend wurden CSV-Dateien generiert als Grundlage für die Verarbeitung:

SamAccountName;ExpiryDate
jdoe;2025-05-12
asmith;2025-06-01

Die Dateien haben als Definition die folgende Struktur:

GroupExpLeave_<Gruppenname>.csv

Mit dem nun folgenden Skript werden die Mitglieder der Gruppen ermittelt und geprüft, ob das Ablaufdatum erreicht ist. Wenn dieses der Fall ist, wird der User aus der Mitgliedschaft entfernt.


# Verzeichnis mit den CSV-Dateien
$csvDirectory = "C:\CSC-Pfad"
$csvFiles = Get-ChildItem -Path $csvDirectory -Filter "GroupExpLeave_*.csv"

# Logdatei mit Tagesdatum
$logDate = Get-Date -Format "yyyy-MM-dd"
$logPath = Join-Path -Path $csvDirectory -ChildPath "GroupExpLeave_$logDate.log"

# Hashtable für Gruppenmitgliedschaften
$groupCache = @{}

foreach ($file in $csvFiles) {
    # Gruppennamen aus dem Dateinamen extrahieren
    if ($file.Name -match "^GroupExpLeave_(.+?)\.csv$") {
        $groupName = $matches[1]
        $csvPath = $file.FullName

        # CSV mit Semikolon einlesen
        $members = Import-Csv -Path $csvPath -Delimiter ";"
        $today = Get-Date
        $remainingMembers = @()

        # Gruppenmitglieder einmalig abrufen und cachen
        if (-not $groupCache.ContainsKey($groupName)) {
            try {
                $groupCache[$groupName] = Get-ADGroupMember -Identity $groupName | Select-Object -ExpandProperty SamAccountName
            } catch {
                Add-Content -Path $logPath -Value "[$(Get-Date)] Error Requesting GroupMembers $groupName: $_"
                continue
            }
        }

        $cachedMembers = $groupCache[$groupName]

        foreach ($member in $members) {
            $expiryDate = Get-Date $member.ExpiryDate

            if ($expiryDate -lt $today) {
                if ($cachedMembers -contains $member.SamAccountName) {
                    try {
                        Remove-ADGroupMember -Identity $groupName -Members $member.SamAccountName -Confirm:$false
                        Add-Content -Path $logPath -Value "[$(Get-Date)] User $($member.SamAccountName) from $groupName removed (Ablaufdatum: $expiryDate)."
                    } catch {
                        Add-Content -Path $logPath -Value "[$(Get-Date)] Error on removing user $($member.SamAccountName) from $groupName: $_"
                        $remainingMembers += $member
                    }
                } else {
                    Add-Content -Path $logPath -Value "[$(Get-Date)] User $($member.SamAccountName) is not member of group $groupName – ignored."
                }
            } else {
                $remainingMembers += $member
            }
        }

        # Aktualisierte CSV-Datei schreiben
        $remainingMembers | Export-Csv -Path $csvPath -Delimiter ";" -NoTypeInformation -Encoding UTF8
        Add-Content -Path $logPath -Value "[$(Get-Date)] CSV-File $($file.Name) was created"
    }
}

Die angewandte Datei für die jeweilige Gruppe wird mit den noch gültigen Benutzern nach deren Prüfung neu erstellt. Es ist bei der Einplanung des Tasks darauf zu achten, dass zu dem Zeitpunkt auf die Steuer-Dateien nicht zugegriffen wird.

Powershell, Programmierung, Server, Windows Server 2019, Windows Server 2022, Windows Server 2025

Powershell: Ziel einer URL abfragen

Posted on 12. Mai 202510. Mai 2025 By Daniel Lensing Keine Kommentare zu Powershell: Ziel einer URL abfragen

Ich durfte am Wochenende einen Umzug einer Domain-Adresse begleiten. Dazu wurden Webservices angepasst. Ich wollte die erforderliche Abfrage nach der Umstellung schnell per Skript prüfen. Bei diesem ist das folgende entstanden:

[CmdletBinding()]
param(
    [Parameter(Mandatory = $true, Position = 0, ValueFromPipeline = $true)]
    [string[]]$URL
)

function Expand-URL {
    param (
        [Parameter(Mandatory = $true)]
        [string]$ShortUrl
    )
    try {
        $resp = Invoke-WebRequest -Uri $ShortUrl -MaximumRedirection 10 -Method Head -UseBasicParsing
        return $resp.BaseResponse.ResponseUri.AbsoluteUri
    }
    catch {
        try {
            $resp = Invoke-WebRequest -Uri $ShortUrl -MaximumRedirection 10 -Method Get -UseBasicParsing
            return $resp.BaseResponse.ResponseUri.AbsoluteUri
        }
        catch {
            Write-Error "Fehler beim Abrufen der URL [$ShortUrl]: $_"
            return $null
        }
    }
}

foreach ($shortUrl in $URL) {
    $finalUrl = Expand-URL -ShortUrl $shortUrl
    if ($finalUrl) {
        Write-Output "Zieladresse: "$finalUrl
    }
    else {
        Write-Output "Konnte die Zieladresse für $shortUrl nicht ermitteln."
    }
}

Dieses muss als Datei gespeichert werden. Mit dem Aufruf

.\Skript.ps1 https://www.url.com

kann dann die Adresse aufgelöst werden. Sollte eine Weiterleitung eingerichtet sein, wird die passende Zieladresse ausgegeben.

Internet, Powershell, Programmierung, Web-Installationen, Windows Server 2019, Windows Server 2022, Windows Server 2025

Powershell-Modul: ImportExcel

Posted on 24. April 202521. April 2025 By Daniel Lensing Keine Kommentare zu Powershell-Modul: ImportExcel

Wenn es um Datenverarbeitung und Berichterstellung geht, ist Excel oft ein unverzichtbares Werkzeug. Dennoch kann die Arbeit mit Excel-Dateien durch manuelle Prozesse zeitaufwändig und fehleranfällig sein. Hier kommt das PowerShell-Modul „ImportExcel“ ins Spiel – eine kraftvolle Lösung, um Excel-Dateien zu erstellen, zu bearbeiten und zu analysieren, ohne dass Microsoft Excel installiert sein muss.

Einführung in das Modul „ImportExcel“

Das Modul „ImportExcel“, entwickelt von Doug Finke, ist eine Erweiterung für PowerShell, die es Benutzern ermöglicht, mit Excel-Dateien auf programmatische Weise zu arbeiten. Es bietet eine Vielzahl von Cmdlets, um Excel-Dateien zu importieren, zu exportieren und sogar zu visualisieren. Der große Vorteil des Moduls besteht darin, dass es für die meisten Aufgaben keine Vorinstallation von Microsoft Excel erfordert. Dadurch wird die Automatisierung von Prozessen auch in Umgebungen möglich, in denen Excel nicht verfügbar ist.

Die wichtigsten Funktionen des Moduls

Das „ImportExcel“-Modul bietet eine große Anzahl von Funktionen. Hier sind einige der wichtigsten Cmdlets:

  1. Export-Excel
    Mit diesem Cmdlet kannst du Daten aus PowerShell-Objekten direkt in eine Excel-Datei exportieren. Du kannst Tabellen formatieren, Farben hinzufügen und Pivot-Tabellen erstellen. Beispiel:
   Get-Process | Export-Excel -Path "Prozesse.xlsx" -AutoSize
  1. Import-Excel
    Dieses Cmdlet ermöglicht das Importieren von Daten aus Excel-Dateien in PowerShell-Objekte. Es ist ideal für die Analyse und Weiterverarbeitung von Daten. Beispiel:
   $daten = Import-Excel -Path "Daten.xlsx"
  1. Open-ExcelPackage
    Damit kannst du eine Excel-Datei öffnen und gezielt bearbeiten, z. B. bestimmte Arbeitsblätter oder Zellen ändern.
  2. New-ExcelChart
    Mit diesem Cmdlet kannst du Diagramme direkt in Excel-Dateien erstellen. Es unterstützt verschiedene Diagrammtypen wie Balken-, Linien- oder Tortendiagramme.

Anwendungsfälle für das Modul „ImportExcel“

Das Modul eignet sich für eine Vielzahl von Szenarien, darunter:

  • Berichterstellung: Automatisiertes Erstellen von Berichten in Excel, z. B. für Leistungsanalysen oder Projektstatusberichte.
  • Datenanalyse: Importieren und Verarbeiten großer Datenmengen für weitere Analysen.
  • Visualisierung: Erstellen von Diagrammen und Grafiken für Präsentationen oder Zusammenfassungen.
  • Datenmigration: Exportieren von Daten aus einer Quelle und Importieren in ein Excel-Format.

Vorteile des „ImportExcel“-Moduls

  • Zeitersparnis: Automatisierung von Aufgaben, die normalerweise manuelle Arbeit erfordern.
  • Flexibilität: Kompatibilität mit verschiedenen PowerShell-Versionen und Betriebssystemen.
  • Keine Abhängigkeit von Excel: Ideal für Serverumgebungen, in denen Excel nicht installiert ist.

Fazit

Das PowerShell-Modul „ImportExcel“ ist ein vielseitiges Werkzeug, das die Arbeit mit Excel-Dateien erheblich erleichtert und automatisiert. Egal, ob du Berichte erstellen, Daten analysieren oder Visualisierungen durchführen möchtest, das Modul bietet eine einfache und effiziente Lösung. Durch seine umfangreichen Funktionen und einfache Bedienung ist es eine Bereicherung in der Autmatisierung.

Powershell, Windows 10, Windows 11, Windows Server 2016, Windows Server 2019, Windows Server 2022

AD Webservices: Einschränkung bei Powershell

Posted on 22. April 202521. April 2025 By Daniel Lensing Keine Kommentare zu AD Webservices: Einschränkung bei Powershell

Die Einstellung MaxGroupOrMemberEntries in Active Directory Web Services (ADWS) legt die maximale Anzahl von Gruppenmitgliedern fest, die von bestimmten PowerShell-Cmdlets abgerufen werden können. Standardmäßig ist dieser Wert auf 5000 begrenzt.

Dieses ist mir aufgefallen als ich eine Abfrage mit dem CMDlet „Get-ADGroupMember“ abfragen wollte. Die Gruppe hatte eine Mitgliederanzahl größer den 5000.

Die Einschränkung gilt für die folgenden CMDlets:

  • Get-ADGroupMember
    • Wird verwendet, um Mitglieder einer Gruppe abzurufen. Die Anzahl der zurückgegebenen Mitglieder ist durch diesen Eintrag begrenzt.
  • Get-ADPrincipalGroupMembership
    • Dieses Cmdlet listet alle Gruppenmitgliedschaften eines Benutzers oder Computers auf.
  • Get-ADAccountAuthorizationGroup
    • Zeigt die Sicherheitsgruppen an, die für die Autorisierung eines Benutzerkontos verwendet werden.

Es gibt 2 Varianten, dieses Problem zu umgehen. Die einfachste Möglichkeit ist die Nutzung des CMDlets „Get-ADGroup“, die mit dem ExtensionProperty „Member“ genutzt wird und einer Pipe die Daten weiterverarbeitet.

Eine zweite Variante ist die Erweiterung im Active Directory Webservice (ADWS). Dazu muss der Eintrag

<add key="MaxGroupOrMemberEntries" value="20000"/>

in der Datei C:\Windows\ADWS\Microsoft.ActiveDirectory.WebServices.exe.config hinzugefügt werden. Dieses ist mit einem Texteditor möglich. Dieses muss im Bereich der <appSettings> geschehen. Um die Änderung zu übernehmen, muss der Dienst neugestartet werden.

Server, Windows Server 2019, Windows Server 2022, Windows Server 2025

Powershell: Objektzähler pro OU

Posted on 17. April 202515. April 2025 By Daniel Lensing Keine Kommentare zu Powershell: Objektzähler pro OU

Im Rahmen einer Bereinigungsanforderung einer Active Directory-Domäne musste ich mir ein Skript erstellen, welches mir die Anzahl der Objekte aufgeteilt nach Typ darstellt:

  • Userobjekte
  • Gruppenobjekte
  • Computerobjekte

Aus diesem Grund ist das folgende Skript entstanden:

$results = Get-ADOrganizationalUnit -Properties CanonicalName,description -Filter * |
Sort-Object CanonicalName |
ForEach-Object {
    [pscustomobject]@{
        Name          = Split-Path $_.CanonicalName -Leaf
        CanonicalName = $_.CanonicalName
        UserCount     = @(Get-AdUser -Filter * -SearchBase $_.DistinguishedName -SearchScope OneLevel).Count
        GroupCount    = @(Get-AdGroup -Filter * -SearchBase $_.DistinguishedName -SearchScope OneLevel).Count
        ComputerCount = @(Get-AdComputer -Filter * -SearchBase $_.DistinguishedName -SearchScope OneLevel).Count
    }
}
$results | Select-Object canonicalname,Description,usercount,groupcount,computercount,name | export-csv C:\Temp\OUStructure.csv -Encoding UTF8 -Delimiter ";" -NoTypeInformation
Powershell, Programmierung, Server, Windows Server 2019, Windows Server 2022

Anwendungsspezifisches Eventlog für Powershell-Skript

Posted on 18. Februar 202517. Februar 2025 By Daniel Lensing Keine Kommentare zu Anwendungsspezifisches Eventlog für Powershell-Skript

Im Rahmen eines Skriptes kann es sinnvoll sein, wenn man ein dediziertes Eventlog erstellt. Dieses kann dann zum Beispiel in einer Monitoring-Lösung weiterverarbeitet werden.

Dazu muss ein neues „Eventlog“ sowie eine neue „Source“ erstellt werden über den Powershell-Befehl „New-Eventlog„:

New-EventLog -LogName "ApplicationName" -Source "AutoScriptPS1" -EA SilentlyContinue

Diese Befehlszeile muss mit administrativen Rechten ausgeführt werden.

Anschließend ist es möglich das neu erstellte Eventlog per Write-Eventlog mit Werten zu befüllen:

Write-EventLog 
      -LogName "ApplicationName"'
      -Source "AutoScriptPS1"'
      -EntryType "Error"'
      -Message "An issue has stopped the script."'
      -EventId 99

Als „EntryType“ können neben „Error“ auch „Information“ oder „Warning“ genutzt werden. Die EventID kann bis zu einem Wert 65535 definiert werden.

Client, Powershell, Programmierung, Server, Windows 10, Windows 11, Windows Server 2016, Windows Server 2019, Windows Server 2022, Windows Server 2025

Gruppenrichtlinien-Bereinigungen, die Zweite

Posted on 29. Januar 202529. Januar 2025 By Daniel Lensing Keine Kommentare zu Gruppenrichtlinien-Bereinigungen, die Zweite

Aufgrund des ersten Artikels zum Thema Gruppenrichtlinien-Bereinigung bekam ich Nachfragen, so dass ich die Antworten gerne ebenfalls in einen neuen Artikel einarbeiten möchte.

Nicht genutzt WMI-Filter

Gruppenrichtlinien können mit WMI-Filtern eingeschänkt werden. Dadurch können diese auf definierte Systeme oder Benutzer angewandt werden, ohne strukturell in der Domänenstruktur zu definieren. Zum Bespiel können verschiedene Betriebssysteme oder auch Hardware-Hersteller gefiltert werden. Entsprechend können aber auch diese mit der Zeit ungenutzt im Speicher bleiben:

# Importieren des Active Directory-Moduls
Import-Module ActiveDirectory

# Funktion zum Finden nicht verlinkter WMI-Filter
function Get-UnlinkedWMIFilters {
    # Abrufen aller WMI-Filter
    $allWMIFilters = Get-GpoWMIFilter -All

    # Liste zum Speichern nicht verlinkter WMI-Filter
    $unlinkedWMIFilters = @()

    # Schleife durch alle WMI-Filter
    foreach ($filter in $allWMIFilters) {
        # Abrufen aller verlinkten GPOs für den aktuellen WMI-Filter
        $linkedGPOs = Get-Gpo -All | Where-Object { $_.WmiFilter -eq $filter }

        # Überprüfen, ob keine GPOs verlinkt sind
        if ($linkedGPOs.Count -eq 0) {
            # Hinzufügen des WMI-Filters zur Liste nicht verlinkter WMI-Filter
            $unlinkedWMIFilters += $filter
        }
    }

    # Ausgabe der nicht verlinkten WMI-Filter
    foreach ($unlinkedFilter in $unlinkedWMIFilters) {
        Write-Output "WMI-Filter '$($unlinkedFilter.Name)';(ID: $($unlinkedFilter.Id))"
    }
}

# Aufruf der Funktion
Get-UnlinkedWMIFilters

Richtlinien ohne Sicherheitsfilter

Über Sicherheitsfilter wie AD-Benutzer, AD-Gruppen oder AD-Computer können ebenfalls Verteilungen wie bei den WMI-Filtern oder der aktiven Funktionalität der Gruppenrichtlinien eingeschränkt werden. So können auch in diesem Fall „Altbestände“ vorhanden bleiben:

# Importieren des GroupPolicy-Moduls
Import-Module GroupPolicy

# Funktion zum Finden von GPOs ohne Sicherheitsfilter
function Get-GPOsWithoutSecurityFilter {
    # Abrufen aller GPOs
    $allGPOs = Get-GPO -All

    # Liste zum Speichern von GPOs ohne Sicherheitsfilter
    $gposWithoutSecurityFilter = @()

    # Schleife durch alle GPOs
    foreach ($gpo in $allGPOs) {
        # Abrufen der Sicherheitsfilter des aktuellen GPO
        $securityFilters = Get-GPOReport -Guid $gpo.Id -ReportType Xml | Select-String -Pattern "<SecurityGroup>" | Measure-Object

        # Überprüfen, ob keine Sicherheitsfilter vorhanden sind
        if ($securityFilters.Count -eq 0) {
            $gposWithoutSecurityFilter += $gpo
        }
    }

    # Ausgabe der GPOs ohne Sicherheitsfilter
    foreach ($gpo in $gposWithoutSecurityFilter) {
        Write-Output "GPO-SecurityFilter '$($gpo.DisplayName)';(ID: $($gpo.Id))"
    }
}

# Aufruf der Funktion
Get-GPOsWithoutSecurityFilter

In diesem Fall bitte ich allerdings eindringlich zu beachten, dass die Regelung auch über Security-ACLs und spezielleren Rechten umgesetzt werden kann. Eine direkte Löschung aufgrund eines fehlenden Sicherheitsfilters empfehle ich definitiv nicht. Über den Reiter „Security“ sollten andere Berechtigungen zur Verteilung geprüft werden.

Client, Windows 10, Windows 11, Windows Server, Windows Server 2019, Windows Server 2022

Seitennummerierung der Beiträge

1 2 3 Nächste

Daniel Lensing

Ich betreibe diesen Blog, bei dem ich meine Erfahrungen aus der IT & dem Berufsalltag sowie dem Wahnsinn des Lebens mit Höhen und Tiefen. Darunter meine „Erlebnisreise“ zum Planeten „Diabetes mellitus Typ-2“.

Translate:

Follow us

Kategorien

  • Client (229)
    • Android (7)
    • Fedora (Linux) (5)
    • iOS (5)
    • Mac OS X (5)
    • Peripherie (5)
    • Ubuntu (Linux) (8)
    • Windows 10 (54)
    • Windows 11 (15)
    • Windows 7 (100)
    • Windows 8 (36)
    • Windows 8.1 (28)
    • Windows Mobile (2)
    • Windows Vista (65)
    • Windows XP (21)
  • Cloud (15)
    • Amazon AWS (1)
    • Microsoft Azure (7)
    • Office 365 (9)
  • Fortbewegung (55)
    • Auto (17)
    • Bahn (17)
    • Beinarbeit (5)
    • Flugzeug (3)
    • Zweirad (14)
  • IT-Nachrichten (37)
  • Leben Beruf und Gesundheit (190)
    • #t2dhero (46)
    • Arbeitszimmer (26)
    • Audio (19)
    • Film / Kino (7)
    • Gedanken (75)
    • Gesundheit (29)
    • Internet (4)
    • Lebensmittel & Essen (21)
    • Lesestoff (18)
    • Sport (10)
    • Veranstaltung (3)
  • Lehren & Lernen (48)
    • Forschung (1)
    • Konferenzen (3)
    • Präsentation (3)
    • Zertifizierung (42)
  • Programme (318)
    • Android-Apps (27)
    • Eigene Tools (11)
    • iOS-Apps (6)
    • Office (85)
    • Patchday+Updates (71)
    • Software (145)
    • Spiele (3)
    • Windows Phone-Apps (2)
  • Programmierung (88)
    • AutoIT (1)
    • KiXtart (1)
    • PHP (3)
    • Power Automate (1)
    • Powershell (57)
    • VB.NET (8)
    • VBA (10)
    • VBS (10)
  • Server (156)
    • Citrix XenServer (2)
    • Exchange Server (26)
    • Lync Server (1)
    • System Center (4)
    • Ubuntu Server (2)
    • Windows Home Server (2)
    • Windows Server (91)
    • Windows Server 2012 (45)
    • Windows Server 2016 (15)
    • Windows Server 2019 (15)
    • Windows Server 2022 (12)
    • Windows Server 2025 (5)
  • Telekommunikation (38)
    • Festnetz (3)
    • Internet (13)
    • Mobilfunk (23)
  • Verkauf & Verlosung (1)
  • Web-Installationen (36)
    • Joomla (4)
    • Mastodon (1)
    • MediaWiki (9)
    • phpMyAdmin (2)
    • Piwik (4)
    • Wordpress (20)
Mastodon

Copyright © 2025 Daniels Tagesmeldungen.

Powered by PressBook WordPress theme