
76976
26.03.2009, aktualisiert am 18.10.2012
Benutzergruppen und Benutzer auslesen (oder verwalten) mit Batch-Datein
Hallo liebe Programmierer.
Ich mache im Moment ein Schülerpraktikum in Sachen Informatik und soll die Benutzer in den einzelnen Gruppen auslesen und auslesen in welchen Gruppen der Benutzer ist. Das alles mit Batch Dateien.
Hier mal schnell der Quelltext, den ich mir schon aus diesem Forum geholt habe:
Also er liest mir die Gruppen ohne Probleme aus, dennoch müsste ich noch die zugehörigen Benutzer auslesen lassen und dies dann alles wie folgt in eine .txt schreiben lassen:
Ich hoffe jemand weiß wie ich das Script umschreiben muss, dass es das macht.
Danke im Vorraus.
Ich mache im Moment ein Schülerpraktikum in Sachen Informatik und soll die Benutzer in den einzelnen Gruppen auslesen und auslesen in welchen Gruppen der Benutzer ist. Das alles mit Batch Dateien.
Hier mal schnell der Quelltext, den ich mir schon aus diesem Forum geholt habe:
rem @echo off &setlocal
REM Schritt 1) Variablen erstellen
REM ===========================================================
set server = Servername
set gruppen="C:\Documents and Settings\Administrator\Desktop\groupu\New Folder\localgroups.txt"
set gruppenliste="C:\Documents and Settings\Administrator\Desktop\groupu\New Folder\localgroups_listing.txt"
set benutzer="C:\Documents and Settings\Administrator\Desktop\groupu\New Folder\user_output.txt"
REM Schritt 2) ggf alte Dateiausgaben löschen
REM ===========================================================
if exist %gruppen% del %gruppen%
if exist %gruppenliste% del %gruppenliste%
if exist %benutzer% del %benutzer%
if exist %benutzer%.ini del %benutzer%.ini
pause
REM Schritt 3) Localgroups auslesen
REM ===========================================================
net localgroup|find "*">%gruppen%
for %%a in (%gruppen%) do (
for /F "delims=* tokens=1 skip=2" %%i in ('find "*" %%a') do @echo %%i>%%~na.tfw>>%gruppenliste%)
REM Schritt 4a) Datei mit den unterschriebenen Localgroups sortieren
REM ===========================================================
sort %gruppenliste% /o %gruppen%
REM Schritt 5) Benutzergruppen mit User in Datei schreiben
REM ===========================================================
for /f "delims=*" %%i IN (%gruppen%) DO @echo "%%i" && net localgroup "%%i" >> %benutzer%
find /v "Der Befehl" %benutzer% > %benutzer%.ini
type %benutzer%.ini
pause
Also er liest mir die Gruppen ohne Probleme aus, dennoch müsste ich noch die zugehörigen Benutzer auslesen lassen und dies dann alles wie folgt in eine .txt schreiben lassen:
Gruppenname, ersterUser, zweiterUser, ...
Ich hoffe jemand weiß wie ich das Script umschreiben muss, dass es das macht.
Danke im Vorraus.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 112431
Url: https://administrator.de/forum/benutzergruppen-und-benutzer-auslesen-oder-verwalten-mit-batch-datein-112431.html
Ausgedruckt am: 29.04.2025 um 07:04 Uhr
23 Kommentare
Neuester Kommentar
Hallo Pepper-jk und willkommen im Forum!
Um Dir nicht die Chance zu nehmen, entsprechende eigene Leistung einfließen zu lassen, nur eine Darstellung (am Beispiel der Gruppe "Administratoren"), wie Du zu den einzelnen Benutzern kommst:
Grüße
bastla
Um Dir nicht die Chance zu nehmen, entsprechende eigene Leistung einfließen zu lassen, nur eine Darstellung (am Beispiel der Gruppe "Administratoren"), wie Du zu den einzelnen Benutzern kommst:
for /f "skip=6 delims=" %%a in ('net localgroup "Administratoren"^|findstr /v /c:"Der Befehl"') do echo %%a
bastla

