home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 May / W2KPRK.iso / netmgmt.cab / prndata.vbs < prev    next >
Text File  |  1999-11-04  |  13KB  |  581 lines

  1. '----------------------------------------------------------------------
  2. '
  3. ' Copyright (c) Microsoft Corporation 1998-1999
  4. ' All Rights Reserved
  5. '
  6. ' Abstract:
  7. '
  8. ' prndata.vbs - printer data configuration script for Windows 2000
  9. '
  10. ' Usage:
  11. ' prndata [-gsx?] [-n name][-k key][-v value][-t int|sz|msz|bin][-d data]"
  12.  
  13. '
  14. ' Examples:
  15. ' prndata.vbs -s -n \\server\printer -k TestKey -v TestValue -t msz -d "one" "two"
  16. ' prndata.vbs -s -n \\server\printer -k TestKey -v TestValue -t int -d 53
  17. ' prndata.vbs -g -n \\server\printer -k TestKey -v TestValue
  18. ' prndata.vbs -x -n \\server\printer -k TestKey -v TestValue
  19. '
  20. '----------------------------------------------------------------------
  21.  
  22. option explicit
  23.  
  24. '
  25. ' Debugging trace flags, to enable debug output trace message
  26. ' change gDebugFlag to true.
  27. '
  28. const kDebugTrace = 1
  29. const kDebugError = 2
  30. dim   gDebugFlag
  31.  
  32. gDebugFlag = false
  33.  
  34. '
  35. ' Messages to be displayed if the scripting host is not cscript
  36. '                            
  37. const kMessage1 = "Please run this script using CScript."  
  38. const kMessage2 = "This can be achieved by"
  39. const kMessage3 = "1. Using ""CScript script.vbs arguments"" or" 
  40. const kMessage4 = "2. Changing the default Windows Scripting Host to CScript"
  41. const kMessage5 = "   using ""CScript //H:CScript //S"" and running the script "
  42. const kMessage6 = "   ""script.vbs arguments""."
  43.  
  44. '
  45. ' Operation action values.
  46. '
  47. const kActionUnknown    = 0
  48. const kActionSet        = 1
  49. const kActionGet        = 2
  50. const kActionDel        = 3
  51.  
  52. const kErrorSuccess     = 0
  53. const kErrorFailure     = 1
  54.  
  55. main
  56.  
  57. '
  58. ' Main execution start here
  59. '
  60. sub main
  61.  
  62.     on error resume next
  63.  
  64.     dim iAction
  65.     dim iRetval
  66.     dim oArgs
  67.     dim strName
  68.     dim strKey
  69.     dim strValue
  70.     dim strValueType
  71.     dim DataArray()
  72.     
  73.     '
  74.     ' Abort if the host is not cscript
  75.     '
  76.     if not IsHostCscript() then
  77.    
  78.         call wscript.echo(kMessage1 & vbCRLF & kMessage2 & vbCRLF & _
  79.                           kMessage3 & vbCRLF & kMessage4 & vbCRLF & _
  80.                           kMessage5 & vbCRLF & kMessage6 & vbCRLF)
  81.         
  82.         wscript.quit
  83.    
  84.     end if
  85.  
  86.     strKey = ""
  87.     strValue = ""
  88.  
  89.     iRetval = ParseCommandLine(iAction, strName, strKey, strValue, strValueType, DataArray)
  90.  
  91.     if iRetval = kErrorSuccess then
  92.  
  93.         select case iAction
  94.  
  95.             case kActionGet
  96.  
  97.                  iRetval = GetPrinterData(strName, strKey, strValue)
  98.  
  99.             case kActionSet
  100.  
  101.                  iRetval = SetPrinterData(strName, strKey, strValue, strValueType, DataArray)
  102.  
  103.             case kActionDel
  104.  
  105.                  iRetval = DelPrinterData(strName, strKey, strValue)
  106.  
  107.             case else
  108.                  Usage(True)
  109.                  exit sub
  110.  
  111.         end select
  112.  
  113.     end if
  114.  
  115. end sub
  116.  
  117. '
  118. ' Get the printer data
  119. '
  120. function GetPrinterData(strName, strKey, strValue)
  121.  
  122.     on error resume next
  123.  
  124.     DebugPrint kDebugTrace, "In GetPrinterData"
  125.     DebugPrint kDebugTrace, "Name      " & strName
  126.     DebugPrint kDebugTrace, "Key       " & strKey
  127.     DebugPrint kDebugTrace, "ValueName " & strValue
  128.  
  129.     dim oMaster
  130.     dim PrinterData
  131.     dim iDataType
  132.     dim iIndex
  133.     dim iRetval
  134.  
  135.     iRetval = kErrorFailure
  136.  
  137.     set oMaster = CreateObject("PrintMaster.PrintMaster.1")
  138.  
  139.     PrinterData = oMaster.PrinterDataGet(strName, strKey, strValue)
  140.  
  141.     if Err = kErrorSuccess then
  142.  
  143.         iRetval = kErrorSuccess
  144.  
  145.         iDataType = VarType(PrinterData)
  146.  
  147.         wscript.echo "Name  """ & strName  & """"
  148.         wscript.echo "Key   """ & strKey   & """"
  149.         wscript.echo "Value """ & strValue & """"
  150.         wscript.echo "Printer data:"
  151.  
  152.         '
  153.         ' Check if the return value is a simple variable or an array
  154.         '
  155.         if iDataType = vbLong or iDataType = vbString then
  156.  
  157.             wscript.echo PrinterData
  158.  
  159.             '
  160.             ' Check if array
  161.             '
  162.             elseif iDataType = (vbArray + vbVariant) then
  163.  
  164.                 '
  165.                 ' Check if array of strings
  166.                 '
  167.                 if VarType(PrinterData(0)) = vbString then
  168.  
  169.                     wscript.echo PrinterData(LBound(PrinterData))
  170.  
  171.                     for iIndex = LBound(PrinterData) + 1 to UBound(PrinterData)
  172.  
  173.                        wscript.echo PrinterData(iIndex)
  174.  
  175.                     next
  176.  
  177.                 '
  178.                 ' Check if array of bytes
  179.                 '
  180.                 elseif VarType(PrinterData(0)) = vbByte then
  181.  
  182.                     PrintBinaryArray PrinterData
  183.  
  184.                 end if
  185.  
  186.             else
  187.  
  188.                 wscript.echo "Invalid data returned " & iDataType
  189.  
  190.         end if
  191.  
  192.     else
  193.  
  194.         wscript.echo "Error getting " & strKey & " " & Hex(Err.Number) & ". " & Err.Description
  195.  
  196.     end if
  197.  
  198.     GetPrinterData = iRetval
  199.  
  200. end function
  201.  
  202. '
  203. ' SetPrinterData
  204. '
  205. function SetPrinterData(strName, strKey, strValue, strValueType, PrinterData)
  206.  
  207.     on error resume next
  208.  
  209.     DebugPrint kDebugTrace, "In SetPrinterData"
  210.     DebugPrint kDebugTrace, "Name      " & strName
  211.     DebugPrint kDebugTrace, "Key       " & strKey
  212.     DebugPrint kDebugTrace, "ValueName " & strValue
  213.     DebugPrint kDebugTrace, "ValueType " & strValueType
  214.  
  215.     dim oMaster
  216.     dim vntVariant
  217.     dim iIndex
  218.     dim iRetval
  219.  
  220.     set oMaster = CreateObject("PrintMaster.PrintMaster.1")
  221.  
  222.     '
  223.     ' We need the veriant in the array to have a certain type
  224.     '
  225.     select case strValueType
  226.  
  227.         case "int"
  228.  
  229.             vntVariant = CLng(PrinterData(0))
  230.  
  231.         case "sz"
  232.  
  233.             vntVariant = PrinterData(0)
  234.  
  235.         case "msz"
  236.  
  237.             vntVariant = PrinterData
  238.  
  239.         case "bin"
  240.  
  241.             '
  242.             ' Convert from array of strings to array of bytes
  243.             '
  244.             for iIndex = LBound(PrinterData) to UBound(PrinterData)
  245.  
  246.                PrinterData(iIndex) = CByte(PrinterData(iIndex))
  247.  
  248.             next
  249.  
  250.             vntVariant = PrinterData
  251.  
  252.         case else
  253.  
  254.             wscript.echo "Invalid type"
  255.  
  256.             exit function
  257.  
  258.     end select
  259.  
  260.     oMaster.PrinterDataSet strName, strKey, strValue, vntVariant
  261.  
  262.     if Err = kErrorSuccess then
  263.  
  264.         wscript.echo "Success setting printer data"
  265.  
  266.         iRetval = kErrorSuccess
  267.  
  268.     else
  269.  
  270.         wscript.echo "Error setting printer data, error " & Hex(Err.Number) & ". " & Err.Description
  271.  
  272.         iRetval = kErrorFailure
  273.  
  274.     end if
  275.  
  276.     SetPrinterData = iRetval
  277.  
  278. end function
  279.  
  280. '
  281. ' DelPrinterData
  282. '
  283. function DelPrinterData(strPrinter, strKey, strValue)
  284.  
  285.     on error resume next
  286.  
  287.     DebugPrint kDebugTrace, "In DelPrinterData"
  288.     DebugPrint kDebugTrace, "Printer   " & strPrinter
  289.     DebugPrint kDebugTrace, "Key       " & strKey
  290.     DebugPrint kDebugTrace, "ValueName " & strValue
  291.  
  292.     dim oMaster
  293.     dim iRetval
  294.  
  295.     set oMaster = CreateObject("PrintMaster.PrintMaster.1")
  296.  
  297.     '
  298.     ' Check whether to delete a key or a value
  299.     '
  300.     if strValue <> "" then
  301.  
  302.         oMaster.PrinterDataDel strPrinter, strKey, strValue
  303.  
  304.     else
  305.  
  306.         oMaster.PrinterKeyDel strPrinter, strKey
  307.  
  308.     end if
  309.  
  310.     if Err = kErrorSuccess then
  311.  
  312.         wscript.echo "Success deleting printer data"
  313.  
  314.         iRetval = kErrorSuccess
  315.  
  316.     else
  317.  
  318.         wscript.echo "Error deleting printer data, error: " & Hex(Err.number) & ". " & Err.Description
  319.  
  320.         iRetval = kErrorFailure
  321.  
  322.     end if
  323.  
  324.     DelPrinterData = iRetval
  325.  
  326. end function
  327.  
  328. '
  329. ' Displays an array of bytes
  330. '
  331. sub PrintBinaryArray(DataArray)
  332.  
  333.     dim strString
  334.     dim iIndex
  335.     dim iCount
  336.     dim iValue
  337.  
  338.     strString = ""
  339.  
  340.     for iIndex = LBound(DataArray) to UBound(DataArray)
  341.  
  342.         if iIndex <> 0 then
  343.  
  344.             if iIndex mod 16 = 0 then
  345.  
  346.                 strString = strString + Chr(13) + Chr(10)
  347.  
  348.             elseif iIndex mod 8 = 0 then
  349.  
  350.                 strString = strString + "-"
  351.  
  352.             else
  353.  
  354.                 strString = strString + " "
  355.  
  356.             end if
  357.  
  358.         end if
  359.  
  360.         iValue = DataArray(iIndex)
  361.  
  362.         if iValue > 15 then
  363.  
  364.             strString = strString + hex(iValue)
  365.  
  366.         else
  367.  
  368.             strString = strString + "0" + hex(iValue)
  369.  
  370.         end if
  371.  
  372.     next
  373.  
  374.     wscript.echo strString
  375.  
  376. end sub
  377.  
  378. '
  379. ' Debug display helper function
  380. '
  381. sub DebugPrint(uFlags, strString)
  382.  
  383.     if gDebugFlag = true then
  384.  
  385.         if uFlags = kDebugTrace then
  386.  
  387.             wscript.echo "Debug: " & strString
  388.  
  389.         end if
  390.  
  391.         if uFlags = kDebugError then
  392.  
  393.             if Err <> 0 then
  394.  
  395.                 wscript.echo "Debug: " & strString & " Failed with " & Hex(Err)
  396.  
  397.             end if
  398.  
  399.         end if
  400.  
  401.     end if
  402.  
  403. end sub
  404.  
  405. '
  406. ' Parse the command line into it's components
  407. '
  408. function ParseCommandLine(iAction, strName, strKey, strValueName, strValueType, DataArray)
  409.  
  410.     on error resume next
  411.  
  412.     DebugPrint kDebugTrace, "In the ParseCommandLine"
  413.  
  414.     dim oArgs
  415.     dim i
  416.     dim j
  417.  
  418.     iAction = kActionUnknown
  419.  
  420.     set oArgs = wscript.Arguments
  421.  
  422.     while i < oArgs.Count
  423.  
  424.         select case oArgs(i)
  425.  
  426.             case "-g"
  427.                 iAction = kActionGet
  428.  
  429.             case "-s"
  430.                 iAction = kActionSet
  431.  
  432.             case "-x"
  433.                 iAction = kActionDel
  434.  
  435.             case "-n"
  436.                 i = i + 1
  437.                 strName = oArgs(i)
  438.  
  439.             case "-k"
  440.                 i = i + 1
  441.                 strKey = oArgs(i)
  442.  
  443.             case "-v"
  444.                 i = i + 1
  445.                 strValueName = oArgs(i)
  446.  
  447.             case "-t"
  448.                 i = i + 1
  449.                 strValueType = oArgs(i)
  450.  
  451.             case "-d"
  452.                 i = i + 1
  453.  
  454.                 j = 0
  455.  
  456.                 '
  457.                 ' Add all values following -v to the array
  458.                 '
  459.                 while i < oArgs.Count
  460.  
  461.                     '
  462.                     ' Increase the size of the array and keep all the values
  463.                     '
  464.                     redim preserve DataArray(j)
  465.  
  466.                     DataArray(j) = oArgs(i)
  467.  
  468.                 i = i + 1
  469.  
  470.                 j = j + 1
  471.  
  472.                 wend
  473.  
  474.             case "-?"
  475.                 Usage(true)
  476.  
  477.             case else
  478.                 Usage(true)
  479.  
  480.         end select
  481.  
  482.         i = i + 1
  483.  
  484.     wend
  485.  
  486.     if Err = kErrorSuccess then
  487.  
  488.         ParseCommandLine = kErrorSuccess
  489.  
  490.     else
  491.  
  492.         ParseCommandLine = kErrorFailure
  493.  
  494.         wscript.echo "Error parsing the command line, error: 0x" & hex(Err.NUmber) & ". " &Err.Description
  495.  
  496.     end if
  497.  
  498. end function
  499.  
  500. '
  501. ' Display command usage.
  502. '
  503. sub Usage(ByVal bExit)
  504.  
  505.     wscript.echo "Usage: prndata [-gsx?] [-n name][-k key][-v value][-t int|sz|msz|bin][-d data]"
  506.     wscript.echo "Arguments:"
  507.     wscript.echo "-d     - data value: must be last option on the line"
  508.     wscript.echo "-g     - get key vlaue data"
  509.     wscript.echo "-k     - key name"
  510.     wscript.echo "-n     - server name or printer name"
  511.     wscript.echo "-s     - set key vlaue data"
  512.     wscript.echo "-t     - value type: int for integer, sz for string, msz for multi string, bin for binary data"
  513.     wscript.echo "-v     - value name"
  514.     wscript.echo "-x     - delete a key or a value under a key"
  515.     wscript.echo "-?     - display command usage"
  516.     wscript.echo ""
  517.     wscript.echo "Examples:"
  518.     wscript.echo "prndata.vbs -s -n \\server\printer -k TestKey -v TestValue -t msz -d ""one"" ""two"""
  519.     wscript.echo "prndata.vbs -s -n \\server\printer -k TestKey -v TestValue -t int -d 53"
  520.     wscript.echo "prndata.vbs -g -n \\server\printer -k TestKey -v TestValue"
  521.     wscript.echo "prndata.vbs -x -n \\server\printer -k TestKey -v TestValue"
  522.     wscript.echo "prndata.vbs -x -n \\server\printer -k TestKey"
  523.     wscript.echo "prndata.vbs -g -n \\server -v MajorVersion"
  524.  
  525.     if bExit <> 0 then
  526.  
  527.         wscript.quit(1)
  528.  
  529.     end if
  530.  
  531. end sub
  532.  
  533. '
  534. ' Determines which program is used to run this script. 
  535. ' Returns true if the script host is cscript.exe
  536. '
  537. function IsHostCscript()
  538.  
  539.     on error resume next
  540.     
  541.     dim strFullName 
  542.     dim strCommand 
  543.     dim i, j 
  544.     dim bReturn
  545.     
  546.     bReturn = false
  547.     
  548.     strFullName = WScript.FullName
  549.     
  550.     i = InStr(1, strFullName, ".exe", 1)
  551.     
  552.     if i <> 0 then
  553.         
  554.         j = InStrRev(strFullName, "\", i, 1)
  555.         
  556.         if j <> 0 then
  557.             
  558.             strCommand = Mid(strFullName, j+1, i-j-1)
  559.             
  560.             if LCase(strCommand) = "cscript" then
  561.             
  562.                 bReturn = true  
  563.             
  564.             end if    
  565.                 
  566.         end if
  567.         
  568.     end if
  569.     
  570.     if Err <> 0 then
  571.     
  572.         call wscript.echo("Error 0x" & hex(Err.Number) & " occurred. " & Err.Description _
  573.                           & ". " & vbCRLF & "The scripting host could not be determined.")       
  574.         
  575.     end if
  576.     
  577.     IsHostCscript = bReturn
  578.  
  579. end function
  580.  
  581.