DJ VenGenCe Posted December 18, 2006 Posted December 18, 2006 Need help starting a script enumerate or get a list of printers (Hidden) on a print server and store them in an INI-based file called @SCRIPTDIR\Printers.Ini Printers are accessed \\SERVERNAME\PrinterName. I am novice/mid-experienced with AutoIT and just would need a better method than just typing them all in. Thx.
Beast40 Posted December 18, 2006 Posted December 18, 2006 Need help starting a script enumerate or get a list of printers (Hidden) on a print server and store them in an INI-based file called @SCRIPTDIR\Printers.IniPrinters are accessed \\SERVERNAME\PrinterName.I am novice/mid-experienced with AutoIT and just would need a better method than just typing them all in.Thx.why not just scan the output of a net view?wolfgang
SAG Posted December 18, 2006 Posted December 18, 2006 Need help starting a script enumerate or get a list of printers (Hidden) on a print server and store them in an INI-based file called @SCRIPTDIR\Printers.Ini Printers are accessed \\SERVERNAME\PrinterName. I am novice/mid-experienced with AutoIT and just would need a better method than just typing them all in. Thx. I've used the following code to pull a list of printers from the print server as listed in Active Directory. In this version, I read the value of $Server[1][1] (the name of the print server) from an ini file (I've got another where I also determine the name of the print server from AD). The resulting list of printers, descriptions, and drivers is sorted and loaded to a combo control as $PrinterList. Hope this helps. expandcollapse popup$ADS_SCOPE_SUBTREE = 2 $objConnection = ObjCreate("ADODB.Connection") $objCommand = ObjCreate("ADODB.Command") $objConnection.Provider = "ADsDSOObject" $objConnection.Open "Active Directory Provider" $cmdtxt = "Select printerName, Location, DriverName from 'LDAP://" & @LogonDNSDomain & "' where objectClass='printQueue' and serverName='" & $Server[1][1] & "." & @LogonDNSDomain & "'" $objCommand.ActiveConnection = $objConnection $objCommand.CommandText = $cmdtxt $objCommand.Properties("Page Size") = 1000 $objCommand.Properties("Searchscope") = $ADS_SCOPE_SUBTREE $objRecordSet = $objCommand.Execute $objRecordSet.MoveFirst ; Put returned values into array ; $var[$i][0] contains printer name ; $var[$i][1] contains printer driver name & printer location $i = 0 Do $var[$i][0] = $objRecordSet.Fields("printerName").Value $var[$i][1] = $objRecordSet.Fields("DriverName").Value & " : " & $objRecordSet.Fields("Location").Value $i = $i + 1 $objRecordSet.MoveNext Until $objRecordSet.EOF ; sort array so printers are listed alphabetically _ArraySort($var, 0, 0, $i-1, 100) ; create list of printer names from array For $j = 0 To $i-1 ;MsgBox(4096, "", "Key: " & $var[$i][0] & @CRLF & "Value: " & $var[$i][1]) $PrinterList = $PrinterList & $var[$j][0] & "|" Next
Bert Posted December 19, 2006 Posted December 19, 2006 Try this. It does just what you describe. We have been using this for a few months now, and it works very well. It will install printers from a windows server on a machine level, which means no matter who logs in will be able to print. Enjoy! expandcollapse popup#cs Network Printer Utility 1.0 beta Designed by the CTS Script team July 2006 A big THANK YOU goes to big_daddy. His help was invaluable in fixing some issues. @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ History July 2006: Initial release. --------------- Known issues: Will not work on Novell servers. #ce #include <GuiConstants.au3> #include <Process.au3> #include <Array.au3> $g_szVersion = "PrintInst.exe" If WinExists($g_szVersion) Then Exit Opt("TrayIconDebug", 1) ;debug is on Dim $hService, _ $data, _ $sPrinter, _ $sPrinterList, _ $font = "Comic Sans MS", _ $Input[12], $Combo[7], $radio[7], _ $check[11], $Button[6] Global Enum Step + 25 _ $CON_POS_1 = 25, _ $CON_POS_2, _ $CON_POS_3, _ $CON_POS_4, _ $CON_POS_5, _ $CON_POS_6, _ $CON_POS_7, _ $CON_POS_8, _ $CON_POS_9, _ $CON_POS_10, _ $CON_POS_11 GUICreate("", 600, 290, -1, -1, BitOR($WS_OVERLAPPEDWINDOW, $WS_CLIPSIBLINGS)) GUICtrlCreateLabel("\\", 20, 54, 10, 20) $iniread_1 = IniRead(@ScriptDir & "/npu.ini", "SERVER", "SERVER", "") $iniread_2 = IniRead(@ScriptDir & "/npu.ini", "Printers", "PLIST", "") iniwrite(@ScriptDir & "/npu.ini", "Printers", "LOCAL", "") $iniread_3 = IniRead(@ScriptDir & "/npu.ini", "Printers", "LOCAL", "") $LocalPrinters = StringSplit($iniread_3, "|") If $LocalPrinters[0] > 10 Then ReDim $LocalPrinters[11] EndIf $Input[1] = GUICtrlCreateInput($iniread_1, 35, 50, 100, 20) For $i = 2 To 11 $Input[$i] = GUICtrlCreateInput("", 270, Eval("CON_POS_" & $i - 1), 270, 21) If ($i - 1) <= $LocalPrinters[0]Then GUICtrlSetData(-1, $LocalPrinters[$i - 1]) EndIf Next For $i = 1 To 6 $Combo[$i] = GUICtrlCreateCombo("", 20, Eval("CON_POS_" & $i + 2), 170, 21) GUICtrlSetData(-1, $iniread_2) $radio[$i] = GUICtrlCreateRadio("", 210, Eval("CON_POS_" & $i + 2), 15, 21) Next For $i = 1 To 10 $check[$i] = GUICtrlCreateCheckbox("", 550, Eval("CON_POS_" & $i), 20, 20) Next GUICtrlCreateLabel("Currently install printers", 270, 3, 200, 21) GUICtrlCreateLabel("Delete", 550, 7, 100, 21) GUICtrlCreateGroup("Default", 200, 62, 50, 160) $Button[1] = GUICtrlCreateButton("Run", 20, 225, 35, 30) $Button[2] = GUICtrlCreateButton("Exit", 65, 225, 35, 30) $Button[3] = GUICtrlCreateButton("Find", 146, 50, 43, 20) $Button[4] = GUICtrlCreateButton("Find", 498, 3, 43, 20) $Button[5] = GUICtrlCreateButton("Restart Spooler", 110, 225, 80, 30) $Label_1 = GUICtrlCreateLabel(" Network Printer Utility" & @CRLF & "for Windows Print Servers", 20, 0, 240, 50) GUICtrlSetFont(-1, 10, 400, "", $font) $Label_2 = GUICtrlCreateLabel("2006 CTS Scripting Team", 40, 270, 130, 25) $_dummy = GUICtrlCreateDummy() GUISetState() While 1 $msg = GUIGetMsg() Switch $msg Case $GUI_EVENT_CLOSE ExitLoop Case $Button[1] _Rprinter() _instprint() MsgBox(0, "", "Done!", 3) Case $Button[2] ExitLoop Case $Button[3] $data = GUICtrlRead($Input[1], 0) _netprint1() Case $Button[4] _getinstalledPrinters() Case $Button[5] _restart() Case Else ;;; EndSwitch WEnd Exit Func _netprint1() $hService = ObjGet("winmgmts:{impersonationLevel=impersonate}!" & "\\" & $data & "\root\cimv2") If @error Then MsgBox(48, "ERROR", "No Printers Found. Possible issues: " & @CRLF _ & "" & @CRLF _ & " 1. The Windows Print Server name has been entered in incorrectly." & @CRLF _ & " 2. You are trying to access a Novell Server. This utility does not support Novell Print Servers." & @CRLF _ & " 3. There are no printers shared on the Windows Print Server you selected.") Else _np2() EndIf EndFunc ;==>_netprint1 Func _np2() Local $i = 0 Local $sPrinters = "" Local $aArray[1] SplashTextOn("", "Gathering printers, please wait...", 150, 75) For $y = 1 To 6 GUICtrlSetData($Combo[$y], "") Next IniWrite(@ScriptDir & "/npu.ini", "Printers", "PLIST", "") $oPrinterList = $hService.ExecQuery ("Select * From Win32_Printer") For $oPrinter In $oPrinterList ReDim $aArray[$i + 1] $aArray[$i] = StringUpper($oPrinter.name) $i += 1 Next _ArraySort($aArray) For $i = 0 To UBound($aArray)-1 For $y = 1 To 6 GUICtrlSetData($Combo[$y], $aArray[$i]) Next Next $iElements = UBound($aArray) - 1 For $x = 0 To $iElements If $x = $iElements Then $sPrinters &= $aArray[$x] Else $sPrinters &= $aArray[$x] & "|" EndIf Next IniWrite(@ScriptDir & "/npu.ini", "Printers", "PLIST", $sPrinters) $dataget2 = GUICtrlRead($Input[1], 0) IniWrite(@ScriptDir & "/npu.ini", "SERVER", "SERVER", $dataget2) SplashTextOn("", "Select what printers you wish to install", 150, 75) Sleep(2000) SplashOff() EndFunc ;==>_np2 Func _instprint() Local $ComboGet[7], $RadioGet[7] SplashTextOn("", "Installing printer, please wait...", 150, 75) $InputGet = GUICtrlRead($Input[1], 0) For $i = 1 To 6 $ComboGet[$i] = GUICtrlRead($Combo[$i], 0) $RadioGet[$i] = GUICtrlRead($radio[$i], 0) Next For $i = 1 To 6 If $ComboGet[$i] <> "" Then RunWait(@SystemDir & "\RUNDLL32 PRINTUI.DLL,PrintUIEntry /ga /c\\" & @ComputerName & " /n\\" & $InputGet & "\" & $ComboGet[$i]) EndIf Next _RunDOS("NET STOP spooler") _RunDOS("NET START spooler") sleep(10000) For $i = 1 To 6 If $RadioGet[$i] = 1 Then If $ComboGet[$i] <> "" Then RunWait(@SystemDir & "\RUNDLL32 PRINTUI.DLL,PrintUIEntry /y /n\\"&$iniread_1&"\"& $ComboGet[$i]) endif EndIf GUICtrlSetData($Combo[$i],"") GUICtrlSetState($radio[$i], $GUI_UNCHECKED) sleep(50) GUICtrlSetData($Combo[$i],$iniread_2) Next SplashOff() EndFunc ;==>_instprint func _restart() SplashTextOn("", "Stopping Print Spooler, please wait...", 150, 75) _RunDOS("NET STOP spooler") SplashOff() SplashTextOn("", "Starting Print Spooler, please wait...", 150, 75) _RunDOS("NET START spooler") SplashOff() EndFunc Func _getinstalledPrinters() SplashTextOn("", "Gathering installed printers, please wait...", 200, 75) IniWrite(@ScriptDir & "/npu.ini", "Printers", "LOCAL", "") $hService = ObjGet("winmgmts:{impersonationLevel=impersonate}!" & "\\" & @ComputerName & "\root\cimv2") $sPrinterList = $hService.ExecQuery ("Select * From Win32_Printer") ConsoleWrite('$sPrinterList.count = ' & $sPrinterList.count & @LF) For $sPrinter In $sPrinterList ConsoleWrite('$sPrinter.name = ' & $sPrinter.name & @LF) $rd3 = IniRead(@ScriptDir & "/npu.ini", "Printers", "LOCAL", "") IniWrite(@ScriptDir & "/npu.ini", "Printers", "LOCAL", $rd3 & $sPrinter.name & "|") Next $local = StringSplit(IniRead(@ScriptDir & "/npu.ini", "Printers", "LOCAL", ""), "|") If UBound($local) < 11 Then ReDim $local[11] For $i = 1 To 10 GUICtrlSetData($Input[$i + 1], $local[$i]) Next SplashOff() EndFunc ;==>_getinstalledPrinters Func _Rprinter() Local $InputGet[11] For $i = 2 To 11 $InputGet[$i - 1] = GUICtrlRead($Input[$i]) Next For $i = 1 To 10 If GUICtrlRead($check[$i]) = 1 Then SplashTextOn("", "Removing printer, please wait...", 150, 50) GUICtrlSetState($check[$i], $GUI_UNCHECKED) sleep(1000) If $InputGet[$i] <> "" Then $str = StringLeft($InputGet[$i], 2) If $str = "\\" Then RunWait(@SystemDir & "\RUNDLL32 PRINTUI.DLL,PrintUIEntry /gd /dn /n /c\\" & @ComputerName & " /n" & $InputGet[$i]) ;RunWait(@SystemDir & "\RUNDLL32 PRINTUI.DLL,PrintUIEntry /gd /q /c\\" & @ComputerName & " /n" & $InputGet[$i]) ;mine original ;RunWait(@ComSpec & ' /c RUNDLL32 PRINTUI.DLL,PrintUIEntry /gd /dn /q /n "' & $ret & '"', '', @SW_HIDE) ;danny35 GUICtrlSetData($InputGet[$i], "") Else RunWait(@SystemDir & '\RUNDLL32 PRINTUI.DLL,PrintUIEntry /dl /q /n "' & $InputGet[$i] & '" /c\\' & @ComputerName) EndIf EndIf EndIf Next EndFunc ;==>_Rprinter ;#cs - printer install ;adds a printer ;Run(@SystemDir & "\RUNDLL32 PRINTUI.DLL,PrintUIEntry /ga /c\\" &@ComputerName& " /n\\va017f1a\19_4200_82.248_PCL") ;&&&& ;deletes a printer ;Run(@SystemDir & "\RUNDLL32 PRINTUI.DLL,PrintUIEntry /gd /c\\" [email="&@ComputerName"]&@ComputerName[/email]& " /n\\va017f1a\19_4200_82.248_PCL") ;_rundos("NET STOP spooler") ;_rundos("NET START spooler") ; #ce The Vollatran project My blog: http://www.vollysinterestingshit.com/
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now