gogoflash
Goto Top

Druckkontigentierung mittels Batch Dateien (Tutorialvorbereitung)

Versuche mittels Windows Boardmitteln eine Druckkontigentierung einzurichten.

Hallo,

ich stelle eine Betaversion einer Batchdatei zur Diskussion.
Ziel soll es sein daraus eine stabile Lösung für eine Druckkontigentierung zu geben.
Eine Lauffähige Version wir am Ende gepostet.
Auch am Ende werden die Quellen der Tools angegeben.Alles Freeware!? (Das muß noch geprüft werden).

[EDIT]
Tutorial liegt unter
Druckkontingentierung auf Windows Servern mit Boardwerkzeugen/Freewaretools


Plan ----------------
Kurz skizziert der Ablauf bevor ein paar Codeschnippsel gezeigt werden.
1) Auslesen der User (Personen) aus dem Active Directory. Die Namen werden in eine Userlist.txt ausgegeben.Hiermit kann später das Drucklog nach Usern gefiltert werden.
2) Mit dumpel wird das Drucklog seit Monatsbeginn ausgelesen.Ausgabe in druck.log
3) Die Ausgabe von dumpel wird formatiert. Für jeden User wird eine Datei angelegt in der die bisher gedruckten Seiten drinstehen.(Das FIltern erfolgt mit seb)
4) Prüfung auf Kontigentüberschreitung. Falls ja Entzug der Rechte auf den Drucker

Dieses Skripte sollte natürlich mehrmals am Tag durchlaufen um eine Zeitnahe Protokollierung zu erhalten.
Plan ----------------

Zu 1) Auslesen der Benutzer in einer OU im AD
Ausgelesen werden aus der Domäne.de OU=hinten,ou=berlin; nur Objecte die person sind.

ldifde -f ExportUsers.ldf -s DC -d "ou=hinten,ou=Berlin,dc=domäne,dc=de" -p subtree -r "(objectClass=person)" -l "SamAccountName"</font>

Gibt uns folgendes aus:
dn: CN=###,OU=hinten,OU=Berlin,DC=domäne,DC=de
changetype: add
sAMAccountName: userA

dn: CN=Ab,OU=hinten,OU=Berlin,DC=domäne,DC=de
changetype: add
sAMAccountName: userB

Interessieren tuen uns nur die samaccountName: einträge
find "sAMAccountName:" ExportUsers.ldf > userlist.tmp  
REM Entfernen der sAMAccountName: Spalte
for /f "tokens=2 delims= " %%a in (userlist.tmp) do (echo %%a>> userlist.txt)  

Jetzt haben wir eine Liste (userlist.txt) die so aussieht.
UserA
UserB

Schritt 2) Mithilfe von Dumpel das Printlog auslesen.
dumpel -f d:drucker.log -m print -t -s \Druckserver -l system -e 10 -format s -d 10
-d 10 steht für die letzten 10 Tage.
Mit dem getalldatetimesvar.cmd vom Biber kann man das bestimmt eingreifen.

Die Ausgabe sieht dann so aus:
44	VE.PDF	UserA	Canon iR C3200 PCL5c	IP_172.22.44.71	481437	1	
46	VE.PDF	UserA	Canon iR C3200 PCL5c	IP_172.22.44.71	93056	1	
48	VEpdf	UserA	Canon iR C3200 PCL5c	IP_172.22.44.71	142196	1	
50	VE_Ban.pdf UserA	Canon iR C3200 PCL5c	IP_172.22.44.71	139116	1
4 Microsoft PowerPoint - 20060201_.ppt	UserB	Canon iR C3200 PCL5c	IP_172.22.44.71 50997	1
In der dritten Spalte wird der Nutzer angegeben. In der letzten Spalte die gedruckten Seiten.

Eine Auswertung mit
for /f "tokens=3,8 delims= " %%a in (drucker.log) do (echo %%a;%%b>> Logdatei.txt)   
bei den Einträgen von Microsoft aufgrund einer Zusätzlichen Spalte (Microsoft [Leerzeichen]Powerpoint) nur Müll aus.

Erstmal filtern wir nach einem User.
find "userA" drucker.log > userA  
Ausgabe in userA
44	VE.PDF	UserA	Canon iR C3200 PCL5c	IP_172.22.44.71	481437	1	
46	VE.PDF	UserA	Canon iR C3200 PCL5c	IP_172.22.44.71	93056	1	
48	VEpdf	UserA	Canon iR C3200 PCL5c	IP_172.22.44.71	142196	1	
50	VE_Ban.pdf UserA	Canon iR C3200 PCL5c	IP_172.22.44.71	139116	1
Mithilfe von sed (gleich kommt die Aufklärung)
SED -e "s/^.*IP_172.22.44.71 /SET /p" -e "d" <userA > userA2  
Mit diesem Befehl wird alles was vor IP_172.22.44.71 in userA ausgeschnitten inkl 172.22.44.71
SED bekommt man ..... (nachreichen !!!!)

sieht die Ausgabe so aus:
SET 481437	1	
SET 93056	1	
SET 142196	1	
SET 139116	1

Jetzt scheide ich die ersten beiden Spalten aus:
for /f "tokens=1,2,3 delims= " %%a in (userA2) DO (echo %%c >>userA3)  

UserA3 Datei sieht so aus:
1
1
1
1

