shakey
Goto Top

Logonscript, Printserver abändern

Guten Tag Liebe Community

Es geht um folgendes.

Wir haben zur Zeit in der Firma 2 Printserver.

1x einer für 32bit (Printer1)
1x einer für 64 bit (Printer2)

nun habe ich einen erstellt, der beide Treiber zur Verfügung stellt. (Printer3)

Doch nun geht es um die integrierung des Printservers. Es sollte im Logonscript herausgelesen werden, welcher Benutzer welchen Drucker schon installiert hat und den löschen und vom neuen Server dann wieder anziehen.

Ich habe mich nun lange schlau gemacht, doch ich komme nicht weiter.

Mit rundll32 printui.dll, PrintUIEntry /ge /f printer.txt habe ich mal die installierten Printer in eine Textdatei gebracht.

Wie kann ich das einfach anstellen, habt ihr eine Idee?

Vielen Dank schonmal,
es Grüsst Shakey!

Content-Key: 184169

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

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

Member: Henschki
Henschki Apr 26, 2012 at 13:13:32 (UTC)
Goto Top
Hallo,

1.) Drucker anpassen/pflegen:
2.) „printmig.exe“ auf den Print1 und Print 2 öffnen
3.) Actions -> Backup…; dieses Backup auf ein Netzlaufwerk legen
4.) Die Textdatei „Drucker.txt“Dort sind alle Drucker eingetragen:
Auf ein Netzlaufwerk kopieren wo alle Nutzer vollen zugriff haben
5.) Das Script „Druckerverbindung.vbs“ anpassen mit dem Pfad zur Textdatei.
6.) „printmig.exe“ auf den Print3 öffnen
7.) Actions -> Restore…; die zuvor gespeicherte „*.cap“ auswählen und zurück sichern.
8.) Den Nutzer das Script zukommen lassen und ausführen. ( ohne Adminrechte möglich )
9.) Ausführen des Script kann bis zu 10min dauern, je nachdem wie viele Drucker eingebunden werden müssen.

Bsp für drucker.txt:
DruckerAlt;DruckerNeu

"\\Print1\d001";"\\print3\d001"

Script:
' Name: Druckerverbindung.vbs  
' Author: Martin Henschke   
' Client Script um die Druckserver um zuleiten  
'  
'  
'  


' Pfad zur Druckerdatei  
strDBPfad = "\\PFAD\Drucker.txt"  
' Druckerdatei temporär kopieren, um Sperrkonflikte zu umgehen  
Set objFSO = CreateObject("Scripting.FileSystemObject")  
Set objDBDatei = objFSO.GetFile(strDBPfad)
strDBDateilokal = objFSO.GetTempName
strTemppfad = objFSO.GetSpecialFolder(2)
strDBPfadlokal = objFSO.BuildPath(strTemppfad, strDBDateilokal)
objDBDatei.Copy strDBPfadlokal

' Tabelle hier: Name der Textdatei  
strTabelle = strDBDateilokal

' ADO-Objekte  
Set objConn = CreateObject("ADODB.Connection")  
' weitere Objekte  
Set objNetwork = CreateObject("WScript.Network")  
Set objShell = CreateObject("Wscript.Shell")  
Set objWMI = GetObject("winmgmts:\\.\root\CIMV2")  


objConn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _  
	"Data Source=" & strTemppfad & ";" & _  
	"Extended Properties=""text;HDR=YES;FMT=Delimited"""  
strText = ""  

' Druckerverbindungen des Benutzers durchlaufen  
Set colDrucker = objNetwork.EnumPrinterConnections
' Im jeweils zweiten Wert steht der Druckername  
For i=0 To colDrucker.Count-1 Step 2
	strDruckerAlt = colDrucker(i + 1)
	' In Datenbank nach der aktuellen Verbindung suchen  
	Set objRS = objConn.Execute("SELECT * FROM " & strTabelle & " WHERE DruckerAlt = '" _  
	& strDruckerAlt & "'")  



	' Falls Drucker gefunden (objRS nicht leer) ...  
	If Not objRS.EOF Then
		' ... neuen Drucker herausfinden  
		strDruckerNeu = objRS("DruckerNeu")  
		' ... und verbinden  
		DruckerSetzen strDruckerAlt, strDruckerNeu
	End If
Next

' Erfolg melden  
'If strText <> "" Then  
'	objShell.Popup strText, 10, "Druckerumzug"  
'End If  

' Lokale Textdatei schließen und löschen  
objRS.Close
Set objDBDateilokal = objFSO.GetFile(strDBPfadlokal)
objDBDateilokal.Delete

Sub DruckerSetzen(strDruckerAlt, strDruckerNeu)
	' ist der alte Drucker der Standarddrucker?  
	strDruckerWQL = Replace(strDruckerAlt, "\", "\\")  
	strWQL = "SELECT Default FROM Win32_Printer " _  
		& "WHERE Name = '" & strDruckerWQL & "'"  
	Set colPrinters = objWMI.ExecQuery(strWQL)
	If colPrinters.Count > 0 Then
		For Each objPrinter In colPrinters
			If objPrinter.Default = vbTrue Then
				flgDefault = True
			Else	
				flgDefault = False
			End If
		Next
	End If
	' alte Verbindung entfernen  
	objNetwork.RemovePrinterConnection strDruckerAlt, True, True
	strText = strText & strDruckerAlt & " entfernt." & VbCrLf  
	' neue Verbindung hinzufügen  
	objNetwork.AddWindowsPrinterConnection strDruckerNeu
	strText = strText & strDruckerNeu & " hinzugefügt." & VbCrLf  
	If flgDefault Then
		objNetwork.SetDefaultPrinter(strDruckerNeu)
		strText = strText & strDruckerNeu & " ist Standarddrucker." & VbCrLf  
	End If
End Sub

[Edit Biber] Codeformatierung [/Edit]
Member: Shakey
Shakey Apr 26, 2012 at 14:04:29 (UTC)
Goto Top
Vielen Dank schon mal, ich bin es am ausprobieren.

Ich werde mich dazu noch melden.

Danke

Shakey
Member: Shakey
Shakey Apr 27, 2012 at 09:13:43 (UTC)
Goto Top
Moin

Kannst du, oder sonst jemand hier, mir nochmals erklären, wie das Drucker.txt file genau formatiert sein muss?

Vielen Dank
Shakey
Member: Henschki
Henschki Apr 27, 2012 at 12:05:23 (UTC)
Goto Top
Einfach eine TXT erstellen, und diese so anpassen ->


DruckerAlt;DruckerNeu

"\\print01\d001";"\\print03\d001"
"\\print01\d002";"\\print03\d002"
"\\print01\d003";"\\print03\d003"
"\\print01\d004";"\\print03\d004"
"\\print01\d005";"\\print03\d005"
"\\print02\d006";"\\print03\d006"
"\\print02\d007";"\\print03\d007"
"\\print02\d008";"\\print03\d008"
"\\print02\d009";"\\print03\d009"
"\\print02\d0010";"\\print03\d0010"
Member: Shakey
Shakey Apr 27, 2012 at 12:52:12 (UTC)
Goto Top
Kannst du das Script nicht ohne Zeilenumbrüche hier posten?

Ich bekomme da ständige Fehlermeldungen..

Wäre Dir echt dankbar..
Bei Zeile 22 fängt es an und dann endlos..

Grüsse Shakey
Member: Henschki
Henschki May 22, 2012 at 11:21:48 (UTC)
Goto Top
hat die Umstellung funktioniert?
Member: Shakey
Shakey May 22, 2012 at 11:26:47 (UTC)
Goto Top
Hallo Henschki

Leider funktionierte es bei mir nicht, deshalb habe ich einfach selbst nen Script gebastelt..

Folgendes Script hat mir dann dass gemacht, was ich brauchte.


#Rechte zum Scriptausführen vergeben
set-executionpolicy remotesigned

#Beispiel-Aufruf
#.\printerManagement.ps1 \\srhw8024 \\srhw8020

#Übergabeparameter auslesen
$alterPrinterServerParam = $args
$neuerPrinterServerParam = $args[1]

#interne Variablen setzen
$Class = "win32_printer"
$printerListFile = "C:\printer.txt"

#Übergabeparameter in Variablen abfüllen
$alterPrinterServer = $alterPrinterServerParam
$neuerPrinterServer = $neuerPrinterServerParam
#mögliche Space's entfernen
$alterPrinterServer = $alterPrinterServer.Trim()
$neuerPrinterServer = $neuerPrinterServer.Trim()

#Netwerk-Objekt setzen
$net = new-Object -com WScript.Network

#Ausgabe
cmd.exe /c "Echo Ersetzte Printer-Server:$alterPrinterServer durch Printer-Server:$neuerPrinterServer"

#Interne Printer nach Muster ($alterPrinterServer) durchsuchen und in File($printerListFile) schreiben
Get-WmiObject -class $Class | Where-Object {$_.SystemName -like $alterPrinterServer} | ft Name | Out-File $printerListFile

#Überflüssige Zeilen in File suchen und löschen
(type $printerListFile) -notmatch "^$" | Out-File $printerListFile #leere Zeile entfernen
(type $printerListFile) -notmatch "Name" | Out-File $printerListFile #'Name' entfernen
(type $printerListFile) -notmatch "----" | Out-File $printerListFile #'-' entfernen

#File Zeile für Zeile auslesen
Foreach ($Line in Get-Content $printerListFile)
{
#ist Suche(Zeile:30) leer wird 'True' in File geschrieben -> Abbruch
if ($Line -notlike "True")
{
#Space entfernen
$Line = $Line.Trim()

#Alter Printer-Eintrag löschen
$net.RemovePrinterConnection($Line)

#String-Manipulation: Alter Printer-Server mit neuem Printer-Server ersetzen
$Line = $Line.Replace($alterPrinterServer , $neuerPrinterServer)

#Neuer Printer-Eintrag hinzufügen
$net.AddWindowsPrinterConnection($Line)

#Ausgabe
cmd.exe /c "Echo $Line"
}
}

#Ausgabe
cmd.exe /c "Echo ENDE"


trotzdem herzlichen Dank, auch für die Nachfrage!

Greetz Shakey
Member: Wissar
Wissar Jun 13, 2014 at 10:45:06 (UTC)
Goto Top
Hey, hatte jetzt auch selbiges Problem.

Habe es aber über einen Batch Script lösen können der dann einmal pro User beim Logon läuft.

Dabei wird auch der vorherige Standard drucker wieder gesetzt.

script sieht dann in etwa so aus:
(Printer und Servernamen wurden hier durch platzhalter ersetzt ;) )

