Skip to main content

BATCH Active Directory Gruppenvergleiche

Ihr seid sicher in Umgebungen unterwegs in denen Powershell gesperrt ist... Also brauchen wir Batchscript-Hexerei...

Das  Script hat noch einen Haufen Breakpoints...

@echo off
setlocal enabledelayedexpansion

REM ====================================
REM Autor: Knaab-Hinrichs
REM Datum: 2025-06-05
REM Beschreibung: Vergleicht Gruppenmitgliedschaften von zwei Domänenbenutzern
REM ====================================

REM Benutzer eingeben (Parameter oder Abfrage)
set "User1=%~1"
set "User2=%~2"

if "%User1%"=="" (
    set /p User1=Benutzer 1 eingeben:
)
if "%User2%"=="" (
    set /p User2=Benutzer 2 eingeben:
)

echo Usereingabe
pause

REM Pfade zu temporären Dateien
set "User1File=%TEMP%\user1.txt"
set "User2File=%TEMP%\user2.txt"
set "Groups1Clean=%TEMP%\CleanUser1Groups.txt"
set "Groups2Clean=%TEMP%\CleanUser2Groups.txt"

echo Gruppenpfade
pause

REM Benutzerinformationen abrufen
net user "%User1%" /DOMAIN > "%User1File%"
net user "%User2%" /DOMAIN > "%User2File%"

echo userabruf
pause


REM Gruppen extrahieren
call :ExtractGroups "%User1File%" "%Groups1Clean%"

echo Gruppenextrakt User 1
pause 

call :ExtractGroups "%User2File%" "%Groups2Clean%"

echo Gruppenextrakt User 2
pause


REM Vergleich durchführen
echo.
echo ============================================
echo Gruppen in %User1% aber nicht in %User2%:
echo ============================================
for /f "delims=" %%g in ('type "%Groups1Clean%"') do (
    set "found=no"
    for /f "delims=" %%h in ('type "%Groups2Clean%"') do (
        if /I "%%g"=="%%h" set "found=yes"
    )
    if "!found!"=="no" echo %%g
)

echo Gruppenvergleich
pause

REM Temporäre Dateien löschen
del "%User1File%" >nul 2>&1
del "%User2File%" >nul 2>&1
del "%Groups1Clean%" >nul 2>&1
del "%Groups2Clean%" >nul 2>&1

endlocal
pause
exit /b

REM =======================
REM Funktion: Gruppen extrahieren
REM =======================
:ExtractGroups
setlocal enabledelayedexpansion
set "InGroups=0"
set "OutFile=%~2"

> "%OutFile%" (
    for /f "usebackq tokens=* delims=" %%L in (%~1) do (
        set "Line=%%L"

        REM Start der Gruppenliste erkennen
        echo !Line! | findstr /C:"Globale Gruppenmitgliedschaften" >nul
        if !errorlevel! == 0 (
            set "InGroups=1"
            for /f "tokens=2,* delims=:" %%A in ("!Line!") do (
                echo %%B
            )
        ) else if !InGroups! == 1 (
            REM Nur Zeilen mit * am Anfang sind Gruppenzeilen
            echo !Line! | findstr /R "^ [ ]*\*" >nul
            if !errorlevel! == 0 (
                echo !Line!
            ) else (
                set "InGroups=0"
            )
        )
    )
)

endlocal
exit /b