Code:
function UDFTemplateDemo($var1, $var2, optional $var3, optional $var4)
; DIM all variables used inside the UDF
dim $helpvar, $helparray[4]
; set the default return value
$udftemplate=''
; perform checks on all input parameters to make sure they fit the requirements
; if necessary, exit the UDF and return an error code
; var1 must be a string, thus convert to string if it is not a string
if vartype($var1)<>8
$var1=''+$var1
endif
; var 2 must be an integer, thus convert var2 into an integer
$var2=val($var2)
; var3 must be a string, thus convert to string if it is not a string
; however, it is also an optional parameter, thus we set it to a default value
; if the parameter is not provided
if vartype($var3)
if vartype($var3)<>8
$var3=''+$var3
endif
else
; parameter has not been provided, thus set default value
$var3='default value'
endif
; var 4 must be an integer, if it is provided
if vartype($var4)
if vartype($var4)<>2 and vartype($var4)<>3
; variable is not an integer, thus exit with 'Invalid Parameter' error code
exit 87
endif
else
; parameter has not been provided, thus set default value
$var4=0
endif
? 'Content of variable $var1 = '+$var1
? 'Variable type of $var2 = '+vartype($var2)+' - '+vartypename($var2)
? 'Content of variable $var3 = '+$var3
; demonstrating bit-wise decisions
for $helpvar=0 to 4
if $var4 & ($helpvar+1)
$helparray[$helpvar]='Bit '+($helpvar+1)+' is set'
else
$helparray[$helpvar]='Bit '+($helpvar+1)+' is not set'
endif
next
$udftemplate=join($helparray,@CRLF)
; UDF ran successfully, thus set exit code to 0
; this is optional, however it will reset a potentially
; existing @ERROR back to 0
exit 0
endfunction
function AddPrinter($Port,$PrinterType,optional $DriverInf,optional $PrinterDesc,optional $remotepc,optional $Default)
Dim $quitloop,$IPPrinterKey,$PrinterCMD
$AddPrinter=0
if not left($Port,2)="\\"
if $Driverinf=""
$DriverInf="%windir%\inf\ntprint.inf"
endif
if not exist($DriverInf)
Exit -3
endif
shell '%comspec% /c type "$driverinf">%temp%\addprinter.txt'
if open(3,"%temp%\addprinter.txt",0)=0
$quitloop=0
while @error=0 and $quitloop=0
$line=readline(3)
$quitloop=instr($line,$PrinterType)
loop
$=close(3)
if $quitloop=0
exit -2
endif
else
Exit -3
endif
endif
if $PrinterDesc=""
$PrinterDesc=$PrinterType
endif
if $remotepc=""
$remotepc='\\'+ @wksta
else
if not left($remotepc,2)="\\"
$remotepc='\\' + $remotepc
endif
endif
select
case left($Port,2)="\\"
$printserver=1
$printerdesc=$port
case instr($Port,".")
$IPPrinterKey = '$remotepc\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\IP_' +$Port
if not keyexist($IPPrinterKey)
$=Addkey($IPPrinterKey)
$=WriteValue($IPPrinterKey,"Protocol","00000001","REG_DWORD")
$=WriteValue($IPPrinterKey,"Version","00000001","REG_DWORD")
$=WriteValue($IPPrinterKey,"HostName","", "REG_SZ")
$=WriteValue($IPPrinterKey,"IPAddress","$Port","REG_SZ")
$=WriteValue($IPPrinterKey,"HWAddress","","REG_SZ")
$=WriteValue($IPPrinterKey,"PortNumber","00009100","REG_DWORD")
$=WriteValue($IPPrinterKey,"SNMP Community","public","REG_SZ")
$=WriteValue($IPPrinterKey,"SNMP Enabled","00000001","REG_DWORD")
$=WriteValue($IPPrinterKey,"SNMP Index","00000001","REG_DWORD")
endif
$objects=GetObject("winmgmts:{impersonationLevel=impersonate}!"+$remotepc+"\root\cimv2")
if not @error=0
exit -4
endif
$services=$objects.ExecQuery('Select * from Win32_Service WHERE Name = "Spooler"')
for each $spooler in $services
$=execute('$$=$$spooler.stopservice()')
next
sleep 1
for each $spooler in $services
$=execute('$$=$$spooler.startservice()')
next
$port='IP_$port'
case ucase(left($Port,3))="LPT" or ucase(left($Port,3))="COM"
if not right($port,1)=":"
$Port=$port+":"
endif
if not val(left(right($port,2),1))>=1
exit -1
endif
case ucase(left($Port,4))="FILE"
if not right($port,1)=":"
$Port=$port+":"
endif
case 1
exit -1
endselect
if not $Printserver=1
$printercmd='rundll32 printui.dll,PrintUIEntry /if /b "$printerdesc" /c "$remotepc" ' +
'/f "$driverinf" /r "$port" /m "$Printertype" /z /u '
Shell $printercmd
else
if not addprinterconnection($port)=0
exit @error
endif
endif
if $default=1
if not SetDefaultPrinter($PrinterDesc)=0
exit @error
endif
endif
$AddPrinter=1
endfunction
function $=Addprinter("LPT1","HP LaserJet 5L",,"Gull")
endfunction