@echo off
set Printer1=d001
set Printer2=d002
set Printer3=d003
set Printer4=d004
set Printer5=d005
set Printer6=d006
set Printer7=d007
set Printer8=d008
set Printer9=d009
set Printer10=d010
set Printer11=d011
set Printer12=d012
set Printer13=d013
set Printer14=d014
set Printer15=d015
set Printer16=d016
set Printer17=d017
set Printer18=d018
set Printer19=d019
set Printer20=d020
set Printer21=d021
set Printer22=d022
set Printer23=d023
set Printer24=d024
set Printer25=d025
set Printer26=d026
set Printer27=d027
set Printer28=d028
set Printer29=d029
set Printer30=d030
set Printer31=d031
set Printer32=d032
set Printer33=d033
set Printer34=d034
set Printer35=d035
set Printer36=d036
set Printer37=d037
set Printer38=d038
set Printer39=d039
set Printer40=d040
set Printer41=d041
set Printer42=d042
set Printer43=d043
set Printer44=d044
set Printer45=d045
set Printer46=d046
set Printer47=d047
set Printer48=d048
set Printer49=d049
set Printer50=d050
set Printer51=d051
set Printer52=d052
set Printer53=d053
set Printer54=d054
set Printer55=d055
set Printer56=d056
set Printer57=d057
set Printer58=d058
set Printer59=d059
set Printer60=d060
set Printer61=d061
set Printer62=d062
set Printer63=d063
set Printer64=d064
set Printer65=d065
set Printer66=d066
set Printer67=d067
set Printer68=d068

::echo Druckerpfade werden auf neuen Druckserver geändert, dies kann einen Moment dauern.
reg query "HKCU\Software\Microsoft\Windows NT\CurrentVersion\Devices" |findstr \\ >c:\Temp\printer.txt
reg query "HKCU\Software\Microsoft\Windows NT\CurrentVersion\Windows" /v Device >c:\Temp\defaultprinter.txt

setlocal enabledelayedexpansion

set PrtNr=1

:loop

::echo !Printer%PrtNr%!
CALL set CheckPrinter=!Printer%PrtNr%!
::echo %CheckPrinter%

find /I "\\ALTERSERVER\%CheckPrinter%" C:\Temp\defaultprinter.txt

IF %ERRORLEVEL% == 0 (
echo Drucker %CheckPrinter% wird neu Tempiert.
rundll32 printui.dll,PrintUIEntry /q /dn /n "\\ALTERSERVER\%CheckPrinter%"
rundll32 printui.dll,PrintUIEntry /q /in /n "\\NEUERSERVER\%CheckPrinter%"
rundll32 printui.dll,PrintUIEntry /q /y /n "\\NEUERSERVER\%CheckPrinter%"

goto :mark
)

find /I "ALTERSERVER\%CheckPrinter%" C:\Temp\printer.txt

IF %ERRORLEVEL% == 0 (
echo Drucker %CheckPrinter% wird neu Tempiert.
rundll32 printui.dll,PrintUIEntry /q /dn /n "\\ALTERSERVER\%CheckPrinter%"
rundll32 printui.dll,PrintUIEntry /q /in /n "\\NEUERSERVER\%CheckPrinter%"
)
:mark
::echo %PrtNr%
::pause
set /a PrtNr+=1
IF %PrtNr% lss 69 goto :loop
del C:\Temp\printer.txt
del C:\Temp\defaultprinter.txt
cls
echo Druckerpfade wurden auf neuen Server geaendert.
echo\
echo\

Pause