76976
Goto Top

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:
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.

Content-Key: 112431

Url: https://administrator.de/contentid/112431

Printed on: April 20, 2024 at 16:04 o'clock

Member: bastla
bastla Mar 26, 2009 at 10:20:00 (UTC)
Goto Top
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:
for /f "skip=6 delims=" %%a in ('net localgroup "Administratoren"^|findstr /v /c:"Der Befehl"') do echo %%a  
Grüße
bastla
Mitglied: 76976
76976 Mar 26, 2009 at 10:27:36 (UTC)
Goto Top
Danke Bastla
Jetzt muss ich ja nur noch ein bissel "basteln" um des bei jeder gruppe zu machen und das in ne txt schreiben zu lassen

DANKÖÖÖ SCHÖN


MfG Pepper

________________
EDIT:
Ich bin ein ziemlicher NOOB in Batch
Weiß wer wie man dem sagt, dass es die Namen der Gruppen aus den einzelnen Zeilen von der "localgroups_listing.txt" benutzt?

Wär nett wenn jemand eine Ahnung hat wie das geht und die auch am besten hier reinschreibt
Member: bastla
bastla Mar 26, 2009 at 10:59:08 (UTC)
Goto Top
Hallo Pepper-jk!

... die Namen der Gruppen aus den einzelnen Zeilen von der "localgroups_listing.txt"
Schau Dir dazu die Zeile 30 an (verwendet die in Zeile 26 sortierte Liste) ...

Grüße
bastla
Mitglied: 76976
76976 Mar 26, 2009 at 11:36:29 (UTC)
Goto Top
Hi Leute (Hi Bastla)
Ich hab den Script bissel geändert .. der is jetzt kürzer aber er macht immer noch net das, was ich will xD
Ich zeig ihn euch mal:

REM Schritt 1) Variablen erstellen
REM ===========================================================
set gruppen="C:\groupu\localgroup\localgroups.txt"
set benutzer="C:\groupu\localgroup\user_output.txt"

REM Schritt 2) ggf alte Dateiausgaben löschen
REM ===========================================================
if exist %gruppen% del %gruppen%
if exist %benutzer% del %benutzer%
pause

REM Schritte 3), 4a) Localgroups auslesen und sortieren
REM ===========================================================
for /f "delims=*" %%i in ('net localgroup^|find "*"^|sort') do >>%gruppen% echo %%i

REM Schritt 5) Benutzergruppen mit User in Datei schreiben
REM ===========================================================
for /f "skip=6 delims=" %%a in ('net localgroup "Administrators"^|findstr /v /c:"Der Befehl"') do >>%benutzer% echo Administrators, %%a
pause

Natürlich weiß ich, dass er nur die Admins ausgiebt, aber net mal das macht er richtig. Er gibt dann in der zweiten Zeile (nach der ersten, wo "Administrators, Administrator" steht) "Administrators, The command completed successfully." aus. Wie kann ich das wegbekommen?
Und das mit der sortierten Liste, gehts das noch (, nach der Änderung)?
Und wenn ja wie? xD

MfG Pepper

P.S.: Ich bin zu faul selbst nachzudenken bzw. ich kanns net (hab ja selbst den Quelltext nur ausm Forum, das ganze mit %%a %%i un so kenn ich alles garnet :S)
Mitglied: 60730
60730 Mar 26, 2009 at 11:40:37 (UTC)
Goto Top
Servus und willkommen,

Wie man sieht, hält nichts länger als ein "provisorium" face-wink

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"
wird
06. 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 .ini
Dazu 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%
ein
if exist %benutzer%.* del %benutzer%.*
zu ändern und Zeile 15 kann verschwinden.

Gruß
Mitglied: 76976
76976 Mar 26, 2009 at 11:51:17 (UTC)
Goto Top
Danke da hast du recht, aber ich wäre Trozdem dankbar wenn du dir mal mein neues Script anschauen würdest und dazu was sagst face-wink

MfG Pepper
Mitglied: 60730
60730 Mar 26, 2009 at 12:24:09 (UTC)
Goto Top
Servus,

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ß
Mitglied: 76976
76976 Mar 26, 2009 at 12:25:48 (UTC)
Goto Top
do >>%benutzer% echo Administrators, %%a

funkt ja .. es gibt aus:

Administrators, Administrator
Administrators, ...

also alle Admins face-wink
nur gibt er am ende noch mal "The Command ..." aus >_<
Mitglied: 60730
60730 Mar 26, 2009 at 13:15:47 (UTC)
Goto Top
Zitat von @76976:
> 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 face-wink
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ß
Member: bastla
bastla Mar 26, 2009 at 13:17:56 (UTC)
Goto Top
Hallo Pepper-jk!

Vielleicht kannst Du ja eine Verbindung zwischen "The command ..." und meinem oben geposteten "Der Befehl" herstellen ...
@timobeil
do >>%benutzer% echo Administrators, %%a
ist ein weiteres (inzwischen von mir bevorzugt verwendetes) "Biber-Special" (what else? face-wink)

Grüße
bastla
Mitglied: 76976
76976 Mar 27, 2009 at 06:55:32 (UTC)
Goto Top
Wie eine Verbindung herstellen?

Ich hab erst gedacht der gibt das noch mal aus, weil "Der Befehl" da steht, aber ohne "Der Befehl" machter nix mehr

Im Prinzip geht es aber, dass man dem sagen kann dass er die Gruppen aus der txt beziehen soll und dann

Gruppenname, User1, User2, ...

ausgibt oder?

Net dass ich mich tot probiere an dem Script!


