<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-1214528614970881323</id><updated>2012-01-14T11:02:21.477-06:00</updated><category term='VBScript'/><category term='delete'/><category term='Print'/><category term='Auditing'/><category term='Piercings'/><category term='Server'/><category term='tattoos'/><category term='Humor'/><category term='fix'/><category term='rename'/><category term='Windows'/><category term='printers'/><category term='correct'/><title type='text'>An Analog Man in a Digital World</title><subtitle type='html'>I'm in UR browser, suckin' up all UR ones and zeros!!!</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://pyreanspring.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1214528614970881323/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://pyreanspring.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Brian E. Tower</name><uri>http://www.blogger.com/profile/06578283768200708677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_d8-jE9m0sEA/SMceBNfPbrI/AAAAAAAAAAg/ISsSj9I7jLM/S220/Brian_Tower.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>4</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1214528614970881323.post-2597192952394974207</id><published>2010-03-05T17:44:00.000-06:00</published><updated>2010-03-05T17:44:14.376-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Humor'/><title type='text'>Computer Repair Problem</title><content type='html'>&lt;span style="font-size: large;"&gt;You know it's gonna be a long day at the old Tech Support line when the day starts like this!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;span style="color: blue;"&gt;Caller:&lt;/span&gt;&amp;nbsp; Hi, our printer is not working.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;span style="color: red;"&gt;Customer Service:&lt;/span&gt;&amp;nbsp; What seems to be the problem?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;span style="color: blue;"&gt;Caller&lt;/span&gt;:&amp;nbsp; Umm, the mouse is jammed.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;span style="color: red;"&gt;Customer Service:&lt;/span&gt;&amp;nbsp; Mouse?&amp;nbsp; Printers don't have a mouse.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;span style="color: blue;"&gt;Caller:&lt;/span&gt;&amp;nbsp; Mmmmmmmmmm?&amp;nbsp; Really?&amp;nbsp;&amp;nbsp; I'll send you a picture.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_d8-jE9m0sEA/S5GWTqv-hTI/AAAAAAAAAB0/cXWwzttoGa4/s1600-h/printermouse.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="245" src="http://4.bp.blogspot.com/_d8-jE9m0sEA/S5GWTqv-hTI/AAAAAAAAAB0/cXWwzttoGa4/s400/printermouse.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1214528614970881323-2597192952394974207?l=pyreanspring.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pyreanspring.blogspot.com/feeds/2597192952394974207/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1214528614970881323&amp;postID=2597192952394974207' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1214528614970881323/posts/default/2597192952394974207'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1214528614970881323/posts/default/2597192952394974207'/><link rel='alternate' type='text/html' href='http://pyreanspring.blogspot.com/2010/03/computer-repair-problem.html' title='Computer Repair Problem'/><author><name>Brian E. Tower</name><uri>http://www.blogger.com/profile/06578283768200708677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_d8-jE9m0sEA/SMceBNfPbrI/AAAAAAAAAAg/ISsSj9I7jLM/S220/Brian_Tower.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_d8-jE9m0sEA/S5GWTqv-hTI/AAAAAAAAAB0/cXWwzttoGa4/s72-c/printermouse.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1214528614970881323.post-214469707770589069</id><published>2008-10-26T11:43:00.000-05:00</published><updated>2008-10-26T11:55:10.665-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='printers'/><category scheme='http://www.blogger.com/atom/ns#' term='VBScript'/><category scheme='http://www.blogger.com/atom/ns#' term='delete'/><category scheme='http://www.blogger.com/atom/ns#' term='correct'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><category scheme='http://www.blogger.com/atom/ns#' term='rename'/><category scheme='http://www.blogger.com/atom/ns#' term='fix'/><title type='text'>More Fun with Windows Printers</title><content type='html'>Okay, so I suck at posting on a regular basis.  I'm busy.  Sorry.&lt;br /&gt;&lt;br /&gt;Anyway...&lt;br /&gt;&lt;br /&gt;If you follow this blog at all, you've probably reached the conclusion that I hate printers and print servers.  You're partially right.  I hate them because they're a pain in the butt, but I also enjoy them because they give me an opportunity to still do some technical stuff.  Remember, I'm a manager now.  I'm not supposed to be technical.&lt;br /&gt;&lt;br /&gt;Previously I posted some code I adapted to monitor and generate statistics from my company's Windows print servers.  Now I've worked on a script that runs with user rights to unmap and remap printers, correcting printer names and forcing the download of new drivers for each printer from the server.  This is still a work in progress, but it works pretty darned well, even if I do say so myself.  I was never very happy with anything I found on the Net, so this is my stab at this functionality.  Please, feel free to give me advice for improvements, but also feel free to use this code at your own risk.  I make no warranty of any of this code.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;'****************************************************&lt;br /&gt;'        Script by Brian E. Tower&lt;br /&gt;'        October 2008 &lt;br /&gt;'&lt;br /&gt;' This script enumerates printers, determines which printers are&lt;br /&gt;' mapped to specific print servers, makes a list of these printers&lt;br /&gt;' corrects the server they are mapped to, deletes the mappings, deletes the drivers,&lt;br /&gt;' remaps the printers with correct server names and resets the default printer.&lt;br /&gt;'****************************************************&lt;br /&gt;&lt;br /&gt;CheckRunner 'makes sure your running with cscript, not wscript&lt;br /&gt;&lt;br /&gt;Dim arrMappedPrinters()&lt;br /&gt;Dim arrNewMappings()&lt;br /&gt;intSize = 0&lt;br /&gt;Dim i, strCurrentDefaultPrinter, strRoot, strDelCmd, WshNetwork, strPrtr, strBits&lt;br /&gt;&lt;br /&gt;On Error Resume Next&lt;br /&gt;&lt;br /&gt;strBits = GetOS()&lt;br /&gt;&lt;br /&gt;If strBits = 0 Then&lt;br /&gt;  WScript.Echo&lt;br /&gt;  WScript.Echo "You are running a 32 bit OS.  Proceeding..."&lt;br /&gt;  WScript.Echo&lt;br /&gt;&lt;br /&gt;  'find default printer currently set and set a variable equal to it and change to the right print server&lt;br /&gt;  strCurrentDefaultPrinter = ChgPrntSrv(GetDefaultPrinter)&lt;br /&gt;&lt;br /&gt;  'find the system root, save for later&lt;br /&gt;  Set objShell = WScript.CreateObject( "WScript.Shell" )&lt;br /&gt;  strRoot = objShell.ExpandEnvironmentStrings("%SYSTEMROOT%")&lt;br /&gt;  'this is the executable to delete all unused print drivers&lt;br /&gt;  strDelCmd = strRoot &amp;amp; "\system32\cscript.exe " &amp;amp; strRoot &amp;amp; "\system32\prndrvr.vbs -x"&lt;br /&gt;&lt;br /&gt;  Set WshNetwork = WScript.CreateObject("WScript.Network")&lt;br /&gt;  Set objPrinters = WshNetwork.EnumPrinterConnections&lt;br /&gt;&lt;br /&gt;  WScript.Echo "Cataloging printer mappings:"&lt;br /&gt;  WScript.Echo&lt;br /&gt;  For i = 0 to objPrinters.Count - 1 Step 2&lt;br /&gt;      strPrtr = lcase(objPrinters.Item(i+1))&lt;br /&gt;      If InStr(1, strPrtr, "\\n1") &lt;&gt; 0  Then&lt;br /&gt;          'push unc into array&lt;br /&gt;          ReDim Preserve arrMappedPrinters(intSize)&lt;br /&gt;          ReDim Preserve arrNewMappings(intSize)&lt;br /&gt;          arrMappedPrinters(intSize) = strPrtr&lt;br /&gt;          'change server names and put in newprinter array&lt;br /&gt;          arrNewMappings(intSize) = ChgPrntSrv(arrMappedPrinters(intSize))&lt;br /&gt;          intSize = intSize +1&lt;br /&gt;      ElseIf InStr(1, strPrtr, "\\ac") &lt;&gt; 0  Then&lt;br /&gt;          'push unc into array&lt;br /&gt;          ReDim Preserve arrMappedPrinters(intSize)&lt;br /&gt;          ReDim Preserve arrNewMappings(intSize)&lt;br /&gt;          arrMappedPrinters(intSize) = strPrtr&lt;br /&gt;          'change server names and put in newprinter array&lt;br /&gt;          arrNewMappings(intSize) = ChgPrntSrv(arrMappedPrinters(intSize))&lt;br /&gt;          intSize = intSize +1&lt;br /&gt;      End If&lt;br /&gt;  Next&lt;br /&gt;&lt;br /&gt;  ' remove printers&lt;br /&gt;  WScript.Echo "Deleting current mappings:"&lt;br /&gt;  For each strPrinterPath in arrMappedPrinters&lt;br /&gt;      WScript.Echo "Deleting " &amp;amp; strPrinterPath&lt;br /&gt;      WshNetwork.RemovePrinterConnection strPrinterPath, true, true&lt;br /&gt;  Next&lt;br /&gt;&lt;br /&gt;  ' delete drivers&lt;br /&gt;  WScript.Echo&lt;br /&gt;  WScript.Echo "Deleting unused print drivers:"&lt;br /&gt;  Set oExec = objShell.Exec(strDelCmd)&lt;br /&gt;&lt;br /&gt;  ' remap  printers&lt;br /&gt;  WScript.Echo&lt;br /&gt;  WScript.Echo "Remapping printers:"&lt;br /&gt;  For Each strPrinterAdd in arrNewMappings&lt;br /&gt;      WScript.Echo "Mapping " &amp;amp; strPrinterAdd&lt;br /&gt;      WshNetwork.AddWindowsPrinterConnection strPrinterAdd&lt;br /&gt;      If Err &lt;&gt; 0 Then&lt;br /&gt;          WScript.Echo "Error mapping " &amp;amp; strPrinterAdd &amp;amp; ".  You will need to map this printer manually."&lt;br /&gt;          DisplayErrorInfo&lt;br /&gt;      End If&lt;br /&gt;      'WScript.Sleep 1000&lt;br /&gt;  Next&lt;br /&gt;&lt;br /&gt;  'set default printer&lt;br /&gt;  WScript.Echo&lt;br /&gt;  WScript.Echo "Setting Default Printer:"&lt;br /&gt;  If Not strCurrentDefaultPrinter = "" then&lt;br /&gt;      WScript.Echo "Setting default printer to " &amp;amp; strCurrentDefaultPrinter&lt;br /&gt;      WshNetwork.SetDefaultPrinter strCurrentDefaultPrinter&lt;br /&gt;  Else&lt;br /&gt;      WScript.Echo "No default printer defined"&lt;br /&gt;  End If&lt;br /&gt;&lt;br /&gt;Else&lt;br /&gt;  WScript.Echo&lt;br /&gt;  WScript.Echo&lt;br /&gt;  WScript.Echo "64 bit OS detected.  This utility does not run on 64 bit OS"&lt;br /&gt;  WScript.Echo&lt;br /&gt;  WScript.Echo&lt;br /&gt;End If&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;'****************************************************&lt;br /&gt;' Functions and Notes below this point&lt;br /&gt;'****************************************************&lt;br /&gt;Function GetDefaultPrinter() 'this function finds the default printer setting for the current user&lt;br /&gt;Set objShell = CreateObject("WScript.Shell")&lt;br /&gt;strRegVal = "HKCU\Software\Microsoft\Windows NT\CurrentVersion\Windows\Device"&lt;br /&gt;strDefault = ""&lt;br /&gt;On Error Resume Next&lt;br /&gt;strDefault = objShell.RegRead(strRegVal)&lt;br /&gt;strDefault = Left(strDefault ,InStr(strDefault, ",") - 1)&lt;br /&gt;On Error Goto 0&lt;br /&gt;GetDefaultPrinter = strDefault&lt;br /&gt;End Function&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Function ChgPrntSrv(strServer) 'this function converts old print server names to new print server names&lt;br /&gt;  If InStr(1, strServer, "\\n1ps01") &lt;&gt; 0 Then&lt;br /&gt;      ChgPrntSrv = Replace(strServer, "n1ps01", "n1print01")&lt;br /&gt;  ElseIf InStr(1, strServer, "\\n1ps02") &lt;&gt; 0 Then&lt;br /&gt;      ChgPrntSrv = Replace(strServer, "n1ps02", "n1print01") &lt;br /&gt;  ElseIf InStr(1, strServer, "\\n1ps03") &lt;&gt; 0 Then&lt;br /&gt;      ChgPrntSrv = Replace(strServer, "n1ps03", "n1print02")&lt;br /&gt;  ElseIf InStr(1, strServer, "\\n1ps04") &lt;&gt; 0 Then&lt;br /&gt;      ChgPrntSrv = Replace(strServer, "n1ps04", "n1print02")&lt;br /&gt;  ElseIf InStr(1, strServer, "\\n1prntsrv01") &lt;&gt; 0 Then&lt;br /&gt;      ChgPrntSrv = Replace(strServer, "n1prntsrv01", "n1print01")&lt;br /&gt;  ElseIf InStr(1, strServer, "\\n1prntsrv02") &lt;&gt; 0 Then&lt;br /&gt;      ChgPrntSrv = Replace(strServer, "n1prntsrv02", "n1print02")     &lt;br /&gt;  ElseIf InStr(1, strServer, "\\acprnt01") &lt;&gt; 0 Then&lt;br /&gt;      ChgPrntSrv = Replace(strServer, "acprnt01", "acprint02")&lt;br /&gt;  ElseIf InStr(1, strServer, "\\acprnt02") &lt;&gt; 0 Then&lt;br /&gt;      ChgPrntSrv = Replace(strServer, "acprnt02", "acprint02")&lt;br /&gt;  ElseIf InStr(1, strServer, "\\acps02") &lt;&gt; 0 Then&lt;br /&gt;      ChgPrntSrv = Replace(strServer, "acps02", "acprint02")&lt;br /&gt;  ElseIf InStr(1, strServer, "\\acprnt03") &lt;&gt; 0 Then&lt;br /&gt;      ChgPrntSrv = Replace(strServer, "acprnt03", "acprint01")&lt;br /&gt;  ElseIf InStr(1, strServer, "\\acprnt04") &lt;&gt; 0 Then&lt;br /&gt;      ChgPrntSrv = Replace(strServer, "acprnt04", "acprint01")&lt;br /&gt;  ElseIf InStr(1, strServer, "\\acps01") &lt;&gt; 0 Then&lt;br /&gt;      ChgPrntSrv = Replace(strServer, "acps01", "acprint01")&lt;br /&gt;  Else&lt;br /&gt;      ChgPrntSrv = strServer&lt;br /&gt;  End If&lt;br /&gt;End Function&lt;br /&gt;&lt;br /&gt;Function GetOS() 'this function determines if the OS is 64 or 32 bit&lt;br /&gt;  Dim oWMI&lt;br /&gt;  Dim oOS, xOS&lt;br /&gt;  Dim oRX_Bit&lt;br /&gt;  Dim b64      'Boolean value. If true, it is 64Bit, else  it's 32Bit.&lt;br /&gt;&lt;br /&gt;  Set oWMI = GetObject("winmgmts:")&lt;br /&gt;  Set oRX_Bit = New RegExp&lt;br /&gt;  oRX_Bit.Pattern = "x64"&lt;br /&gt;  oRX_Bit.IgnoreCase = True&lt;br /&gt;&lt;br /&gt;  Set oOS = oWMI.ExecQuery("SELECT * FROM Win32_OperatingSystem")&lt;br /&gt;  For Each xOS In oOS&lt;br /&gt;      If oRX_Bit.Test(xOS.Name) Then&lt;br /&gt;          b64 = True&lt;br /&gt;      Else&lt;br /&gt;          b64 = False&lt;br /&gt;      End If&lt;br /&gt;  Next&lt;br /&gt;  GetOS = b64&lt;br /&gt;End Function&lt;br /&gt;&lt;br /&gt;Sub DisplayErrorInfo&lt;br /&gt;  WScript.Echo "Error:      : " &amp;amp; Err&lt;br /&gt;  WScript.Echo "Error (hex) : &amp;amp;H" &amp;amp; Hex(Err)&lt;br /&gt;  WScript.Echo "Source      : " &amp;amp; Err.Source&lt;br /&gt;  WScript.Echo "Description : " &amp;amp; Err.Description&lt;br /&gt;  Err.Clear&lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;Sub CheckRunner&lt;br /&gt;  dim arrProgRun, intEnd, strExecute&lt;br /&gt;&lt;br /&gt;  arrProgRun = split(WScript.FullName, "\")&lt;br /&gt;  intEnd = Ubound(arrProgRun)&lt;br /&gt;  strExecute = arrProgRun(intEnd)&lt;br /&gt;&lt;br /&gt;  if not lcase(strExecute) = "cscript.exe" then&lt;br /&gt;      WScript.Echo "You must run this script with CScript. " &amp;amp; vbCrLf &amp;amp; "Please read the instructions!!!" &amp;amp; vbCrLf &amp;amp; vbCrLf &amp;amp; "Bet you clicked an icon."&lt;br /&gt;      WScript.Quit (1)&lt;br /&gt;  end if&lt;br /&gt;End Sub&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1214528614970881323-214469707770589069?l=pyreanspring.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pyreanspring.blogspot.com/feeds/214469707770589069/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1214528614970881323&amp;postID=214469707770589069' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1214528614970881323/posts/default/214469707770589069'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1214528614970881323/posts/default/214469707770589069'/><link rel='alternate' type='text/html' href='http://pyreanspring.blogspot.com/2008/10/more-fun-with-windows-printers.html' title='More Fun with Windows Printers'/><author><name>Brian E. Tower</name><uri>http://www.blogger.com/profile/06578283768200708677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_d8-jE9m0sEA/SMceBNfPbrI/AAAAAAAAAAg/ISsSj9I7jLM/S220/Brian_Tower.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1214528614970881323.post-1030781377692645311</id><published>2008-09-09T20:10:00.000-05:00</published><updated>2008-09-09T20:43:45.098-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Server'/><category scheme='http://www.blogger.com/atom/ns#' term='Auditing'/><category scheme='http://www.blogger.com/atom/ns#' term='Print'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><title type='text'>Auditing Windows 2003 Print Servers</title><content type='html'>As many of you know I lead a team that manages a large number of Windows servers - along with other stuff - for a large corporation.  One of the most dreaded things we deal with are print servers.  In general, they're just a pain, but I digress. &lt;br /&gt;&lt;br /&gt;A while back I was trying to come up with a way to audit the print servers to determine who was using each queue, how many pages were being printed by each queue, which queues were actually being used, etc.  Much to my surprise, there were no programs or tools available that do what I want.  Not even from Uncle Bill's big blue company.  Not even Open Source.  Then I found this &lt;a href="http://waynes-world-it.blogspot.com/2008/04/audit-windows-2003-print-server-usage.html"&gt;really good blog&lt;/a&gt; with a script that did about 90 percent of what I need, written by a gentleman in Brisbane Australia named Wayne.  For a full explanation of how to use these scripts, please see Wayne's blog.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;To make a long story short, I took Wayne's script and in the spirit of open source modified it to do what I needed it to do.  Now I'm returning the script to the "wild" and hoping some other lucky slob finds it useful. &lt;br /&gt;&lt;br /&gt;So, here's my version of the ProcessPrinterLogs.vbs script originally posted by Wayne.&lt;br /&gt;&lt;br /&gt;---&lt;br /&gt;&lt;pre&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;Const ForReading = 1, ForWriting = 2, ForAppending = 8&lt;br /&gt;&lt;br /&gt;Set objFSO = CreateObject("Scripting.FileSystemObject")&lt;br /&gt;Set objShell = CreateObject("WScript.Shell")&lt;br /&gt;&lt;br /&gt;Main()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Sub Main()&lt;br /&gt;   If WScript.Arguments.Named.Exists("f") Then&lt;br /&gt;       sSource = Wscript.Arguments.Named("f")&lt;br /&gt;   Else&lt;br /&gt;       Wscript.Arguments.ShowUsage()&lt;br /&gt;       Wscript.Echo "Source file or directory must be supplied"&lt;br /&gt;       Wscript.Quit(2)&lt;br /&gt;   End If&lt;br /&gt;&lt;br /&gt;   If Wscript.Arguments.Named.Exists("o") Then&lt;br /&gt;       sOutputFile = Wscript.Arguments.Named("o")&lt;br /&gt;   Else&lt;br /&gt;       dNow = Now   &lt;br /&gt;       dLogDate = DatePart("yyyy", dNow)&lt;br /&gt;       dLogDate = dLogDate &amp;amp; String(2 - Len(DatePart("m", dNow)),"0") &amp;amp; DatePart("m", dNow)&lt;br /&gt;       dLogDate = dLogDate &amp;amp; String(2 - Len(DatePart("d", dNow)),"0") &amp;amp; DatePart("d", dNow)   &lt;br /&gt;sOutputFile = Left(WScript.ScriptName, InStrRev(WScript.ScriptName,".vbs")-1) &amp;amp; "_" &amp;amp; dLogDate &amp;amp; ".csv"&lt;br /&gt;   End If&lt;br /&gt;&lt;br /&gt;   wscript.echo "Input file/dir: '" &amp;amp; sSource &amp;amp; "'"&lt;br /&gt;   wscript.echo "Output file: '" &amp;amp; sOutputFile &amp;amp; "'"&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   If objFSO.FileExists(sSource) Then&lt;br /&gt;       sFileSet = sSource                                        ' Process a single file&lt;br /&gt;       wscript.echo "Single file specified - " &amp;amp; sFileSet&lt;br /&gt;   ElseIf objFSO.FolderExists(sSource) Then&lt;br /&gt;       wscript.echo "Source specified was a directory, reading files from '" &amp;amp; sSource &amp;amp; "'"&lt;br /&gt;       sFileSet = ""&lt;br /&gt;       Set oFolder = objFSO.GetFolder(sSource)                                ' Get the folder&lt;br /&gt;       Set oFiles = oFolder.Files&lt;br /&gt;       For Each oFile in oFiles                                    ' For each file&lt;br /&gt;           sFileset = sFileset &amp;amp; vbCRLF &amp;amp; oFile.Path                         ' Append to the fileset&lt;br /&gt;       Next&lt;br /&gt;       If Len(sFileSet) &gt; Len(vbCRLF) Then sFileSet = Right(sFileSet, Len(sFileSet) - Len(vbCRLF))    ' Trim the leading CRLF&lt;br /&gt;   End If&lt;br /&gt;&lt;br /&gt;   Set dPrinters  = CreateObject("Scripting.Dictionary")                            ' Create the dictionary objects&lt;br /&gt;   Set dUsersPerPrinter  = CreateObject("Scripting.Dictionary")&lt;br /&gt;Set dusers = CreateObject("Scripting.Dictionary")   &lt;br /&gt;   Set dDates = CreateObject("Scripting.Dictionary")&lt;br /&gt;   Set dJobs = CreateObject("Scripting.Dictionary")&lt;br /&gt;&lt;br /&gt;   For Each sFile in Split(sFileset, vbCRLF)                                ' For Each file&lt;br /&gt;&lt;br /&gt; Set objFile = objFSO.GetFile(sFile)       &lt;br /&gt; If objFile.size &gt; 0 then           ' Don't process the file if it is a 0 byte file&lt;br /&gt;  wscript.echo "Processing '" &amp;amp; sFile &amp;amp; "'"&lt;br /&gt;  sBuffer = ""&lt;br /&gt;   Set objTextStream = objFSO.OpenTextFile(sFile, ForReading)     &lt;br /&gt;  sBuffer = objTextStream.ReadAll&lt;br /&gt;&lt;br /&gt;  For Each sLine in Split(sBuffer, vbCRLF)                            ' For each line in this file&lt;br /&gt;   Call ProcessLogEntry(sLine, dPrinters, dUsers, dDates, dJobs, dUsersPerPrinter)                ' Process the log entry&lt;br /&gt;  Next&lt;br /&gt; End If&lt;br /&gt;   Next&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   Call ProduceOutput(sOutput, dPrinters, dUsers, dDates, dJobs, dUsersPerPrinter)                        ' Produce the output&lt;br /&gt;   Set objTextStream = objFSO.OpenTextFile(sOutputFile, ForWriting, True)&lt;br /&gt;   objTextStream.Write sOutput&lt;br /&gt;   wscript.echo "Output saved to '" &amp;amp; sOutputFile &amp;amp; "', " &amp;amp; Len(sOutput) &amp;amp; " characters."&lt;br /&gt;&lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;Function ProduceOutput(ByRef sOutput, ByRef dPrinters, ByRef dUsers, ByRef dDates, ByRef dJobs, ByRef dUsersPerPrinter)&lt;br /&gt;   Dim strPrinter, strPort, dtmDate, strUser, strserver, strDocumentName, intSize, intPages, strInformation, strTotal&lt;br /&gt;   Dim strUserTotal, strPrinterTotal, strDateTotal, strJobTotal, aJobTotal&lt;br /&gt;&lt;br /&gt;   sOutput = ""&lt;br /&gt;   For Each strPrinter in dPrinters.Keys       &lt;br /&gt;       sOutput = sOutput &amp;amp; vbCRLF &amp;amp; strPrinter &amp;amp; "," &amp;amp; dPrinters.Item(strPrinter)&lt;br /&gt;   Next&lt;br /&gt;&lt;br /&gt;   sOutput = sOutput &amp;amp; vbCRLF&lt;br /&gt;   For Each strUser in dUsers.Keys&lt;br /&gt;       sOutput = sOutput &amp;amp; vbCRLF &amp;amp; strUser &amp;amp; "," &amp;amp; dUsers.Item(strUser)&lt;br /&gt;   Next&lt;br /&gt;&lt;br /&gt;'new portion to output list of users per print queue&lt;br /&gt;sOutPut = sOutput &amp;amp; vbCRLF&lt;br /&gt;For Each strPrinter in dUsersPerPrinter.Keys&lt;br /&gt; sOutput = sOutput &amp;amp; vbCRLF &amp;amp; strPrinter &amp;amp; ","  &amp;amp; dUsersPerPrinter.Item(strPrinter)&lt;br /&gt;Next&lt;br /&gt;'end of new output&lt;br /&gt;&lt;br /&gt;   sOutput = sOutput &amp;amp; vbCRLF&lt;br /&gt;   For Each dtmDate in dDates.Keys&lt;br /&gt;       sOutput = sOutput &amp;amp; vbCRLF &amp;amp; dtmDate &amp;amp; "," &amp;amp; dDates.Item(dtmDate)&lt;br /&gt;   Next&lt;br /&gt;&lt;br /&gt;   sOutput = sOutput &amp;amp; vbCRLF&lt;br /&gt;   For Each strTotal in dJobs.Keys&lt;br /&gt;       strJobTotal = dJobs.Item(strTotal)&lt;br /&gt;       aJobTotal = Split(strJobTotal, ",")&lt;br /&gt;       sOutput = sOutput &amp;amp; vbCRLF &amp;amp; "Total Jobs," &amp;amp; aJobTotal(0)&lt;br /&gt;       sOutput = sOutput &amp;amp; vbCRLF &amp;amp; "Total Pages," &amp;amp; aJobTotal(1)&lt;br /&gt;       sOutput = sOutput &amp;amp; vbCRLF &amp;amp; "Total Size (MB)," &amp;amp; aJobTotal(2)&lt;br /&gt;   Next&lt;br /&gt;&lt;br /&gt;   sOutput = sOutput &amp;amp; vbCRLF&lt;br /&gt;   strUserTotal = UBound(dUsers.Keys)+1&lt;br /&gt;   strPrinterTotal = UBound(dPrinters.Keys)+1&lt;br /&gt;   strDateTotal = UBound(dDates.Keys)+1&lt;br /&gt;   sOutput = sOutput &amp;amp; vbCRLF &amp;amp; "Printers," &amp;amp; strPrinterTotal&lt;br /&gt;   sOutput = sOutput &amp;amp; vbCRLF &amp;amp; "Users," &amp;amp; strUserTotal&lt;br /&gt;   sOutput = sOutput &amp;amp; vbCRLF &amp;amp; "Days," &amp;amp; strDateTotal&lt;br /&gt;&lt;br /&gt;   aJobTotal = Split(strJobTotal, ",")&lt;br /&gt;   sOutput = sOutput &amp;amp; vbCRLF&lt;br /&gt;&lt;br /&gt;   sOutput = sOutput &amp;amp; vbCRLF &amp;amp; "Average jobs/person," &amp;amp; CInt(aJobTotal(0)/strUserTotal)&lt;br /&gt;   sOutput = sOutput &amp;amp; vbCRLF &amp;amp; "Average pages/person," &amp;amp; CInt(aJobTotal(1)/strUserTotal)&lt;br /&gt;   sOutput = sOutput &amp;amp; vbCRLF &amp;amp; "Average pages/person/day," &amp;amp; CInt(CInt(aJobTotal(1)/strUserTotal) / strDateTotal)&lt;br /&gt;   sOutput = sOutput &amp;amp; vbCRLF &amp;amp; "Average pages/minute," &amp;amp; CInt(aJobTotal(1) / (strDateTotal * 8 * 60))&lt;br /&gt;&lt;br /&gt;End Function&lt;br /&gt;&lt;br /&gt;Function ProcessLogEntry(ByRef sLine, ByRef dPrinters, ByRef dUsers, ByRef dDates, ByRef dJobs, ByRef dUsersPerPrinter)&lt;br /&gt;   Dim strPrinter, strPort, dtmDate, strUser, strserver, strDocumentName, intSize, intPages, strInformation&lt;br /&gt;   Dim aPrintJob, intOffset, strTemp, aTemp&lt;br /&gt;&lt;br /&gt;   aPrintJob = Split(sLine, vbTAB)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   If UBound(aPrintJob) = 9 Then&lt;br /&gt;       dtmDate = aPrintJob(0) ' &amp;amp; " " &amp;amp; aPrintJob(1)&lt;br /&gt;       aTemp = Split(dtmDate, "/")&lt;br /&gt;       dtmDate = Right("00" &amp;amp; Trim(aTemp(1)), 2) &amp;amp; "/" &amp;amp; Right("00" &amp;amp; Trim(aTemp(0)), 2) &amp;amp; "/" &amp;amp; aTemp(2)        ' Trim, pad and switch to dd/mm/yyyy instead of mm/dd/yyyy&lt;br /&gt;       strServer = aPrintJob(8)&lt;br /&gt;&lt;br /&gt;       strInformation = Trim(aPrintJob(9))&lt;br /&gt;       strInformation = Right(strInformation, Len(strInformation) - InStr(strInformation, " "))    ' Remove the job ID&lt;br /&gt;       intOffset = InStrRev(strInformation, " ")&lt;br /&gt;       intPages = Right(strInformation, Len(strInformation) - intOffset)        ' Extract the number of pages from the end&lt;br /&gt;       strInformation = Left(strInformation, intOffset-1)                ' Trim the string&lt;br /&gt;  &lt;br /&gt;       intOffset = InStrRev(strInformation, " ")&lt;br /&gt;       intSize = Right(strInformation, Len(strInformation) - intOffset)        ' Extract the number of bytes from the end&lt;br /&gt;       strInformation = Left(strInformation, intOffset-1)                ' Trim the string   &lt;br /&gt;  &lt;br /&gt;       intOffset = InStrRev(strInformation, " ")&lt;br /&gt;       strPort = Right(strInformation, Len(strInformation) - intOffset)        ' Extract the port from the end&lt;br /&gt;       strInformation = Left(strInformation, intOffset-1)                ' Trim the string   &lt;br /&gt;  &lt;br /&gt;       intOffset = InStrRev(strInformation, " ")&lt;br /&gt;       strPrinter = Right(strInformation, Len(strInformation) - intOffset)        ' Extract the printer from the end&lt;br /&gt;       strInformation = Left(strInformation, intOffset-1)                ' Trim the string   &lt;br /&gt;  &lt;br /&gt;       intOffset = InStrRev(strInformation, " ")&lt;br /&gt;       strUser = Right(strInformation, Len(strInformation) - intOffset)        ' Extract the user from the end&lt;br /&gt;       strInformation = Left(strInformation, intOffset-1)                ' Trim the string   &lt;br /&gt;  &lt;br /&gt;       strDocumentName = strInformation&lt;br /&gt;&lt;br /&gt;       If dPrinters.Exists(strPrinter) Then                         ' Does this printer already exist in the dictionary?&lt;br /&gt;           aTemp = Split(dPrinters.Item(strPrinter), ",")                ' Find the existing printer job/page count&lt;br /&gt;           aTemp(0) = aTemp(0) + 1                            ' Increment the job count&lt;br /&gt;           aTemp(1) = aTemp(1) + CInt(intPages)                    ' Add to the page count&lt;br /&gt;           aTemp(2) = aTemp(2) + CInt(intSize/1024/1024)                ' Add to the byte count&lt;br /&gt;           dPrinters.Item(strPrinter) = Join(aTemp, ",")                ' Update the dictionary&lt;br /&gt;       Else&lt;br /&gt;           aTemp = Array(1, intPages, CInt(intsize /1024/1024))            ' Start the job/page count&lt;br /&gt;           dPrinters.Add strPrinter, Join(aTemp, ",")                ' Create this item&lt;br /&gt;       End If&lt;br /&gt;  &lt;br /&gt;       If dUsers.Exists(strUser) Then                             ' Does this user already exist in the dictionary?&lt;br /&gt;           aTemp = Split(dUsers.Item(strUser), ",")                ' Find the existing user job/page count&lt;br /&gt;           aTemp(0) = aTemp(0) + 1                            ' Increment the job count&lt;br /&gt;           aTemp(1) = aTemp(1) + CInt(intPages)                    ' Add to the page count&lt;br /&gt;           aTemp(2) = aTemp(2) + CInt(intSize/1024/1024)                ' Add to the byte count&lt;br /&gt;           dUsers.Item(strUser) = Join(aTemp, ",")                    ' Update the dictionary&lt;br /&gt;       Else&lt;br /&gt;           aTemp = Array(1, intPages, CInt(intsize /1024/1024))            ' Start the job/page count&lt;br /&gt;           dUsers.Add strUser, Join(aTemp, ",")                    ' Create this item&lt;br /&gt;       End If&lt;br /&gt;&lt;br /&gt;       If dDates.Exists(dtmDate) Then                             ' Does this date already exist in the dictionary?&lt;br /&gt;           aTemp = Split(dDates.Item(dtmDate), ",")                ' Find the existing date job/page count&lt;br /&gt;           aTemp(0) = aTemp(0) + 1                            ' Increment the job count&lt;br /&gt;           aTemp(1) = aTemp(1) + CInt(intPages)                    ' Add to the page count&lt;br /&gt;           aTemp(2) = aTemp(2) + CInt(intSize/1024/1024)                ' Add to the byte count&lt;br /&gt;           dDates.Item(dtmDate) = Join(aTemp, ",")                    ' Update the dictionary&lt;br /&gt;       Else&lt;br /&gt;           aTemp = Array(1, intPages, CInt(intsize /1024/1024))            ' Start the job/page count&lt;br /&gt;           dDates.Add dtmDate, Join(aTemp, ",")                    ' Create this item&lt;br /&gt;       End If&lt;br /&gt;&lt;br /&gt;       If dJobs.Exists(JOB_TOTAL) Then                         ' Does the total already exist in the dictionary?&lt;br /&gt;           aTemp = Split(dJobs.Item(JOB_TOTAL), ",")                ' Find the existing total counts&lt;br /&gt;           aTemp(0) = aTemp(0) + 1                            ' Increment the job count&lt;br /&gt;           aTemp(1) = aTemp(1) + CInt(intPages)                    ' Add to the page count&lt;br /&gt;           aTemp(2) = aTemp(2) + CInt(intSize/1024/1024)                ' Add to the byte count&lt;br /&gt;           dJobs.Item(JOB_TOTAL) = Join(aTemp, ",")                ' Update the dictionary&lt;br /&gt;       Else&lt;br /&gt;           aTemp = Array(1, intPages, CInt(intsize /1024/1024))            ' Start the job/page count&lt;br /&gt;           dJobs.Add JOB_TOTAL, Join(aTemp, ",")                    ' Create this item&lt;br /&gt;       End If&lt;br /&gt;&lt;br /&gt; ' This section creates a list of users that are using each print queue&lt;br /&gt; If dUsersPerPrinter.Exists(strPrinter) Then      ' Does the printer exist as a key in the dictionary?&lt;br /&gt;  dim bTemp&lt;br /&gt;  bTemp = dUsersPerPrinter.Item(strPrinter) &amp;amp; "," &amp;amp; strUser ' build up the list of users&lt;br /&gt;  dUsersPerPrinter.Item(strPrinter) = DedupeString(bTemp,",") ' dedupe sting of users and populate dictionary&lt;br /&gt; Else&lt;br /&gt;  dUsersPerPrinter.Add strPrinter, strUser     ' Create this item&lt;br /&gt; End If&lt;br /&gt; ' End of user list creation&lt;br /&gt;&lt;br /&gt;   Else&lt;br /&gt;       wscript.echo "skipped '" &amp;amp; sLine &amp;amp; "'"       ' line skipped because number of elemnts in array not equal to 9 ( need to figure this one out)&lt;br /&gt;   End If&lt;br /&gt;End Function&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;' Deduping  a  string&lt;br /&gt;' must use this function so we end up with a unique list of users with no duplicates&lt;br /&gt;Function DedupeString(inString,strSeperate)&lt;br /&gt;  Dim vObjects, myDict, index, strFinal&lt;br /&gt;  strFinal = ""&lt;br /&gt;  Set myDict = CreateObject("Scripting.Dictionary")&lt;br /&gt;  vObjects = split(inString,strSeperate)&lt;br /&gt;  for index = 0 to UBound(vObjects)&lt;br /&gt;     if ( not myDict.Exists(vObjects(index)) ) then&lt;br /&gt;        myDict.Add vObjects(index), vObjects(index)&lt;br /&gt;        if (Len(strFinal)) &gt; 0 Then&lt;br /&gt;           strFinal = strFinal &amp;amp; strSeperate &amp;amp; myDict(vObjects(index))&lt;br /&gt;        else&lt;br /&gt;           strFinal = myDict(vObjects(index))&lt;br /&gt;        end if&lt;br /&gt;     end if&lt;br /&gt;  next&lt;br /&gt;  DedupeString = strFinal&lt;br /&gt;End Function&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;---&lt;br /&gt;&lt;br /&gt;The other big change I made was in the wrapper batch file that pulls down the log files.  I changed it so that a single script loops through a list of print servers.&lt;br /&gt;&lt;br /&gt;Here's my version of the auditprinters.bat script.&lt;br /&gt;&lt;br /&gt;---&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;:: bet_auditprint.bat&lt;br /&gt;:: batch wrapper script to collect relevant event log entries from multiple print servers and then process these logs with ProcessPrinterLogs.vbs&lt;br /&gt;&lt;br /&gt;for  %%S in (Server1, Server2, Server3) do (&lt;br /&gt;&lt;br /&gt;Set print_server=%%S&lt;br /&gt;CALL :s_get_logs&lt;br /&gt;&lt;br /&gt;)&lt;br /&gt;GOTO eof&lt;br /&gt;&lt;br /&gt;:s_get_logs&lt;br /&gt;set MainDir=d:\BETPrinters\%print_server%&lt;br /&gt;Set PrintDir=%MainDir%\printdir&lt;br /&gt;Set LogDir=%MainDir%\logs&lt;br /&gt;&lt;br /&gt;:: Delete log files older than 30 days&lt;br /&gt;forfiles /p %LogDir% /d -30 /c "CMD /C del @FILE"&lt;br /&gt;&lt;br /&gt;:: Create needed directories&lt;br /&gt;if not exist %PrintDir% md %PrintDir%&lt;br /&gt;if not exist %LogDir% md %LogDir%&lt;br /&gt;&lt;br /&gt;:: Set date format&lt;br /&gt;for /f "tokens=1-8 delims=/:. " %%i in ('echo %date%') do Set DateFlat=%%j%%k%%l&lt;br /&gt;&lt;br /&gt;:: Set log an backup files&lt;br /&gt;Set LogFile=%print_server%_jobs_%DateFlat%.csv&lt;br /&gt;Set BackFile=PrintJobs_%DateFlat%.csv&lt;br /&gt;&lt;br /&gt;:: Dump the printer log&lt;br /&gt;:: Using full path for safety&lt;br /&gt;D:\SystemApps32\ResourceKit\dumpel -s \\%print_server% -l System -e 10 -m Print -d 1 &gt;&gt; %logDir%\%LogFile%&lt;br /&gt;&lt;br /&gt;:: Make a backup copy&lt;br /&gt;copy %logDir%\%print_server%_jobs_%DateFlat%.csv %PrintDir%\%BackFile% /y&lt;br /&gt;&lt;br /&gt;:: Process the logs&lt;br /&gt;cscript ProcessPrinterLogs.vbs /f:%LogDir% /o:%MainDir%\%print_server%_auditoutput.csv&lt;br /&gt;:eof&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;---&lt;br /&gt;&lt;br /&gt;Okay, so there it is.  Enjoy!  Use it in good health and for non nefarious purposes!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1214528614970881323-1030781377692645311?l=pyreanspring.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pyreanspring.blogspot.com/feeds/1030781377692645311/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1214528614970881323&amp;postID=1030781377692645311' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1214528614970881323/posts/default/1030781377692645311'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1214528614970881323/posts/default/1030781377692645311'/><link rel='alternate' type='text/html' href='http://pyreanspring.blogspot.com/2008/09/auditing-windows-2003-print-servers.html' title='Auditing Windows 2003 Print Servers'/><author><name>Brian E. Tower</name><uri>http://www.blogger.com/profile/06578283768200708677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_d8-jE9m0sEA/SMceBNfPbrI/AAAAAAAAAAg/ISsSj9I7jLM/S220/Brian_Tower.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1214528614970881323.post-693285553459327480</id><published>2008-07-08T21:17:00.000-05:00</published><updated>2008-07-15T12:29:34.602-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tattoos'/><category scheme='http://www.blogger.com/atom/ns#' term='Piercings'/><title type='text'>Don't judge a book by its cover</title><content type='html'>I got a interesting lesson in making judgments the other day.&lt;br /&gt;&lt;br /&gt;As I said in a previous blog, I have been trying to sell my home gym.  I finally had somebody come look at it and offer to buy it.  This guy was actually interested in the gym and not in the scrap value. Anyway, we arranged for him to come pick it up the morning of July 4th.  He had to get his uncle's truck and bring some help.&lt;br /&gt;&lt;br /&gt;So the guy arrives at the appointed time with the truck and his help.  He introduces me to the first guy as his uncle and then said "And this is my brother, Lee."&lt;br /&gt;&lt;br /&gt;About that time this guy steps out from behind the truck.  He's a fairly stocky fella, probably about 5' 10" and 225 to 250 pounds.  What's shocking is his face full of piercings and the plethora of tattoos sticking out from beneath his sleeves and collar.  I take one look at this guy and think "Uh Oh!"  Then I made the mistake of reading his T-shirt.  Plain black shirt, white text with the following message&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-weight:bold;"&gt;It's all about the pain.  The jewelry and ink are just souvenirs.&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;So read this and start laughing my butt off.  I look at the guy, worried about what he's gonna do and say, "I'm sorry, but that's just plain funny."&lt;br /&gt;&lt;br /&gt;Lee looks back at me, cracks a big smile and says "Ain't it, though?"&lt;br /&gt;&lt;br /&gt;So, it turns out that Lee is a really nice, soft-spoken gentle bear of a man.  &lt;br /&gt;&lt;br /&gt;I'm sure glad he had that shirt on to break the ice or I might have missed out on getting to know a truly interesting guy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1214528614970881323-693285553459327480?l=pyreanspring.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pyreanspring.blogspot.com/feeds/693285553459327480/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1214528614970881323&amp;postID=693285553459327480' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1214528614970881323/posts/default/693285553459327480'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1214528614970881323/posts/default/693285553459327480'/><link rel='alternate' type='text/html' href='http://pyreanspring.blogspot.com/2008/07/dont-judge-book-by-its-cover.html' title='Don&apos;t judge a book by its cover'/><author><name>Brian E. Tower</name><uri>http://www.blogger.com/profile/06578283768200708677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_d8-jE9m0sEA/SMceBNfPbrI/AAAAAAAAAAg/ISsSj9I7jLM/S220/Brian_Tower.jpg'/></author><thr:total>0</thr:total></entry></feed>