Servus und willkommen,
Wie man sieht, hält nichts länger als ein "provisorium"
editiere - unabhängig von deiner Frage - Zeilen 6 -8
aus z.B
Dazu dann überall wo nur "%benutzer%" steht - fügst du ein .txt dazu
Dann hast du nur noch in Zeile 14 aus
Gruß
Wie man sieht, hält nichts länger als ein "provisorium"
editiere - unabhängig von deiner Frage - Zeilen 6 -8
aus z.B
06. set gruppen="C:\Documents and Settings\Administrator\Desktop\groupu\New Folder\localgroups.txt"
wird06. set gruppen="%userprofile%\Desktop\groupu\New Folder\localgroups"
Damit hast du zwei Fliegen mit einer Klappe erledigt, das Script wird nicht mehr auf einen Benutzer beschränkt und aus localgroups.txt.ini wird nur .iniDazu dann überall wo nur "%benutzer%" steht - fügst du ein .txt dazu
Dann hast du nur noch in Zeile 14 aus
if exist %benutzer% del %benutzer%
einif exist %benutzer%.* del %benutzer%.*
zu ändern und Zeile 15 kann verschwinden.Gruß

Servus,
Gruß
P.S.: Ich bin zu faul selbst nachzudenken
naja und was darf ich dann zurückschreiben?do >>%benutzer% echo Administrators, %%a
Kann so nicht funktionieren, weder Bastla noch ein anderer hat in diesem oder einem anderen Zusammenhang jemals "so" eine Zeile gezimmert - geschweige denn veröffentlicht.Gruß