MfG Pepper
Member: bastla
bastla Mar 27, 2009 at 07:16:48 (UTC)
Goto Top
Hallo Pepper-jk!
Im Prinzip geht es aber
... nicht nur im Prinzip. face-wink
Zu der angesprochenen Zeile: Wenn Du "findstr /?" an der Kommandozeile eingibst, solltest Du die Funktion des auf die Ausgabe von "net localgroup" angewandten
findstr /v /c:"Der Befehl"
eigentlich nachvollziehen können.

Grüße
bastla
Mitglied: 76976
76976 Mar 27, 2009 at 07:46:00 (UTC)
Goto Top
Achso
also des
findstr
sucht nach den "Der Befehl" aber da da
/v
steht sucht er nach allem wo net "Der Befehl" drin ist

wie lol
also könnte ich mit dem
findstr
der Batch auch sagen dass er in der "localgroup.txt" nach "Der Befehl" suchen soll un dann mit
/v
sucht er alles was da drin steht außer mit "Der Befehl"

hab ich das richtig verstanden?

_____________________________________________________________________
EDIT:

set gruppe=findstr /v /c: "Der Befehl" in "D:\groupu\localgroup\localgroups.txt"
und
for /f "skip=6 delims=" %%a in ('net localgroup %Gruppe%^|findstr /v /c:"Der Befehl"') do >>%benutzer% echo %Gruppe%, %%a

geht net >_<

war klar dass ichs net hinbekomme ^^
Member: bastla
bastla Mar 27, 2009 at 07:49:31 (UTC)
Goto Top
Hallo Pepper-jk!
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
Mitglied: 76976
76976 Mar 27, 2009 at 07:52:20 (UTC)
Goto Top
Sieh mal oben was ne ###e ich verzapft hab ^^

ähm also genaugenommen gibt er mir für:

for /f "skip=6 delims=" %%a in ('net localgroup "Administrators"^|findstr /v /c:"Der Befehl"') do >>%benutzer% echo Administrators, %%a

Administrators, Administrator
Administrators, The command completed successfully.

aus
Member: bastla
bastla Mar 27, 2009 at 11:15:04 (UTC)
Goto Top
Hallo Pepper-jk!

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
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
Mitglied: 76976
76976 Mar 27, 2009 at 11:48:09 (UTC)
Goto Top
Hallo Bastla

Danke für den Quelltext. Ich habe noch eine frage:
Wenn ich deine Zeile 2 durch

@for /F %%u in ('find/N /V /C:"Der Befehl" D:\groupu\localgroup\localgroups.txt^') do @set group=%%u

ersetze dann müsste er das doch automatisch für jede Gruppe machen oder?

Tschuldige dass ich immer noch nerv xD

MfG Pepper
Mitglied: 76976
76976 Mar 27, 2009 at 12:44:07 (UTC)
Goto Top
So hab das ganze noch mal überarbeitet und deinen "Tipp" eingebaut Bastla:

@echo off & setlocal
REM Schritt 1) Variablen erstellen
REM ===========================================================
set "gruppen="D:\groupu\localgroup\localgroups.txt""
set "benutzer="D:\groupu\localgroup\user_output.txt""
@for /F "tokens=1" %%u in (D:\groupu\localgroup\localgroups.txt) do @set gruppe=%%u
set "Zeile=%gruppe%"

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 "skip=6 delims=" %%a in ('net localgroup "%gruppe%"^|findstr /v /i /c:"The command"') do call :ProcessUser "%%a"
echo >>%benutzer% %Zeile%

REM Schritt 5) Anzeigen starten
REM ===========================================================
start Localgroupuser.vbs
start Localgroup.vbs
goto :eof

REM Zwischenschritt
REM ===========================================================
:ProcessUser
set "Zeile=%Zeile%, %~1"
goto :eof

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?

MfG Pepper
Member: bastla
bastla Mar 27, 2009 at 14:10:05 (UTC)
Goto Top
Hallo Pepper-jk!
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
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):
@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
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
Mitglied: 76976
76976 Mar 27, 2009 at 15:47:21 (UTC)
Goto Top
Hi Bastla
DANKE des ist genau das was ich gebraucht habe.
Nur eins noch das "Der Befehl wurde erfolgreich ausgeführt" oder das gleiche auf english .. geht das net weg (also in der .txt?)?

MfG Pepper
Member: bastla
bastla Mar 27, 2009 at 16:03:03 (UTC)
Goto Top
Hallo Pepper-jk!

Wo wäre denn diese Zeile enthalten?

In der Gruppendatei landen nur alle Zeilen, die einen Stern enthalten, und in der Benutzerdatei sollte durch
... findstr /v /i /c:"The command" ...
diese Zeile ja auch ausgefiltert werden ...

Grüße
bastla
Mitglied: 76976
76976 Mar 30, 2009 at 05:58:13 (UTC)
Goto Top
Hallo Bastla
Ich war am Freitag Nachmittag bei mir zuhause und da habe ich ja Vista -.-
Da kam diese Zeile "Der Befehl wurde erfolgreich durchgeführt."
Jetzt am Praktikumsplatz (Windows Server 2003) geht alles keine Zeile mehr die "The command completed succsesful." oder wie au imma
Danke Bastla
jetzt geht alles ;)

_________________________________________________
EDIT:
Achso
jetzt peil ich des endlich

/v /i /c:"The command"

sorgt dafür dass er alle Zeilen wo "The command" drinsteht net ausgibt - bei meinem deutschem Vista gibt er dann natürlich "Der Befhel..." aus weil da ja net "The command" steht
Ok wieder was dazu gelernt
Mitglied: 76976
76976 Mar 30, 2009, updated at Oct 18, 2012 at 16:37:55 (UTC)
Goto Top
Hier habe ich wieder ein neues Problem:

Benutzergruppen per Batch Script verschiedene Rechte zuweisen

MfG Pepper