Kezdőoldal > General > Local printer inventory

Local printer inventory


Felmerült a kérdés, hogy miként lehet leltárba venni a nyomtatókat.

A hálózati nyomtatók általában SNMP protokollon keresztül elérhetőek, azon keresztül minden paraméterük lekérdezhető (erre rengeteg program létezik a neten), így azokkal nincs gond – de a helyi nyomtatók bizony nem ennyire lekövethetőek. Az Everest/Aida64 megmondja ugyan, hogy egy adott gépre milyen nyomtatók vannak telepítve, de ha mondjuk egy nyomtatót úgy veszünk fel, hogy a helyi port egy hálózati helyre mutat, máris megdőlt a lekérdezhetőség. 

Körbejárva a témát, kiderült, hogy egyrészt az SMS (illetve az utód, az SCCM) konfig-állomány módosítással le tudja kérdezni, de akinek nincs akkora cége, hogy beüzemeljen egy ilyen kaliberű programot, az bizony hátrányos helyzetben van.

Ennek ellensúlyozására összedobtam egy vbs állományt. Egyrészt azért nem PowerShell, mert feltételezem, hogy lehetnek még olyan gépek, amelyekre nincs telepítve, másrészt így hétköznapi embernek is megérthető 🙂 Sőt, a script lekezeli a Windows 2000-t is (ott ugyanis a nyomtatóknak kevesebb tulajdonságuk volt lekérdezhető). Aki mindenképp PS-t akar, ennek vagy ennek alapján el tud indulni.

Megjegyzésként annyit, hogy két dolgot kell állítani: az útvonalat, ahova tárolja a keletkezett csv állományokat, valamint az isReport értékét (True, False). Ez utóbbi változó True értéke esetén csak az állomány végén található függvényben szereplő portokkal rendelkező nyomtatók (magyarul: csak a helyi nyomtatók) kerülnek riportolásra, ellenkező esetben minden nyomtató bekerül az eredmény-állományba (sőt, némileg gazdagabb tulajdonság-listával is).

u.i. Azért az Attributes tulajdonság 64. bitjét kérdezem le, hogy egy nyomtató helyi vagy nem, mert Xp-től léteznek csak a Local és Network tulajdonságok.

u.i.2. Aki ugyancsak vbs-ben akarja folytatni, esetleg a nyomtatókkal egyéb varázslatot szeretne, a Windows-ba épített saját scriptekből rengeteget lehet tanulni.

———————————-

 

‘strComputer = “.”

‘—- RETRIEVE COMPUTER NAME ———

Dim objNetwork, strComputer

Set objNetwork = CreateObject(“WScript.Network”)

strComputer = objNetwork.ComputerName

‘—- END RETRIEVE COMPUTER NAME ——–

 

Set objWMIService = GetObject(“winmgmts:\\” & strComputer & “\root\cimv2”)

 

Set colPrinters = objWMIService.ExecQuery(“Select * From Win32_Printer”)

 

Set objFSO = CreateObject(“Scripting.FileSystemObject”)

strPath = “\\Server\Share”

‘strFileName = objFSO.GetTempName

strFileName = “Prn” & strComputer & “.csv”

strFullName = objFSO.BuildPath(strPath, strFileName)

Set PrinterFile = objFSO.CreateTextFile(strFullName)

 

‘ This means that just local printers, without direct network ports

isReport = False

 

isOutput = 0

 

if not isReport Then

   strFirstLine = “;PrinterType”

End if

 

if not isWindows2k Then

   if not IsReport Then

      strFirstLine = strFirstLine & “;Local;Network”

   End if

   strShared = “;Shared”

   strComment = “;Comment”

Else

   strShared = “”

   strComment = “”

End if

 

strFirstLine = “PrinterName;DriverName;PortName” & strShared & “;ShareName;Location” & strComment & “;Capabilities;Vertical;Hortizontal” & strFirstLine

    

For Each objPrinter in colPrinters

    if isWindows2k Then

        strShared = “”

            strComment = “”

            strType = “”

    Else

‘ These properties are introduced in WinXP

        strShared = “;” & objPrinter.Shared

        strComment = “;” & objPrinter.Comment

        strType = “;” & objPrinter.Local & “;” & objPrinter.Network

    End if   

 

    If objPrinter.Attributes And 64 Then

        strPrinterType = “Local”

    Else

        strPrinterType = “Network”

    End If

 

    strPrinterPort = objPrinter.PortName

 

    if not IsReport Then

       strType = “;” & strPrinterType & strType

    End if

 

    strOutput = objPrinter.Name & “;” & objPrinter.DriverName & “;” & objPrinter.PortName & strShared _

                        & “;” & objPrinter.ShareName & “;” & objPrinter.Location & strComment _

                    & “;” & Join(objPrinter.CapabilityDescriptions, “,”) _         

                        & “;” & objPrinter.VerticalResolution & “;” & objPrinter.HorizontalResolution & strType

 

    if IsReport Then

            if (strPrinterType = “Local”) And (isLocalPort(strPrinterPort)) then

               isOutput = isOutput + 1

            Else

               strOutput = “”

            End if

    Else

            isOutput = isOutput + 1

    End if

 

    if isOutput=1 Then

            PrinterFile.WriteLine(strFirstLine)

            isOutput = 2

    End if

 

    if strOutput <> “” Then

        PrinterFile.WriteLine(strOutput)

    End if

 

Next

 

PrinterFile.Close

 

‘—- Determine if the port is local —-

Private Function isLocalPort(Port)

    Select case Left(Port,3)

            case “LPT”,”USB”,”COM”,”DOT”

                isLocalPort = True

    End Select

End Function

‘—- End local port determination —-

 

‘—- Determine if OS is Windows 2000 —-

Private Function isWindows2k

    Set oShell = CreateObject(“Wscript.Shell”)

    sOSversion = oShell.RegRead(“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\CurrentVersion”)

    If sOSversion = “5.0” Then

        isWindows2k = True

    End if

End Function

‘—- End Windows 2000 determination —-

Advertisements
Kategóriák:General
  1. Még nincs hozzászólás.
  1. No trackbacks yet.

Vélemény, hozzászólás?

Adatok megadása vagy bejelentkezés valamelyik ikonnal:

WordPress.com Logo

Hozzászólhat a WordPress.com felhasználói fiók használatával. Kilépés / Módosítás )

Twitter kép

Hozzászólhat a Twitter felhasználói fiók használatával. Kilépés / Módosítás )

Facebook kép

Hozzászólhat a Facebook felhasználói fiók használatával. Kilépés / Módosítás )

Google+ kép

Hozzászólhat a Google+ felhasználói fiók használatával. Kilépés / Módosítás )

Kapcsolódás: %s

%d blogger ezt kedveli: