superwasi
Goto Top

Druckerport auslesen

Druckerport LPT, USB oder TCP?

Hallo zusammen. Ich habe ein kleines Problem und hoffe das mir ein schlauer Kopf weiter helfen kann!

Gibt es die Möglichkeit mit einem VB Script herauszufinden, ob der Druckerport für einen LPT USB oder Netzwerkdrucker bestimmt ist?

Oder gibt es über den Druckernamen die Möglichkeit, beispielsweise mit einem Regestryeintrag herauszufinden, mit was für einer Schnittstelle der Drucker angeschlossen ist?

Danke im voraus.

Content-Key: 98831

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

Printed on: April 26, 2024 at 02:04 o'clock

Member: superwasi
superwasi Oct 09, 2008 at 08:53:13 (UTC)
Goto Top
Oder anderst gefragt, gibt es denn keine Möglichkeit per VBS die Anschlussart eines Druckers (LPT, USB, TCP also Netzwerkseitig) heraus zu finden?

Danke im voraus.
Member: Jochem
Jochem Oct 09, 2008 at 11:07:28 (UTC)
Goto Top
Moin,
in der Registry von W2K:

HKLM - System - CurrentControlSet - Control - Print - Printers

gibt es für jeden im System konfigurierten Drucker einen Eintrag. Einer der zugehörigen Schlüssel dazu lautet "Port".

Bei einem Netzwerkdrucker steht dort die jeweilige IP-Adresse drin, bei einem parallel angeschlossenen Drucker entsprechend "LPT1:", bei USB eben dann "USB001".

Wie Du die Werte nun ausgelesen bekommst, dazu können Dir sicher die VBS-Spezis Hilfestellung geben.
Member: superwasi
superwasi Oct 10, 2008 at 09:23:25 (UTC)
Goto Top
Danke Jochem! face-smile

Das war genau das, was ich benötigt habe.

Super!!!
Member: superwasi
superwasi Oct 10, 2008 at 09:43:00 (UTC)
Goto Top
Ich poste mal hier das ganze Script, fals jemand davon was brauchen sollte.
Ihr müsst nur darauf achten, dass manche Zeilenumbrüche durch das einfügen auf diese Seite entsatnden sind, die nicht zum Programm gehören.


'Variablen und Konstaten deklarieren
Dim SQLStr, strRecordSet, strComputer,druckerString,druckerString2,erstesZeichen,printServerName,druckerNummer,printserver1Oder2,printserver,printerName,nichtslash,zwischenspeicher, oldPrintServerName
Dim ipZaehler,strCommand,abgeschnitteneZahl,Value

'Hier wird der aktuell angemeldete User und der WS- Name ausgelesen.
Set Testobjekt= CreateObject("WScript.Network")
benutzername = Testobjekt.UserName
wsname = Testobjekt.ComputerName

'Hier wird das aktuelle Datum ausgelesen.
datum = date()

'Verbindung mit Datenbank herstellen.
StrConnect = "Driver={SQL Server};Server=sqlc8;Database=Printserver;"
Set conn = CreateObject("ADODB.Connection")
conn.Open StrConnect

On Error Resume Next

'Als Computeradresse wird ein . angegeben. Somit wird der Lokalhost angesprochen.
strComputer= "."

'Unterhalb werden die Drucker ausgelesen die auf dem lokalen Rechner installiert sind.
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * from Win32_Printer",,48)
For Each objItem In colItems

'Der Name des Druckers wird der Variable druckerString übergenem.
druckerString = objItem.Name

