misterix
Goto Top

Skript zur automatischen Verteilung von Druckern anhand von Computerkonten in Active Directory Gruppen

In großen Firmen ist es praktisch Drucker anhand von Computerkonten zu verteilen, da so immer Drucker in der nähe des Rechners gemappt werden können, auch wenn Leute aus unterschiedlichen Abteilungen sich anmelden.
Nur ab Server 2003 R2 kann man das über Active Directory lösen. Alle älteren Serverversionen (also auch Server 2003) unterstützen dies nicht. Daher habe ich ein Skript geschrieben, das mit der Freeware Kixtart dieses Problem löst, indem es prüft ob Computerkonten Teil einer bestimmten Active Directory Gruppe sind.

Die Kix32.exe und das Skript müssen im Netlogon Ordner des Domänencontrollers liegen.

Aus einer normalen Batch kann das Skript dann wie folgend aufgerufen werden:

START /W \\server\netlogon\KiX32.exe \\server\netlogon\Drucker.kix

Schreibt ruhig wenn es Euch gefällt.

Gruß,

MisterIX

Hier das Skript (in Textdatei einfügen, anpassen und in Drucker.kix umbenennen):

;************************************************************Schnipp***************************************************************

$Version =1

SetConsole("Hide")  


;*******************************************************************************************************
;*In diesen Arrays sind für jeden Druckerbereich die aktuellen Drucker eingtragen. (Druckergruppen)    *
;*Neue Drucker oder Namensänderungen können mit Ihrem FREIGABENAMEN eingetragen werden.                *
;*Der Stern zeigt an, dass dannach der INSTALLATIONSNAME des Standarddruckers kommt                    *         
;*******************************************************************************************************

$Buchhaltungsdrucker = "Versand_KYO_FS3900N_PCL", "*", "Versand_SWLaser"  



$Einkaufsdrucker = "QM_OKI5750_PCL6", "Einkauf_CAN_IR1022IF_PCL6","Einkauf_HP_BIJ2230_PCL5", "*", "Einkauf_Laserfax"  



;************************************************************************************
;hier bitte den Printserver eintragen von dem die Drucker installiert werden sollen!*
;************************************************************************************


$Printserver= "\\Printserver1"  

;************************************************************************************


 
$Druckinstall=0

;*********************************** Registry auslesen ******************************************************************

$Aktuell = ReadValue("HKEY_CURRENT_USER\Printers\Druckerinstallation", "Version")  

;*********************************** aktuelle Druckgruppe ermitteln******************************************************

$PrintGroup = PrinterGroupID

if $PrintGroup=""   

 sleep 10 
 $PrintGroup = PrinterGroupID 

endif ;***********Manchmal geht die Anmeldung zu schnell**********



;******************Achtung : hier den Domänennamen angeben!**************************************************************

IF ComputerInGroup (noprint, Domäne) goto ende endif ; **** Computer ist Teil der Gruppe noprint und wurde von Druckerverteilung ausgeschlossen *** 


;************************************ Erstinstallation ******************************************************************



IF $Aktuell=0 
  
  WriteValue("HKEY_CURRENT_USER\Printers\Druckerinstallation","Version", $Version,  "REG_MULTI_SZ")  
  WriteValue("HKEY_CURRENT_USER\Printers\Druckerinstallation","Gruppe", $PrintGroup,  "REG_MULTI_SZ")  

endif

;*********************************** Registry auslesen ******************************************************************


$PrintGroupR= ReadValue("HKEY_CURRENT_USER\Printers\Druckerinstallation", "Gruppe")  

IF $Version<>$Aktuell or $Printgroup<>$PrintgroupR

messagebox("Die Druckerinstallation muss upgedated werden ! Version: "+$Aktuell+ " nach Version: "+$Version+" Druckgruppe: "+$PrintGroupR+" nach Druckgruppe: "+$Printgroup, "Drucker updaten !",016,0)  


WriteValue("HKEY_CURRENT_USER\Printers\Druckerinstallation","Version", $Version,  "REG_MULTI_SZ")  
WriteValue("HKEY_CURRENT_USER\Printers\Druckerinstallation","Gruppe", $Printgroup,  "REG_MULTI_SZ")  
  

;**************************************************************************************
;hier bitte den Printserver eintragen von dem die Drucker deinstalliert werden sollen!*
;**************************************************************************************

DeleteAllPrinters(AlterPrintserver)  

;********************Hier nochmals den neuen Printserver eintragen!********************


DeleteAllPrinters(Printserver) 

? "Computername:" +@wksta  

;*********************************************Druckerverbinden (Druckgruppe (im ADS), Druckergruppe)******************


Druckerverbinden(DruckBuchhaltung, $Buchhaltungsdrucker,$Printserver)


Druckerverbinden(DruckEinkauf, $Einkaufsdrucker,$Printserver)


;*********************************************************************************************************************************************

If $Druckinstall=0

  messagebox("Der Rechner ist nicht Mitglied einer Druckgruppe !", "Drucker nicht installiert...",016,0)  

else

  messagebox("Ihre Drucker wurden neu verbunden mit dem Printserver: "+$Printserver, "Drucker wurden installiert. MfG, MisterIX 2009",064,0)  

Endif


Else


;messagebox("Die Druckerinstallation muss nicht upgedated werden ! Version: "+$Aktuell, "Drucker aktuell !",064,0)  