Zitat von @76976:
> do >>%benutzer% echo Administrators, %%a
funkt ja .. es gibt aus:
> Administrators, Administrator
> Administrators, ...
> do >>%benutzer% echo Administrators, %%a
funkt ja .. es gibt aus:
> Administrators, Administrator
> Administrators, ...
Aber wohin "funkt" er? In die Dosbox oder in die Datei?
also alle Admins
nur gibt er am ende noch mal "The Command ..." aus
>_<
"The Command" - im vorherigen Thread, war es ein deutsches System.
Von daher - wie müßte dann die Zeile geändert werden, die bastla am 26.03.2009 um 11:20:00 Uhr: geschrieben hat?
Gruß
Hallo Pepper-jk!
Um die Frage von TimoBeil von oben aufzugreifen: Was musst Du daher machen, wenn Du die Zeile mit "The command" los werden willst?
Grüße
bastla
hab ich das richtig verstanden?
So ist es - wobei "alles" mit "alle Zeilen" genauer beschrieben wäre. Das "/c" sorgt übrigens dafür, dass der Suchbegriff als Einheit gesehen wird (und nicht nach den beiden Wörtern einzeln gesucht wird).Um die Frage von TimoBeil von oben aufzugreifen: Was musst Du daher machen, wenn Du die Zeile mit "The command" los werden willst?
Grüße
bastla
Hallo Pepper-jk!
Na gut, dann also das Zusammensetzen der Zeile (nochmals am Beispiel der Gruppe "Administrators"):
Im (für jeden Benutzernamen aufgerufenen) Unterprogramm ":ProcessUser" wird der übergebene Name (kommt dort als Parameter %1 an) dem derzeitigen Inhalt der Zeile hinzugefügt.
Ausgegeben wird die Zeile erst, wenn sie komplett ist (und dann in diesem Beispiel nur auf den Bildschirm) - siehe Zeile 6. Der Batch (das Hauptprogramm) endet in Zeile 7.
Grüße
bastla
Na gut, dann also das Zusammensetzen der Zeile (nochmals am Beispiel der Gruppe "Administrators"):
@echo off & setlocal
set "gruppe=Administrators"
set "Zeile=%gruppe%"
for /f "skip=6 delims=" %%a in ('net localgroup "%gruppe%"^|findstr /v /i /c:"The command"') do call :ProcessUser "%%a"
echo %Zeile%
goto :eof
:ProcessUser
set "Zeile=%Zeile%, %~1"
goto :eof
Ausgegeben wird die Zeile erst, wenn sie komplett ist (und dann in diesem Beispiel nur auf den Bildschirm) - siehe Zeile 6. Der Batch (das Hauptprogramm) endet in Zeile 7.
Grüße
bastla
Hallo Pepper-jk!
Lösen lässt sich das durch eine(n Aufruf der) Verabeitung innerhalb der Schleife (wobei diese auch an der richtigen Stelle platziert sein sollte, also erst nachdem die aktuellen Daten in die Gruppendatei geschrieben wurden).
Um das Ganze einem (hoffentlich) gedeihlichen Ende zuzuführen:
Die hier gezeigte Lösung mit zwei Unterprogrammebenen (für jede Gruppe wird ":ProcessGroup" und für jeden Benutzer ":ProcessUser" aufgerufen) löst das Problem, dass in einer "for"-Schleife (und auch zB in einem "if"-Konstrukt) die Variableninhalte (außer den Laufvariablen der Schleife) bereits zu Beginn der Schleife ermittelt und innerhalb der Schleife zwar verändert, aber für den lesenden Zugriff nicht aktualisiert werden.
Eine kompaktere Alternative wäre die Verwendung von "delayedExpansion" (allerdings sollten dann in den Daten keine "!" vorkommen):
Noch eine Anmerkung zur Verwendung der Anführungszeichen: Um flexibel zu bleiben, setze ich diese grundsätzlich erst dort, wo sie tatsächlich benötigt werden, und nicht bereits bei der Zuweisung an eine Variable (siehe etwa Zeilen 4,5 und 9,10).
Grüße
bastla
Kann mir jemand bei Zeile 6 helfen? Er gibt mir nur die User aus der Gruppe "Users" aus. Hat das was mit den "tokens=1" zu tun oder wieso tut die Batch das?
Innerhalb der Schleife wird %gruppe% immer wieder durch den Inhalt der nächsten Zeile überschrieben, sodass am Ende eben der Wert der letzten Zeile in der Variablen steht.Lösen lässt sich das durch eine(n Aufruf der) Verabeitung innerhalb der Schleife (wobei diese auch an der richtigen Stelle platziert sein sollte, also erst nachdem die aktuellen Daten in die Gruppendatei geschrieben wurden).
Um das Ganze einem (hoffentlich) gedeihlichen Ende zuzuführen:
@echo off & setlocal
REM Schritt 1) Variablen erstellen
REM ===========================================================
set "gruppen=D:\groupu\localgroup\localgroups.txt"
set "benutzer=D:\groupu\localgroup\user_output.txt"
REM Schritt 2) ggf alte Dateiausgaben löschen
REM ===========================================================
if exist "%gruppen%" del "%gruppen%"
if exist "%benutzer%" del "%benutzer%"
REM Schritte 3) Localgroups auslesen und sortieren
REM ===========================================================
for /f "delims=*" %%i in ('net localgroup^|find "*"^|sort') do >>"%gruppen%" echo %%i
REM Schritt 4) Benutzergruppen mit User in Datei schreiben
REM ===========================================================
for /f "usebackq delims=" %%u in ("%gruppen%") do call :ProcessGroup "%%u"
REM Schritt 5) Anzeigen starten
REM ===========================================================
start Localgroupuser.vbs
start Localgroup.vbs
goto :eof
REM Zwischenschritte
REM ===========================================================
:ProcessGroup
set "Zeile=%~1"
for /f "skip=6 delims=" %%a in ('net localgroup %1^|findstr /v /i /c:"The command"') do call :ProcessUser "%%a"
>>"%benutzer%" echo %Zeile%
goto :eof
REM ===========================================================
:ProcessUser
set "Zeile=%Zeile%, %~1"
goto :eof
Eine kompaktere Alternative wäre die Verwendung von "delayedExpansion" (allerdings sollten dann in den Daten keine "!" vorkommen):
@echo off & setlocal enabledelayedexpansion
REM Schritt 1) Variablen erstellen
REM ===========================================================
set "gruppen=D:\groupu\localgroup\localgroups.txt"
set "benutzer=D:\groupu\localgroup\user_output.txt"
REM Schritt 2) ggf alte Dateiausgaben löschen
REM ===========================================================
if exist "%gruppen%" del "%gruppen%"
if exist "%benutzer%" del "%benutzer%"
REM Schritte 3) Localgroups auslesen und sortieren
REM ===========================================================
for /f "delims=*" %%i in ('net localgroup^|find "*"^|sort') do >>"%gruppen%" echo %%i
REM Schritt 4) Benutzergruppen mit User in Datei schreiben
REM ===========================================================
for /f "usebackq delims=" %%u in ("%gruppen%") do (
set "Zeile=%%u"
for /f "skip=6 delims=" %%a in ('net localgroup "%%u"^|findstr /v /i /c:"The command"') do set "Zeile=!Zeile!, %%a"
>>"%benutzer%" echo !Zeile!
)
REM Schritt 5) Anzeigen starten
REM ===========================================================
start Localgroupuser.vbs
start Localgroup.vbs
Grüße
bastla