casper2k
Goto Top

Was macht dieses Script?

Hallo Leute,

habe einen Codeschnipsel gefunden in dem ich aber nicht wirklich durchblicke.

Ich bin gerade dabei mir ein Script für eine Serverwartung zusammenzubauen.

In diesem Scriptabschnitt möchte ich das Profilverzeichnis leeren; d.h. alle Userprofile
ausser dem Admin, dem Tester, dem Default User und dem All Users sollen gelöscht werden.

Ich dachte eigentlich dass der unten beschriebene Code das machen würde. Wirklich kapieren
was das Script tut, weiss ich aber auch nicht. Kann mir da mal jemand auch die Sprünge helfen?

FOR /F "Delims= Tokens=1*" %%a IN ('DIR /B "%systemdrive%\Dokumente und Einstellungen\"') DO (  
IF /I NOT "%%a"=="Default User" FOR /F "Delims= Tokens=1*" %%b IN ('ECHO %%a') DO (  
IF /I NOT "%%a"=="All Users" FOR /F "Delims= Tokens=1*" %%c IN ('ECHO %%a') DO (  
IF /I NOT "%%a"=="Tester" FOR /F "Delims= Tokens=1*" %%c IN ('ECHO %%a') DO (  
IF /I NOT "%%a"=="Administrator" RD /s /q "%systemroot%\Dokumente und Einstellungen\%%a" >> %LogPath%\Reboot.log  
)
)
)
delprof.exe /Q /I

thx
Casper2k

Content-Key: 76758

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

Printed on: April 25, 2024 at 13:04 o'clock

Member: Dani
Dani Dec 28, 2007 at 11:03:58 (UTC)
Goto Top
Hi Casper,
war das Script wirklich so oder hast du dich schon dran versucht. Also wenn das Profile löschen soll, dann fress ich ein Besen. Erstmal hat die Variable "systemroot" da gar nicht verloren, denn die hat den Wert "C:\Windows", somit schon mal ganz falsche Spur.

Für was die Schleifen, hinter jeder Abfrage sinnvoll sein soll, kapiere ich auch noch nicht ganz. Denn eigentlich wird das mit der IF-Abfrage erschlagen.

Hier mal Script (leicht verändert):
@echo off

for /f "delims=" %%a in ('dir /b "%systemdrive%\Dokumente und Einstellungen\"')do (  
	if /i "%%a" NEQ "Default User" (  
		if /i "%%a" NEQ "All Users" (  
			if /i "%%a" NEQ "Tester" (  
				if /i "%%a" NEQ "Administrator" echo /s /q "%systemdrive%\Dokumente und Einstellungen\%%a" >> c:\Reboot.log  
			)
		)
	)
)
Biber würde sowas als Onliner schreiben, nicht war? face-wink Er schaut bestimmt noch vorbei....

Für was die delprof.exe da sein soll, darfst micht nicht fragen. Vom Namen her, würde ich sagen "Profil löschen". Jedoch würde das kein Sinn machen, da "rd" das schon macht.


Grüße
Dani
Member: Casper2k
Casper2k Dec 28, 2007 at 12:20:03 (UTC)
Goto Top
Hallo und danke für deine Antwort.

ich blick da auch nicht ganz durch.

delprof kommt von M$ und löscht inaktive Profile raus. Das ist kein Problem.

Ich möchte aber eigentlich erreichen dass alle Userprofile gelöscht werden
ausser die genannten. alles andere soll einfach weggelöscht werden.
ich denke das es mit rd nicht funktioniert, da die ntuser.dat usw teilweise noch
im zugriff sind und nicht einfach so weggelöscht werden können.
Member: Dani
Dani Dec 28, 2007 at 12:33:39 (UTC)
Goto Top
Hi,
Ich möchte aber eigentlich erreichen dass alle Userprofile gelöscht werden
ausser die genannten. alles andere soll einfach weggelöscht werden.
Dies geschieht mit meinem Script oben. "rd" funktioniert sehr gut damit....ich habe nämlich außvversehen meine anderen User damit abgeschlossen. *g*

Wann soll das Script ausgeführt werden bzw. wo? Domäne oder Arbeitsgruppe beim Starten oder Abmelden, etc...Fragen über Fragen.


Grüße
Dani
Member: Casper2k
Casper2k Dec 28, 2007 at 13:04:39 (UTC)
Goto Top
Wann soll das Script ausgeführt werden
bzw. wo? Domäne oder Arbeitsgruppe beim
Starten oder Abmelden, etc...Fragen über
Fragen.



Das Script soll während der wöchentlichen Serverreboots
ablaufen.
Hab schon ein Wartungsscript welches unterschiedlichste
Dinge aufräumt und die Profil Geschichte soll da eben auch
noch mit rein. Die Server um die es sich handelt, sind alles
W2k3 mit Citrix PS3.
Es sollen jedoch nur die lokal gespeicherten Profilpfade gelöscht
werden (bis auf die Ausnahmen).
Member: Dani
Dani Dec 28, 2007 at 13:18:56 (UTC)
Goto Top
Na also, dann kommt dir die ntuser.dat nicht in die Gwehre. Denn beim Restart, ist ja keiner der User schon mal angemeldet gewesen. Es sollte eben mit Adminrechten laufen bzw. unter einem Adminkonto. Sonst wird das nichts....!


Grüße
Dani
Member: Casper2k
Casper2k Dec 28, 2007 at 16:59:29 (UTC)
Goto Top
Das Script wird nach dem Neustart per Autoexnt ausgeführt...
aber das sollte eigentlich hinhauen. ich teste das nächste woche
mittwoch mal...
Member: Biber
Biber Dec 29, 2007 at 11:44:20 (UTC)
Goto Top
Moin Casper2k,

ich schließe mich Danis Ausführungen an - das Skript ganz oben ist Blödsinn bzw. zu umständlich.

Folgende drei Varianten bringen das gewünsche Ergebnis (auf den Monitor statt in ein Logfile, kann also gefahrlos getestet werden):
@for /f "delims=" %%a in ('dir /b /ah /ad "%USERPROFILE%\..\*"') do @(  
       if /i "%%a" NEQ "Default User" (  
		if /i "%%a" NEQ "All Users" (  
			if /i "%%a" NEQ "Tester" (  
				if /i "%%a" NEQ "Administrator" echo [1]rd /s /q "%USERPROFILE%\..\%%a"   
			)
		)
	)
)

@for /d %%a in ("%ALLUSERSPROFILE%\..\*") do @(  
       if /i "%%~nxa" NEQ "Default User" (  
		if /i "%%~nxa" NEQ "All Users" (  
			if /i "%%~nxa" NEQ "Tester" (  
				if /i "%%~nxa" NEQ "Administrator" echo [2]rd /s /q "%ALLUSERSPROFILE%\..\%%~nxa"   
			)
		)
	)
)

@for /f "delims=, tokens=1-4" %%i in (""Default User","All Users","Tester","Administrator"") do @(  
   @for /d %%a in ("%ALLUSERSPROFILE%\..\*") do @(  
       if /i "%%~nxa" NEQ %%i (  
		if /i "%%~nxa" NEQ %%j (  
			if /i "%%~nxa" NEQ %%k (  
				if /i "%%~nxa" NEQ %%l echo [3]rd /s /q "%ALLUSERSPROFILE%\..\%%~nxa"   
			)
		)
	)
)
)
Anmerkungen:
- Variante [1] wäre die einzige, bei der Du das Profil "Default User" überhaupt durch die FOR-Anweisung erwischt.
Denn "Default User" ist ein "verstecktes" Verzeichnis und wird weder beim normalen "Dir /a:d" noch bei einer FOR/D-Anweisung mit ausgegeben.
Erst der Zusatzschalter "DIR ../a:h" zieht auch dieses Verzeichnis/Profil mit an.
- Ich habe bei allen Varianten RELATIV gearbeitet - auf der Parallelebene von %USERPROFILE% oder %ALLUSERSPROFILE%. Ist mir lieber.
- die dritte Variante ist nicht kürzer, aber IMHO wartbarer - ich habe die Ausnahme-Profile im Blick.
- wie geschrieben, die Prüfung auf "..NEQ "Default User" ist bei [2] und [3] Wunschdenken. Dieses Profil siehst Du nicht.
- Zu ergänzen wäre aus meiner Sicht aber noch als 5. Profil das eigene, also "%username%". Das würde ich gern behalten.

Grüße
Biber
Member: Casper2k
Casper2k Jan 02, 2008 at 07:05:38 (UTC)
Goto Top
ok, ich denke

@for /f "delims=, tokens=1-4" %%i in (""Default User","All Users","Tester","Administrator"") do @(
@for /d %%a in ("%ALLUSERSPROFILE%\..\*") do @(
if /i "%%~nxa" NEQ %%i (
if /i "%%~nxa" NEQ %%j (
if /i "%%~nxa" NEQ %%k (
if /i "%%~nxa" NEQ %%l echo [3]rd /s /q "%ALLUSERSPROFILE%\..\%%~nxa"
)
)
)
)
)

ist das richtige für mich.


Verstehe ich das richtig, dass in der ersten Klammer (da wo auch Tester steht) die Ausnahmen definiert werden?

Was ich allerdings nicht ganz verstehe, was macht die Variable %ALLUSERSPROFILE%\..\%%~nxa ? Müsste doch eigentlich if /i "%%~nxa" NEQ %%l echo [3]rd /s /q "C:\Dokumente und Einstellungen\%%~nxa" heißen, oder?

cu
Casper
Member: Biber
Biber Jan 02, 2008 at 07:33:35 (UTC)
Goto Top
Moin Casper2k,

Verstehe ich das richtig, dass in der ersten Klammer (da wo auch Tester steht) die Ausnahmen definiert werden?
Jepp, exakt. Deshalb ist mir die auch am sympathischsten. Siehe oben, da habe ich geschrieben: "die dritte Variante ist nicht kürzer, aber IMHO wartbarer - ich habe die Ausnahme-Profile im Blick."

Was ich allerdings nicht ganz verstehe, was macht die Variable %ALLUSERSPROFILE%\..\%%~nxa?

Hmmja, das ist vielleicht einfacher am CMD-Prompt nachzuspielen als zu erklären...
[OT]Normalerweise hätte ich jetzt "nachzukaspern" geschrieben, aber in Anbetracht Deines Nicks...**gg [/OT]

Also, lass Dir am CMD mit "set ALLUSERS" mal den Variablenwert von %ALLUSERSPROFILE%" anzeigen.
Vorgeplänkel I:
>set allusers
ALLUSERSPROFILE=C:\Dokumente und Einstellungen\All Users
Vorgeplänkel II
In der Laufvariablen %%a stehen nacheinander alle gefundenen Ordnernamen (mit Lw+Pfad+Ordnername), die auch bei einem
>dir /b "%allusersprofile%\..\*"  
...gefunden worden wären.
Von diesen Ordnern will ich aber NUR die OrdnerNAMEN ( also %%~na) statt die Ordner-Lw+Ordner-Pfad+Ordnernamen, die ich mit %%a erhalten würde.
Denn diese Ordnernamen will ich ja mit "Administrator"/"Tester" etc. vergleichen können.

Wenn es noch nicht ganz klar ist, dann lass den Batch-Einzeiler mal laufen OHNE die ganzen "@", die die Anzeige unterdrücken. Dann kannst Du die ganzen aufgelösten Variablenwerte sehen.
Müsste doch eigentlich if /i "%%~nxa" NEQ %%l echo [3]rd /s /q "C:\Dokumente und Einstellungen\%%~nxa" heißen, oder?
Hmmm... heißt es auch ...eigentlich.... aber "...%ALLUSERSPROFILE%\..\%%~nxa " ist ein bisschen universeller...

Grüße
Biber
Member: Casper2k
Casper2k Jan 02, 2008 at 07:42:26 (UTC)
Goto Top

> Was ich allerdings nicht ganz verstehe,
was macht die Variable
%ALLUSERSPROFILE%\..\%%~nxa?

Also, lass Dir am CMD mit "set
ALLUSERS" mal den Variablenwert von
%ALLUSERSPROFILE%" anzeigen.
Vorgeplänkel I:
>set allusers
> ALLUSERSPROFILE=C:\Dokumente und
> Einstellungen\All Users
> 
Vorgeplänkel II
In der Laufvariablen %%a stehen nacheinander
alle gefundenen Ordnernamen (mit
Lw+Pfad+Ordnername), die auch bei einem
>dir /b
> "%allusersprofile%\..\*"  
> 
...gefunden worden wären.
Von diesen Ordnern will ich aber NUR die
OrdnerNAMEN ( also %%~na) statt die
Ordner-Lw+Ordner-Pfad+Ordnernamen, die ich
mit %%a erhalten würde.
Denn diese Ordnernamen will ich ja mit
"Admistrator"/"Tester"
etc. vergleichen können.


Ah ich dachte dass da im Ordner ALL Users dann nach den
restlichen Profil-Ordnern gesucht wird... Vor allem weil du ja auch
noch \..\ zwischen %ALLUSERSPROFILE% setzt...
Teste das Ganze gerade noch mit mehreren Usern...
Member: Casper2k
Casper2k Jan 02, 2008 at 07:49:00 (UTC)
Goto Top
Alles klar, passt alles!

DANKEEEEE