'Die Variable druckerString wird zerlegt um zu überprüfen, ob es sich um einen
'lokal oder netzwerkseitig installierten Drucker handelt.
erstesZeichen = Left (druckerString,1)
'MsgBox druckerString
'Wenn der Drucker über einen Printserver installiert ist, durchläuft der
'Drucker den ersten Teil der Schleife.
If (erstesZeichen="\")then

'Es werden die ersten zwei Zeichen nach den voranführenden "\\" an die
'Variabel "printServerName" übergeben
printServerName = Mid (druckerString,3,2)

'Hier wird der druckerName vom Rest des Strings getrennt.
'Ausgangsstring sieht in etwa so aus \\ps-bsgpsa11\prn1865.
druckerString2 = druckerString

'In der folgenden Schleife wird jedes Zeichen von hinten her
'kontrolliert, ob es ein "\" ist, sobald das Zeichen ein "\" ist wird
'die Schleife unterbrochen. Zusätzlich werden alle Zeichen gezählt.
While (nichtslash = 0)
zwischenspeicher = Right(druckerString2, 1)

If (zwischenspeicher <> "\") Then
druckerString2 = Left(druckerString2, Len(druckerString2) -1)
buchstabenzaehler = buchstabenzaehler + 1
End If
If (zwischenspeicher = "\") Then
nichtslash = 1
End If
Wend

'Der Druckername wir aus dem String "druckerString" mit der ermittelten
'Anzhal an Zeichen an die Variable "druckerName" übergeben
printerName = Right(druckerString, buchstabenzaehler)


'Wenn der Printservername mit "PS" oder "ps" anfängt führe den ersten
'Teil der Wenn- Bedingung aus, ansonsten den zweiten oder dritten.
If (printServerName = "PS" Or printServerName = "ps" )then

'Der Name des alten Printserver wird an die Variabel
'"oldPrintServerName" übergeben
oldPrintServerName = Mid (druckerString,3,11)

'Kontrolle, ob der ermittelte Benutzer mit dem ermittelten
'Computer bereits in der DB erfasst wurde
Set recordSet = CreateObject("ADODB.Recordset")
SQLStr = "SELECT COUNT(*) AS AnzRows FROM dbo.tPrinterCheck WHERE (wsname = '" & wsname & "') AND (printerName = '" & printerName & "') AND (username = '" & benutzername & "')"
recordSet.Open SQLStr, conn, 1, 1
recordSet.MoveFirst

Do Until recordSet.EOF

strRecordSet = recordSet(0)

'Wenn noch kein Eintrag in der DB vorhanden ist, führe
'die Wenn- Bedingung aus.
If strRecordSet = "0" Then
'Informationen werden in Datenbank geschrieben.
'Installationsart alter Printserver.
Set cmd = CreateObject("ADODB.Command")
cmd = "INSERT INTO tPrinterCheck(datum, username, wsname, printerName,OldPrintServer) VALUES ('" & datum & "', '" & benutzername & "', '" & wsname & "', '" & printerName & "', '" & oldPrintServerName & "')"
conn.Execute cmd
End If

recordSet.MoveNext
Loop

'Wenn der Printservername(Workstation die einen Pr freigibt) mit "WS"
'oder "ws" anfängt führe den ersten Teil der Wenn- Bedingung aus,
'ansonsten den dritten Teil.
ElseIf(printServerName = "WS"Or printServerName = "ws" )then

'Der Name Workstation wird an die Variabel "wsDiePrShared"
'(Workstation die printer shared) übergeben
wsDiePrShared = Mid (druckerString,3,6)


'Kontrolle, ob der ermittelte Benutzer mit dem ermittelten
'Computer bereits in der DB erfasst wurde.
Set recordSet = CreateObject("ADODB.Recordset")
SQLStr = "SELECT COUNT(*) AS AnzRows FROM dbo.tPrinterCheck WHERE (wsname = '" & wsname & "') AND (printerName = '" & printerName & "') AND (username = '" & benutzername & "')"
recordSet.Open SQLStr, conn, 1, 1
recordSet.MoveFirst

Do Until recordSet.EOF

strRecordSet = recordSet(0)

'Wenn noch kein Eintrag in der DB vorhanden ist, führe
'die Wenn- Bedingung aus
If strRecordSet = "0" Then
'Informationen werden in Datenbank geschrieben.
'Installationsart neuer Printserver.
Set cmd = CreateObject("ADODB.Command")
cmd = "INSERT INTO tPrinterCheck(datum, username, wsname, printerName, sharePrintserver) VALUES ('" & datum & "', '" & benutzername & "', '" & wsname & "', '" & printerName & "','" & wsDiePrShared & "')"
conn.Execute cmd
End If

recordSet.MoveNext
Loop

Else
'Unterhalb wird selektiert ob der Drucker auf den Printserver
'vm-ps01 oder vm-ps02 installiert wird.
druckerNummer = Right (druckerString,4) 'Hier wird die
'vierstellige Zahl des druckerStrings abgeschnitten.
printserver1Oder2 = druckerNummer Mod 2
If (printserver1Oder2 = "0")then 'Wenn das Ergebnis 0 ist wird
'der Printservername vm-ps02 in die DB geschrieben.
printserver = "vm-ps02"
Else 'Wenn das Ergebnis 0 ist wird der Printservername vm-ps01
'in die DB geschrieben.
printserver = "vm-ps01"
End If

'Kontrolle, ob der ermittelte Benutzer mit dem ermittelten
'Computer bereits in der DB erfasst wurde.
Set recordSet = CreateObject("ADODB.Recordset")
SQLStr = "SELECT COUNT(*) AS AnzRows FROM dbo.tPrinterCheck WHERE (wsname = '" & wsname & "') AND (printerName = '" & printerName & "') AND (username = '" & benutzername & "') AND (newPrintserver = '1')"
recordSet.Open SQLStr, conn, 1, 1
recordSet.MoveFirst

Do Until recordSet.EOF

strRecordSet = recordSet(0)

'Wenn noch kein Eintrag in der DB vorhanden ist, führe
'die Wenn- Bedingung aus
If strRecordSet = "0" Then
'Informationen werden in Datenbank geschrieben.
'Installationsart neuer Printserver.
Set cmd = CreateObject("ADODB.Command")
cmd = "INSERT INTO tPrinterCheck(datum, username, wsname, printerName, newPrintserver) VALUES ('" & datum & "', '" & benutzername & "', '" & wsname & "', '" & printerName & "','" & printserver & "')"
conn.Execute cmd
End If

recordSet.MoveNext
Loop

End If

'Leere den Inhalt der Variable "druckerName"
printerName = 0

'Wenn der Drucker lokal installiert ist, durchläuft er den zweiten Teil der
'Schleife.
Else
'Kontrolle, ob der lokal installierte Drucker ein Anwendungsdrucker
'ist, wie z.B. ein "Adobe PDF"- Drucker.
'Ist dies der Fall, dann führe die erste Bedingung aus, ansonsten die
'zweite.
If (druckerString="Adobe PDF") Or (druckerString="Microsoft XPS Document Writer") Or (druckerString="CSB-PDF-PRINTER") Or (druckerString="Smart Label Printer 240") then
'Wenn ein "Adobe PDF" Drucker oder "Microsoft XPS Document
'Writer" intsalliert ist, wird dieser nicht in die Datenbank
'geschrieben.

Else

'Hier wird der Anschlusstyp aus der Regestry ausgelesen (USB, LPT, TCP).
Const HKEY_LOCAL_MACHINE = &H80000002
Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & _
strComputer & "\root\default:StdRegProv")
'Hier wird aus der Regestrie der Hostname ausgelesen, der zum
'Port gehört.
Set WshShell = CreateObject("WScript.Shell")
Path = "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Printers\"& druckerString & "\Port"
Value = WshShell.RegRead(Path)

'Da die Bezeichnung USB,LPD am Anfang oder Schluss der
'Portbezeichnung vorkommt werden die ersten 3 und letzten 3
'Zeichen überprüft.
anschlussart = Left (Value,3)
anschlussart2 = Right (Value,3)

'Wenn die folgende Zeichenkombinationen zutreffen, wird
'folgender Teil der Schleife durchlaufen.
If (anschlussart = "USB") Or (anschlussart = "usb") Or (anschlussart2 = "USB") Or (anschlussart2 = "usb")then
'Wertübergabe des ermittelten Druckernamens an die
'Variabel "druckerName"
printerName = druckerString

Set recordSet = CreateObject("ADODB.Recordset")
SQLStr = "SELECT COUNT(*) AS AnzRows FROM dbo.tPrinterCheck WHERE (wsname = '" & wsname & "') AND (printerName = '" & printerName & "') AND (username = '" & benutzername & "')"
recordSet.Open SQLStr, conn, 1, 1
recordSet.MoveFirst

Do Until recordSet.EOF

strRecordSet = recordSet(0)

If strRecordSet = "0" Then
'Informationen werden in Datenbank
'geschrieben. Installationsart lokal.
Set cmd = CreateObject("ADODB.Command")

cmd = "INSERT INTO tPrinterCheck(datum, username, wsname, printerName, lokal, USB_LPT_TCP) VALUES ('" & datum & "', '" & benutzername & "', '" & wsname & "', '" & printerName & "','1','USB')"
conn.Execute cmd
End If

recordSet.MoveNext
Loop

'Wenn die folgende Zeichenkombinationen zutreffen, wird
'folgender Teil der Schleife durchlaufen.
ElseIf (anschlussart = "LPT") Or (anschlussart = "lpt") Or (anschlussart2 = "LPT") Or (anschlussart2 = "lpt")then
'Wertübergabe des ermittelten Druckernamens an die Variabel
'"druckerName"
printerName = druckerString

Set recordSet = CreateObject("ADODB.Recordset")
SQLStr = "SELECT COUNT(*) AS AnzRows FROM dbo.tPrinterCheck WHERE (wsname = '" & wsname & "') AND (printerName = '" & printerName & "') AND (username = '" & benutzername & "')"
recordSet.Open SQLStr, conn, 1, 1
recordSet.MoveFirst

Do Until recordSet.EOF

strRecordSet = recordSet(0)

If strRecordSet = "0" Then
'Informationen werden in Datenbank geschrieben.
'Installationsart lokal.
Set cmd = CreateObject("ADODB.Command")
cmd = "INSERT INTO tPrinterCheck(datum, username, wsname, printerName, lokal, USB_LPT_TCP) VALUES ('" & datum & "', '" & benutzername & "', '" & wsname & "', '" & printerName & "','1','LPT')"
conn.Execute cmd
End If

recordSet.MoveNext
Loop


Else

'Wertübergabe des ermittelten Druckernamens an die
'Variabel "druckerName"
printerName = druckerString

Set recordSet = CreateObject("ADODB.Recordset")
SQLStr = "SELECT COUNT(*) AS AnzRows FROM dbo.tPrinterCheck WHERE (wsname = '" & wsname & "') AND (printerName = '" & printerName & "') AND (username = '" & benutzername & "') AND (lokal = '1')"
recordSet.Open SQLStr, conn, 1, 1
recordSet.MoveFirst

Do Until recordSet.EOF

strRecordSet = recordSet(0)

If strRecordSet = "0" Then
'Informationen werden in Datenbank
'geschrieben. Installationsart lokal.
Set cmd = CreateObject("ADODB.Command")
cmd = "INSERT INTO tPrinterCheck(datum, username, wsname, printerName, lokal, USB_LPT_TCP) VALUES ('" & datum & "', '" & benutzername & "', '" & wsname & "', '" & printerName & "','1','TCP')"
conn.Execute cmd
End If

recordSet.MoveNext
Loop
End If
End If

End If
Next