3) Addieren der Inhalte von UserA3 und mit einem Kontigent vergleichen.
Falls überschritten wird mit subinacl die Rechte am Drucker entzogen.
Dazu nutze ich varset (Auch Quelle angeben)
REM Kontingent festlegen
set kontigent=100
for /f %%a in (userA3) DO (set anzahl=%%a && call :inner)
goto :sa
:inner
call var set zahl="%anzahl%+%zahl%"  
call var set ende="%zahl%-1"  
call var set testa="%kontingent%-%ende%"  
echo %user% %ende% %testa% >> statistik.txt
VARSET diff="%kontingent%-%ende%"  
if errorlevel 1 subinacl /printer %printer% /deny=%dc%\%user%=F

4) Grobe Schleife:
Mit Hilfe der userlist.txt kann ich den gesamten Kram in eine große Schleife pummen.
for /f %%x in (userlist.txt) do (set user=%%x && call :sua)

:sua
....Mach was.....
5) Alles zusammen:
REM Druckkontigent Version 0.1 Beta
REM Miguel
REM

del %outpfad%userlist.txt
set outpfad=d:scriptedruckerlog

REM Kontigent setzen
set kontingent=50

REM Variablen setzen fuer AD
	set domainc=serverAC
	set dc1=domäne
	set dc2=de
	set ou1=Berlin
	set ou2=hinten

REm Variablen fuer Drucker setzen
	set druckport=hpclj2500
REM Druckport muss unten manuell noch geändert werden.
	set printer=\printerserverdebe-pr-canonirc3200
	set server=\printerserver


REM Auslesen der Tage seit MOnatsbeginn
REM wird benötigt für Dumpel
REM Call GetAllDateTimeInfos /s

REM Auslesen der Benutzer in einer OU im AD
ldifde -f %outpfad%ExportUsers.ldf -s "%domainc%" -d "ou=%ou2%,ou=%ou1%,dc=%dc1%,dc=%dc2%" -p subtree -r "(objectClass=person)" -l "SamAccountName"  

REM ENtfernen von unbrauchbaren EInträgen in der ldf
	find "sAMAccountName:" %outpfad%ExportUsers.ldf > %outpfad%userlist.tmp  
	for /f "tokens=2 delims= " %%a in (%outpfad%userlist.tmp) do (echo %%a>> %outpfad%userlist.txt)  
	del %outpfad%ExportUsers.ldf
	del %outpfad%userlist.tmp


REM Druckprotokoll auswerten
dumpel -f %outpfad%druck.log -m print -c -s \debe-as-01 -l system -e 10 -d 6 -format s

REM Ausnehmen vom Drucker
	find "%druckport%" %outpfad%druck.log > %outpfad%\%druckport%  
	del %outpfad%druck.log

REM 1) Schritt aus dem Druckprotokoll werden die Informationen für jeden
REM unser in der userlist.txt getrennt
for /f %%x in (%outpfad%userlist.txt) do (set user=%%x && call :sua)
call :sa
	:sua
	find "%user%" %outpfad%\%druckport% > %outpfad%	emp\%user%  
	SED -e "s/^.*hpclj2500 /SET /p" -e "d" <%outpfad%	emp\%user% >%outpfad%	emp2\%user%  
	del %outpfad%	emp\%user%
	for /f "tokens=1,2,3 delims= " %%a in (%outpfad%	emp2\%user%) DO (echo %%c >>%outpfad%	emp\%user%)  
	del %outpfad%	emp2\%user%
	
	REM Jetzt wird gerechnet
	call var set zahl=0
	call var set anzahl=0
	call var set ende=0
	for /f %%a in (%outpfad%	emp\%user%) DO (set anzahl=%%a && call :inner)
		goto :sa
		:inner
		call var set zahl="%anzahl%+%zahl%"  
		call var set ende="%zahl%-1"  
		call var set testa="%kontingent%-%ende%"  
		echo %user% %ende% %testa% >> %outpfad%statistik.txt
		VARSET diff="%kontingent%-%ende%"  
	        if errorlevel 1 subinacl /printer %printer% /deny=%dc%\%user%=F
		del %outpfad%	emp\%user%
:sa

Gruß Miguel


Softwarequellen:
Dumpel (Printlog ausgeben)
http://www.microsoft.com/windows2000/techinfo/reskit/tools/existing/dum ...

SED
http://www.windowsitpro.com/Articles/Index.cfm?ArticleID=5697

VAR SET
http://home.mnet-online.de/horst.muc/german.htm

Subinacl
http://www.microsoft.com/downloads/details.aspx?FamilyID=e8ba3e56-d8fe- ...

Content-Key: 25171

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

Printed on: April 24, 2024 at 15:04 o'clock

Member: gogoflash
gogoflash Feb 05, 2006 at 13:20:45 (UTC)
Goto Top
Damit ich nicht die Übersicht verliere.

Was muß noch gemacht werden?


a) Der Code müsste optimiert werden. Vielleicht andere Batch Sprache.
Er ist nicht sonderlich schnell, und ich hab das Gefühl, dass die Schleifen zu oft durchgelaufen werden. Und die Technik mit zwei Temp Verzeichnissen ist auch nicht schick.

b) Für dumpel eine Tagesroutine, die die Tage seit Monatsbeginn ausgibt.

c) Kontingentierung nach Gruppenzugehörigkeit einbauen.

d) Benachrichtigung des Nutzers wenn Kontigent überschritten ist.

e) Abschaltroutine über Gruppenzugehörigkeit.

f) Reiner.... d.h. mehr Boardmittel ohne (var set usw)