Endif

:ende
Exit

;**********************************************************Hier kommen die Funktionen !***********************************************************


Function ComputerInGroup($group,optional $Domain) 

  Dim $oGrp 

  if not $domain          
    $domain=@domain         
  endif 
  
  $oGrp = GetObject("WinNT://" + $domain + "/"  + $group + ",group" )   
  if @error       
   exit 1          
  endif 

  if $oGrp.IsMember("WinNT://" + $domain + "/"  + @wksta + "$$" )  		         $ComputerInGroup=1   
   else 			
     $ComputerInGroup=0 
   endif 

endfunction 

Function DeleteAllPrinters($server)
? "Funktion aufgerufen mit:"+$server  
sleep 1

$Index = 0
$TempPrinter = ""  

;Erstellt eine Liste mit allen installierten Druckern

Dim $PrinterArray[40]
:Loop
If @ERROR=0
$TempPrinter = $TempPrinter + EnumValue("HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\PrinterPorts",$Index) + ","  
$Index = $Index + 1
GoTo "Loop"  
EndIf

$TempPrinter = Trim($TempPrinter)
$Length = Len("$TempPrinter") - 2  
$TempPrinter = Left("$TempPrinter","$Length")  
$PrinterArray = Split("$TempPrinter",",")  


;trennt alle Netzwerkdrucker

For $Count = 0 to $Index-2
$Temp=$PrinterArray[$Count]
? $Temp+", "+$server  
IF INSTR("$Temp","$server")<>0  
$rc=DelPrinterConnection ($PrinterArray[$Count])
Endif
Next


Endfunction
*********************************************************Achtung! Hier die im ADS angelegten Druckgruppen eintragen!********************
Function PrinterGroupID

$ID=0

;IF ComputerInGroup(Druck****,Domaene) $ID=$ID+1 Endif

;IF ComputerInGroup(Druck****,Domaene) $ID=$ID+2 Endif

;IF ComputerInGroup(Druck****,Domaene) $ID=$ID+4 Endif

;IF ComputerInGroup(Druck****,Domaene) $ID=$ID+8 Endif

;IF ComputerInGroup(Druck****,Domaene) $ID=$ID+16 Endif

;IF ComputerInGroup(Druck****,Domaene) $ID=$ID+32 Endif

;IF ComputerInGroup(Druck****,Domaene) $ID=$ID+64 Endif

IF ComputerInGroup(DruckEinkauf,Domaene) $ID=$ID+128 Endif

;IF ComputerInGroup(Druck****,Domaene) $ID=$ID+256 Endif

;IF ComputerInGroup(Druck****,Domaene) $ID=$ID+512 Endif

IF ComputerInGroup(DruckBuchhaltung,Domaene) $ID=$ID+1024 Endif

;IF ComputerInGroup(Druck****,Domaene) $ID=$ID+2048 Endif

;IF ComputerInGroup(Druck****,Domaene) $ID=$ID+4096 Endif

;IF ComputerInGroup(Druck****,Domaene) $ID=$ID+8192 Endif

IF ComputerInGroup(noprint,Domaene) $ID=$ID+16384 Endif ;************** die Gruppe noprint wird im ADS angelegt und dient zum ausschliessen von Rechnern aus der Druckerverteilung (ZB. Server)

;? "Dezimale ID: "+$ID  

$PrinterGroupID=$ID

Endfunction


Function Druckerverbinden($Druckgruppe, $Druckergruppe, $Print)

$X=0

;******************Achtung : hier nochmals den Domänennamen angeben!*******************************************************

IF ComputerInGroup($Druckgruppe,Domaene)

? "Computer ist Mitglied der Druckergruppe: "+$Druckgruppe+"   ! "  

Do

If $Druckergruppe[$x]<>"*"  

   ;? "Drucker "+ $Print+"\"+$Druckergruppe[$x]+" wird instaliert !! "  
  
   ADDPrinterConnection($Print+"\"+$Druckergruppe[$x])  
  
   $x=$x+1
 
Endif

Until $Druckergruppe[$x]="*"  

$Druckinstall=1

;? "Standard: "+$Print+"\"+$Druckergruppe[$x+1]  

SetDefaultPrinter($Print+"\"+$Druckergruppe[$x+1])  


Endif

Endfunction

;***************************************************************Schnapp********************************************

Content-Key: 108171

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

Ausgedruckt am: 19.03.2024 um 02:03 Uhr

Mitglied: dog
dog 05.02.2009 um 14:54:56 Uhr
Goto Top
BITTE schau dir mal die Formatierungshilfe an:
Mitglied: MisterIX
MisterIX 05.02.2009 um 15:47:14 Uhr
Goto Top
Gut das mit der Quellcodeformatierung. Danke für den Hinweis.
Mitglied: MisterIX
MisterIX 05.02.2009 um 15:48:03 Uhr
Goto Top
Übrigens solltest Du die Uhr an Deinem Rechner mal stellen... ;)
Mitglied: MisterIX
MisterIX 06.02.2009 um 11:53:21 Uhr
Goto Top
Achtung habe in Zeile 43 noch eine kleine Änderung vorgenommen:

Es muss heissen if $PrintGroup="" anstatt if $PrintGroup="0" ansonsten funktioniert die Wartepause nicht, die eingehalten werden soll, wenn keine Druckgruppe vom DC ermittelt werden kann.