Guest User

CASetup.vbs with ValidityPeriodUnits (/VP) parameter

a guest
Feb 17th, 2013
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. 'Copyright (c) Microsoft Corporation.  All rights reserved.
  2.  
  3. 'Disclaimer
  4. '
  5. 'This sample script is not supported under any Microsoft standard support
  6. 'program or service. This sample script is provided AS IS without warranty of
  7. 'any kind. Microsoft further disclaims all implied warranties including,
  8. 'without limitation, any implied warranties of merchantability or of fitness
  9. 'for a particular purpose. The entire risk arising out of the use or
  10. 'performance of the sample scripts and documentation remains with you. In no
  11. 'event shall Microsoft, its authors, or anyone else involved in the creation,
  12. 'production, or delivery of the scripts be liable for any damages whatsoever
  13. '(including, without limitation, damages for loss of business profits, business
  14. 'interruption, loss of business information, or other pecuniary loss) arising
  15. 'out of the use of or inability to use this sample script or documentation,
  16. 'even if Microsoft has been advised of the possibility of such damages.
  17.  
  18.  
  19.  
  20. '
  21. Option Explicit
  22.  
  23. '*****************************************************************
  24. 'Displays script-understood command line parameters
  25. '
  26. Sub Usage()
  27.     Call OutputLine(ECHOMINIMAL, "SetupCA.vbs - Certificate Services Setup Automation for Windows Server 2008 or Windows Server 2008 R2")
  28.     Call OutputLine(ECHOMINIMAL, "")
  29.     Call OutputLine(ECHOMINIMAL, "Parameters:")
  30.     Call OutputLine(ECHOMINIMAL, "/VP <Num>    - Validity period (in years)")
  31.     Call OutputLine(ECHOMINIMAL, "/SP <Prov>   - Specify Provider")
  32.     Call OutputLine(ECHOMINIMAL, "/SK <Len>    - Specify Key length")
  33.     Call OutputLine(ECHOMINIMAL, "/SA <Alg>    - Specify Hash algorithm")
  34.     Call OutputLine(ECHOMINIMAL, "/SN <Name>   - Specify CA Name")
  35.     Call OutputLine(ECHOMINIMAL, "/DN <Name>   - Specify DN Suffix for CA cert subject")
  36.     Call OutputLine(ECHOMINIMAL, "/SR <CA>     - Specify Root CA (Required for subordinate CA" & Chr(39) & "s and Web service)")
  37.     Call OutputLine(ECHOMINIMAL, "")
  38.     Call OutputLine(ECHOMINIMAL, "/OR <File>   - Save CA cert request to a file (Required for offline root CA" & Chr(39) & "s)")
  39.     Call OutputLine(ECHOMINIMAL, "")
  40.     Call OutputLine(ECHOMINIMAL, "/RK <Name>   - Reuse Key")
  41.     Call OutputLine(ECHOMINIMAL, "/RC <Name>   - Reuse Cert and Key")
  42.     Call OutputLine(ECHOMINIMAL, "")
  43.     Call OutputLine(ECHOMINIMAL, "/interactive - Specify whether CA will be set to interact with desktop")
  44.     Call OutputLine(ECHOMINIMAL, "")
  45.     Call OutputLine(ECHOMINIMAL, "/IE          - Install Enterprise Root CA Service")
  46.     Call OutputLine(ECHOMINIMAL, "/IS          - Install Standalone Root CA Service")
  47.     Call OutputLine(ECHOMINIMAL, "/IF          - Install Enterprise Subordinate CA Service")
  48.     Call OutputLine(ECHOMINIMAL, "/IT          - Install Standalone Subordinate CA Service")
  49.     Call OutputLine(ECHOMINIMAL, "/IW          - Install web CA Service - works with any of the above or by itself")
  50.     Call OutputLine(ECHOMINIMAL, "               This option is not relevant for Server Core installations")
  51.     Call OutputLine(ECHOMINIMAL, "")
  52.     Call OutputLine(ECHOMINIMAL, "/UC          - Uninstall CA Service")
  53.     Call OutputLine(ECHOMINIMAL, "")
  54.     Call OutputLine(ECHOMINIMAL, "/?           - Display this usage")
  55.     Call OutputLine(ECHOMINIMAL, "")
  56. End Sub ' Usage
  57.  
  58. '*****************************************************************
  59. 'Define external constant values
  60. '
  61. ' CA Role
  62. Const ENTERPRISE_ROOTCA = 0
  63. Const ENTERPRISE_SUBCA = 1
  64. Const STANDALONE_ROOTCA = 3
  65. Const STANDALONE_SUBCA = 4
  66. Const NO_INSTALL_CA =  -1
  67. Const UNINSTALL_CA = 8
  68. Const UNINSTALL_WEB_PAGES = 9
  69.  
  70. 'FileSystemObject defines
  71. Const FILE_FLAG_READ = 1
  72. Const FILE_FLAG_WRITE = 2
  73. Const FILE_FLAG_APPEND = 8
  74.  
  75. 'Logging level
  76. Const ECHOMINIMAL = 1
  77.  
  78. 'Error codes to handle:
  79. Const RPC_UNAVAILABLE =  - 2147023174 '0x800706BA
  80. Const DOMAIN_UNAVAILABLE =  - 2147023541 '0x8007054B
  81. Const REG_VALUE_NOT_FOUND =  - 2147024894 '0x80070002
  82. Const IMAGE_TAMPERED =  - 2147024319 '0x80070241
  83. Const VALUE_OUT_OF_RANGE =  - 2147016574 '0x80072082
  84. Const ROOT_CA_NOT_FOUND = 462
  85.  
  86. 'Properties that can be set:
  87. Const SETUPPROP_INVALID =  - 1
  88. Const SETUPPROP_CATYPE = 0
  89. Const SETUPPROP_CAKEYINFORMATION = 1
  90. Const SETUPPROP_INTERACTIVE = 2
  91. Const SETUPPROP_CANAME = 3
  92. Const SETUPPROP_CADSSUFFIX = 4
  93. Const SETUPPROP_VALIDITYPERIOD = 5
  94. Const SETUPPROP_VALIDITYPERIODUNIT = 6
  95. Const SETUPPROP_EXPIRATIONDATE = 7
  96. Const SETUPPROP_PRESERVEDATABASE = 8
  97. Const SETUPPROP_DATABASEDIRECTORY = 9
  98. Const SETUPPROP_LOGDIRECTORY = 10
  99. Const SETUPPROP_SHAREDFOLDER = 11
  100. Const SETUPPROP_PARENTCAMACHINE = 12
  101. Const SETUPPROP_PARENTCANAME = 13
  102. Const SETUPPROP_REQUESTFILE = 14
  103. Const SETUPPROP_WEBCAMACHINE = 15
  104. Const SETUPPROP_WEBCANAME = 16
  105.  
  106. '*****************************************************************
  107. 'Define constants and defaults
  108. '
  109. Const CONST_ERROR = 0
  110. Const CONST_WSCRIPT = 1
  111. Const CONST_CSCRIPT = 2
  112. Const CONST_SHOW_USAGE = 3
  113. Const CONST_PROCEED = 4
  114.  
  115. Const DEFCANAME = ""
  116. Const DEFDNSUFFIX = ""
  117. Const DEFROOTCANAME = ""
  118. Const DEF_SEL_KEY_SIZE = "2048"
  119. Const DEF_SEL_HASH_ALG = "SHA1"
  120. Const DEF_INSTALL_WEB_OPTION = False
  121. Const DEF_INSTALL_SVC_OPTION = False
  122. Const DEF_LOG_FILENAME = "_SetupCA.log"
  123. Const DEF_INTERACTIVE = False
  124.  
  125. 'example Capi1 Provider:   "Microsoft Strong Cryptographic Provider"
  126. 'example RSA CNG provider: "RSA#MicrosoftKSP"
  127. 'example ECC 256 provider: "ECDSA_P256#Microsoft Software Key Storage Provider"
  128. 'example ECC 384 provider: "ECDSA_P384#Microsoft Software Key Storage Provider"
  129. 'example ECC 521 provider: "ECDSA_P521#Microsoft Software Key Storage Provider"
  130. Const DEF_SEL_PROVIDER = "RSA#Microsoft Software Key Storage Provider"
  131.  
  132. 'Cert Server Role
  133. Dim eCARole
  134. eCARole = NO_INSTALL_CA
  135.  
  136. 'Root CA's name (if this is a subordinate)
  137. Dim strRootCAName
  138. strRootCAName = DEFROOTCANAME
  139.  
  140. 'This CA's name
  141. Dim strCAName
  142. Dim strDNSuffix
  143. strCAName = DEFCANAME
  144. strDNSuffix = DEFDNSUFFIX
  145.  
  146. 'Crypto provider to be used to sign certs this CA Issues
  147. Dim strSelectedCSP
  148. strSelectedCSP = "" ' DEF_SEL_PROVIDER
  149.  
  150. 'Hash algorithm to be used to sign certs this CA Issues
  151. Dim strSelectedHashAlg
  152. strSelectedHashAlg = "" ' DEF_SEL_HASH_ALG
  153.  
  154. 'Signing key length
  155. Dim iSelectedKeySize
  156. iSelectedKeySize = "" ' DEF_SEL_KEY_SIZE
  157.  
  158. 'Save request to file, for submitting to offline root
  159. Dim strRequestFile
  160. strRequestFile = ""
  161.  
  162. 'Key/Cert Reuse flags
  163. Dim bReuseKey
  164. Dim bReuseCert
  165. Dim bReuseDB
  166. bReuseKey  = False
  167. bReuseCert = False
  168. bReuseDB   = False
  169.  
  170. 'Interactive Flag
  171. Dim bInteractive
  172. bInteractive = DEF_INTERACTIVE
  173.  
  174. Dim iValidityPeriod
  175. iValidityPeriod = 10 'years
  176.  
  177. 'Default to install or uninstall
  178. Dim bInstall
  179. bInstall = True
  180.  
  181. 'Install the Web interface
  182. Dim bWebPages
  183. bWebPages = DEF_INSTALL_WEB_OPTION
  184.  
  185. 'Install the Cert Server service.
  186. Dim bInstallService
  187. bInstallService = DEF_INSTALL_SVC_OPTION
  188.  
  189. 'Log file
  190. Dim OutputFile
  191. Dim OutputFile2
  192.  
  193. 'Needs to differentiate which package needs to be installed
  194. Dim PKGCA
  195. Dim PKGIIS
  196. Dim PKGWEB
  197. PKGCA  = True
  198. PKGIIS = True
  199. PKGWEB = True
  200.  
  201. 'Set if installing on core build
  202. Dim bIsCore
  203. bIsCore = False
  204.  
  205. 'For the 'retry once' implementation
  206. Dim bRecursed
  207. bRecursed = False
  208.  
  209.  
  210. 'Begin script logic
  211.  
  212.  
  213.  
  214. Call VerifyStandardStreams()
  215.  
  216. 'Set up Local logging
  217. Set OutputFile = CreateLogFile(DEF_LOG_FILENAME)
  218.  
  219. Dim g_oCASetup
  220.  
  221. 'Start the script
  222. Call Main()
  223.  
  224. '********************************************************************
  225. '*
  226. '* Sub InstallPackages()
  227. '*
  228. '* Purpose: Install all required packagemanager packages
  229. '*
  230. '********************************************************************'
  231. Sub InstallPackages(Install)
  232.  
  233.     'Get shell object to determine system drive value
  234.    Dim WshShell
  235.     Set WshShell = WScript.CreateObject("WScript.Shell")
  236.  
  237.     If (Install = True) Then
  238.  
  239.         If (PKGCA = True) Then
  240.             Call OutputLine(ECHOMINIMAL, "Installing CA Packages, this will take several minutes...")
  241.             Call WshShell.Run ("cmd /c servermanagercmd -install ADCS-Cert-Authority -resultPath installResult.xml", 0 , True)
  242.         End If
  243.  
  244.         If (PKGWEB = True) Then
  245.             Call OutputLine(ECHOMINIMAL, "Installing Web Page Packages, this will take several minutes...")
  246.             Call WshShell.Run ("cmd /c servermanagercmd -install ADCS-Web-Enrollment -resultPath installResult.xml", 0 , True)
  247.         End If
  248.  
  249.     Else
  250.  
  251.         If (PKGWEB = True) Then
  252.             Call OutputLine(ECHOMINIMAL, "Removing Web Page Packages, this will take several minutes...")
  253.             Call WshShell.Run ("cmd /c servermanagercmd -remove ADCS-Web-Enrollment -resultPath installResult.xml", 0 , True)
  254.         End If
  255.  
  256.         If (PKGCA = True) Then
  257.             Call OutputLine(ECHOMINIMAL, "Removing CA Packages, this will take several minutes...")
  258.             Call WshShell.Run ("cmd /c servermanagercmd -remove ADCS-Cert-Authority -resultPath installResult.xml", 0 , True)
  259.         End If
  260.  
  261.     End If
  262.  
  263.     Call OutputLine(ECHOMINIMAL, "Installing Packages, this will take several minutes...")
  264.  
  265.     Set WShShell = Nothing
  266. End Sub 'InstallPackage
  267.  
  268. '********************************************************************
  269. '*
  270. '* Sub Main()
  271. '*
  272. '* Purpose: Execute the main script logic
  273. '* Input:  
  274. '*
  275. '* Output:  
  276. '*
  277. '********************************************************************
  278. Sub Main ()
  279.     Dim intOpMode
  280.  
  281.     'Parse the command line
  282.    intOpMode = intParseCmdLine()
  283.  
  284.     Select Case intOpMode
  285.  
  286.         Case CONST_SHOW_USAGE
  287.             Call Usage()
  288.             Exit Sub
  289.  
  290.         Case CONST_PROCEED
  291.             'Do Nothing
  292.  
  293.         Case CONST_ERROR
  294.             Call OutputLine(ECHOMINIMAL,"Error occurred in passing parameters.")
  295.             Exit Sub
  296.  
  297.         Case Else                    'Default -- should never happen
  298.            Call OutputLine(ECHOMINIMAL,"Error occurred in passing parameters.")
  299.             Exit Sub
  300.  
  301.     End Select
  302.  
  303.     'Check if certocm.dll is present; if not, we are most likely running a Server Core installation and need
  304.    'to use ocsetup to install the CA package to get certocm.dll
  305.    Dim FSO
  306.     Set FSO = CreateObject("Scripting.FileSystemObject")
  307.  
  308.     Dim WshShell
  309.     Dim envVars
  310.     Dim strWinDir
  311.     Set WshShell = WScript.CreateObject("WScript.Shell")
  312.     Set envVars  = WshShell.Environment("process")
  313.  
  314.     strWinDir    = envVars("windir")
  315.  
  316.     wscript.echo "Checking if certocm.dll is present..."
  317.  
  318.     If Not FSO.FileExists(strWinDir + "\system32\certocm.dll") Then
  319.         bisCore = True
  320.         wscript.echo "Certocm.dll is not present; installing CA package..."
  321.         Call WshShell.Run ("cmd /c start /w ocsetup CertificateServices /norestart /quiet", 0 , True)
  322.         wscript.echo "CA package installed..."
  323.     Else
  324.         wscript.echo "Certocm.dll is present; not installing CA package"
  325.     End If
  326.  
  327.     Set WshShell = Nothing
  328.     Set envVars  = Nothing
  329.  
  330.     Set g_oCASetup = CreateObject("certocm.CertSrvSetup")
  331.    
  332.     'Install Packages
  333.    Call OutputLine(ECHOMINIMAL,"Proceeding to update packages ...")
  334.     Call InstallPackages(bInstall)
  335. wscript.echo "bInstallService: " & bInstallService
  336. wscript.echo "eCARole: " & eCARole
  337. wscript.echo "bWebPages: " & bWebPages
  338.     If ((eCARole <> NO_INSTALL_CA) And (eCARole <> UNINSTALL_CA) And (eCARole <> UNINSTALL_WEB_PAGES)) or (bWebPages <> False) Then
  339.         Call OutputLine(ECHOMINIMAL, "Main: Info collection complete. Starting install phase..." )
  340.        
  341.  
  342.         Call OutputFile.WriteLine("Main: Installing...")
  343.  
  344.         If (True = InstallAndVerifyCA(eCARole, bInstallService, bWebPages)) Then
  345.             Call OutputFile.WriteLine("Main: Install complete! Passed")
  346.         Else
  347.             Call OutputFile.WriteLine("Main: Install failed")
  348.             Call WScript.Quit (1)
  349.         End If 'Installed without errors
  350.    Else
  351.         If (eCARole = UNINSTALL_CA or eCARole = UNINSTALL_WEB_PAGES) Then
  352.             If (eCARole = UNINSTALL_WEB_PAGES) Then
  353.                 Call OutputLine(ECHOMINIMAL, "Main: Uninstalling Web pages only...")
  354.                 'Uninstall web pages only
  355.                Call UninstallCA(True)
  356.                 Call OutputLine(ECHOMINIMAL, "Main: web pages Uninstalled!")
  357.             Else
  358.                 Call OutputLine(ECHOMINIMAL, "Main: Uninstalling CA...")
  359.                 'Uninstall web pages only
  360.                Call UninstallCA(False)
  361.                 Call OutputLine(ECHOMINIMAL, "Main: Uninstalled!")
  362.             End If
  363.         End If
  364.     End If
  365.  
  366.     ' Clean Up
  367.    Call OutputFile.Close()
  368.  
  369. End Sub 'Main
  370.  
  371.  
  372.  
  373. '********************************************************************
  374. '*
  375. '* Sub VerifyStandardStreams()
  376. '*
  377. '* Purpose: Verify CScript.exe was used to launch this script
  378. '*
  379. '********************************************************************
  380. Sub VerifyStandardStreams()
  381.     On Error Resume Next
  382.  
  383.     'Attempt to write to the error stream
  384.    Call WScript.StdOut.WriteLine()
  385.  
  386.     'If cannot display the error because cscript wasn't used,
  387.  
  388.     If (Err.Number <> 0) Then
  389.  
  390.         'Report problem
  391.        Call WScript.Echo("Please run this script from cscript.")
  392.  
  393.         'Exit the script
  394.        Call WScript.Quit (1)
  395.     End If
  396.  
  397.     On Error Goto 0
  398. End Sub 'VerifyStandardStreams
  399.  
  400. '********************************************************************
  401. '*
  402. '* Sub OutputLine()
  403. '*
  404. '* Purpose: Control the debug output at one location
  405. '*
  406. '* Input:   Level   compare to verbosity - if lower, do not display
  407. '*          string  String to output.
  408. '*
  409. '********************************************************************
  410. Sub OutputLine(ByVal level, ByVal String)
  411.  
  412.     Call OutputFile.WriteLine(String)
  413.     WScript.StdOut.WriteLine String
  414.  
  415. End Sub ' OutputLine
  416.  
  417. '********************************************************************
  418. '*
  419. '* Sub PrintErrorInfo()
  420. '*
  421. '* Purpose: Control the debug output at one location
  422. '*
  423. '* Input:   Message    Message to log
  424. '*          Err        Error object to get info from
  425. '*
  426. '********************************************************************
  427. Sub PrintErrorInfo(ByVal Message, ByVal oErr)
  428.     Call OutputLine(ECHOMINIMAL, Message)
  429.     Call OutputLine(ECHOMINIMAL, "Error Info: " & oErr.Number & ": " & oErr.Description)
  430.     Call OutputLine(ECHOMINIMAL, "Error Source: " & oErr.Source)
  431. End Sub ' OutputLine
  432.  
  433. '********************************************************************
  434. '*
  435. '* Function intParseCmdLine()
  436. '*
  437. '* Purpose: Parse the command line.
  438. '*  
  439. '* Input:   none
  440. '*
  441. '* Output:  none
  442. '*
  443. '********************************************************************
  444. Function intParseCmdLine()
  445.     On Error Resume Next
  446.  
  447.     Dim strFlag
  448.     Dim intState
  449.     Dim ArgTemp
  450.     Dim intArgIter
  451.     Dim objFileSystem
  452.  
  453.     If Wscript.Arguments.Count > 0 Then
  454.         Call OutputFile.WriteLine("parsing arguments: ")
  455.  
  456.         For Each ArgTemp in WScript.Arguments
  457.  
  458.             If (InStr(ArgTemp," ") > 0) Then
  459.                 Call OutputFile.Write(Chr(34) & ArgTemp & Chr(34) & " ")
  460.             Else
  461.                 Call OutputFile.Write(ArgTemp & " ")
  462.             End If
  463.  
  464.         Next ' ArgTemp
  465.  
  466.         Call OutputFile.WriteLine
  467.         strFlag = Wscript.arguments.Item(0)
  468.     End If
  469.  
  470.     'No arguments have been received
  471.  
  472.     If IsEmpty(strFlag) Then
  473.         intParseCmdLine = CONST_SHOW_USAGE
  474.         Exit Function ' intParseCmdLine
  475.    End If
  476.  
  477.    
  478.  
  479.     If (strFlag = "help") Or (strFlag = "/h") Or (strFlag = "\h") Or (strFlag = "-h") _
  480.         Or (strFlag = "\?") Or (strFlag = "/?") Or (strFlag = "?") _
  481.         Or (strFlag = "h") Then
  482.         intParseCmdLine = CONST_SHOW_USAGE
  483.         Exit Function ' intParseCmdLine
  484.    End If
  485.  
  486.     'Retrieve the command line and set appropriate variables
  487.    intArgIter = 0
  488.  
  489.     Do While intArgIter <= Wscript.arguments.Count - 1
  490.  
  491.         Select Case Left(LCase(Wscript.arguments.Item(intArgIter)),4)
  492.            
  493.             Case "/int"
  494.                 bInteractive = True
  495.                 intArgIter   = intArgIter + 1
  496.            
  497.             Case "/vp"
  498.                 If Not blnGetArg("Validity Period", iValidityPeriod, intArgIter) Then
  499.                     intParseCmdLine = CONST_ERROR
  500.                     Exit Function ' intParseCmdLine
  501.                End If
  502.  
  503.                 intArgIter = intArgIter + 1
  504.            
  505.             Case "/sp"
  506.  
  507.                 If Not blnGetArg("Crypto Provider", strSelectedCSP, intArgIter) Then
  508.                     intParseCmdLine = CONST_ERROR
  509.                     Exit Function ' intParseCmdLine
  510.                End If
  511.  
  512.                 intArgIter = intArgIter + 1
  513.  
  514.             Case "/sk"
  515.  
  516.                 If Not blnGetArg("Key length", iSelectedKeySize, intArgIter) Then
  517.                     intParseCmdLine = CONST_ERROR
  518.                     Exit Function ' intParseCmdLine
  519.                End If
  520.  
  521.                 intArgIter = intArgIter + 1
  522.  
  523.             Case "/sa"
  524.  
  525.                 If Not blnGetArg("Hash algorithm",strSelectedHashAlg, intArgIter) Then
  526.                     intParseCmdLine = CONST_ERROR
  527.                     Exit Function ' intParseCmdLine
  528.                End If
  529.  
  530.                 intArgIter = intArgIter + 1
  531.  
  532.             Case "/sn"
  533.  
  534.                 If Not blnGetArg("CA Name", strCAName, intArgIter) Then
  535.                     intParseCmdLine = CONST_ERROR
  536.                     Exit Function ' intParseCmdLine
  537.                End If
  538.  
  539.                 intArgIter = intArgIter + 1
  540.  
  541.             Case "/dn"
  542.  
  543.                 If Not blnGetArg("DN Suffix", strDNSuffix, intArgIter) Then
  544.                     intParseCmdLine = CONST_ERROR
  545.                     Exit Function ' intParseCmdLine
  546.                End If
  547.  
  548.                 intArgIter = intArgIter + 1
  549.                
  550.                
  551.             Case "/sr"
  552.  
  553.                 If Not blnGetArg("Root CA", strRootCAName, intArgIter) Then
  554.                     intParseCmdLine = CONST_ERROR
  555.                     Exit Function ' intParseCmdLine
  556.                End If
  557.  
  558.                 intArgIter = intArgIter + 1
  559.  
  560.             Case "/or"
  561.  
  562.                 If Not blnGetArg("Request File", strRequestFile, intArgIter) Then
  563.                     intParseCmdLine = CONST_ERROR
  564.                     Exit Function ' intParseCmdLine
  565.                End If
  566.  
  567.                 intArgIter = intArgIter + 1
  568.  
  569.             Case "/iw"
  570.  
  571.                 If bIsCore = False Then
  572.                     bWebPages = True
  573.                 End If
  574.  
  575.                 intArgIter = intArgIter + 1
  576.  
  577.             Case "/ie"
  578.  
  579.                 If (eCARole <> NO_INSTALL_CA) Then
  580.                     intParseCmdLine = CONST_ERROR
  581.                     Exit Function ' intParseCmdLine
  582.                End If
  583.  
  584.                 intParseCmdLine = CONST_PROCEED
  585.                 bInstallService = True
  586.                 eCARole         = ENTERPRISE_ROOTCA
  587.                 intArgIter      = intArgIter + 1
  588.  
  589.             Case "/is"
  590.  
  591.                 If (eCARole <> NO_INSTALL_CA) Then
  592.                     intParseCmdLine = CONST_ERROR
  593.                     Exit Function ' intParseCmdLine
  594.                End If
  595.  
  596.                 intParseCmdLine = CONST_PROCEED
  597.                 bInstallService = True
  598.                 eCARole         = STANDALONE_ROOTCA
  599.                 intArgIter      = intArgIter + 1
  600.  
  601.             Case "/if"
  602.  
  603.                 If (eCARole <> NO_INSTALL_CA) Then
  604.                     intParseCmdLine = CONST_ERROR
  605.                     Exit Function ' intParseCmdLine
  606.                End If
  607.  
  608.                 intParseCmdLine = CONST_PROCEED
  609.                 bInstallService = True
  610.                 eCARole         = ENTERPRISE_SUBCA
  611.                 intArgIter      = intArgIter + 1
  612.  
  613.             Case "/it"
  614.  
  615.                 If (eCARole <> NO_INSTALL_CA) Then
  616.                     intParseCmdLine = CONST_ERROR
  617.                     Exit Function ' intParseCmdLine
  618.                End If
  619.  
  620.                 intParseCmdLine = CONST_PROCEED
  621.                 bInstallService = True
  622.                 eCARole         = STANDALONE_SUBCA
  623.                 intArgIter      = intArgIter + 1
  624.  
  625.             Case "/uc"
  626.  
  627.                 If (eCARole <> NO_INSTALL_CA) And (eCARole <> UNINSTALL_CA)  Then
  628.                     intParseCmdLine = CONST_ERROR
  629.                     Exit Function ' intParseCmdLine
  630.                End If
  631.  
  632.                 bInstallService = False
  633.                 bWebPages      = False
  634.                 bInstall        = False
  635.                 eCARole         = UNINSTALL_CA
  636.                 intParseCmdLine = CONST_PROCEED
  637.                 intArgIter      = intArgIter + 1
  638.  
  639.             Case "/uw"
  640.  
  641.                 If (eCARole <> NO_INSTALL_CA) And (eCARole <> UNINSTALL_CA) Then
  642.                     intParseCmdLine = CONST_ERROR
  643.                     Exit Function ' intParseCmdLine
  644.                End If
  645.  
  646.                 bWebPages      = False
  647.                 bInstall        = False
  648.                 eCARole         = UNINSTALL_WEB_PAGES
  649.                 intParseCmdLine = CONST_PROCEED
  650.                 intArgIter      = intArgIter + 1
  651.  
  652.             Case "/rk"
  653.                 bReuseKey  = True
  654.                 intArgIter = intArgIter + 1
  655.  
  656.             Case "/rc"
  657.                 bReuseCert = True
  658.                 intArgIter = intArgIter + 1
  659.  
  660.             Case "/rcd"
  661.                 bReuseCert = True
  662.                 bReuseDB   = True
  663.                 intArgIter = intArgIter + 1
  664.  
  665.                 'Deprecated switches kept to prevent automation from failing
  666.            Case "/sl"
  667.                 intArgIter = intArgIter + 2
  668.             Case "/sc"
  669.                 intArgIter = intArgIter + 2
  670.             Case "/si"
  671.                 intArgIter = intArgIter + 2
  672.  
  673.             Case Else
  674.  
  675.                 Call OutputLine(ECHOMINIMAL, "Invalid or misplaced parameter: " & Wscript.arguments.Item(intArgIter))
  676.                 Call OutputLine(ECHOMINIMAL, "Please check the input and try again")
  677.                 Call OutputLine(ECHOMINIMAL, "or invoke with " & Chr(39) & "/?" & Chr(39) & " for help with the syntax.")
  678.                 Wscript.Quit
  679.  
  680.         End Select
  681.  
  682.     Loop '** intArgIter <= Wscript.arguments.Count - 1
  683.  
  684.     intParseCmdLine = CONST_PROCEED
  685.  
  686. End Function
  687.  
  688. '********************************************************************
  689. '*
  690. '*  Function blnGetArg()
  691. '*
  692. '*  Purpose: Helper to intParseCmdLine()
  693. '*
  694. '*  Usage:
  695. '*
  696. '*     Case "/s"
  697. '*       blnGetArg ("server name", strServer, intArgIter)
  698. '*
  699. '********************************************************************
  700.  
  701. Private Function blnGetArg (ByVal StrVarName, _
  702.     ByRef strVar, _
  703.     ByRef intArgIter)
  704.  
  705.     blnGetArg = False 'failure, changed to True upon successful completion
  706.    Err.Clear
  707.  
  708.     If Len(Wscript.Arguments(intArgIter)) > 3 Then
  709.  
  710.         If Mid(Wscript.Arguments(intArgIter),4,1) = ":" Then
  711.  
  712.             If Len(Wscript.Arguments(intArgIter)) > 4 Then
  713.                 strVar    = Right(Wscript.Arguments(intArgIter), _
  714.                 Len(Wscript.Arguments(intArgIter)) - 4)
  715.                 blnGetArg = True
  716.                 Exit Function
  717.             Else
  718.                 intArgIter = intArgIter + 1
  719.  
  720.                 If intArgIter > (Wscript.Arguments.Count - 1) Then
  721.                     Call OutputLine(ECHOMINIMAL, "Parameter Missing: " & StrVarName & ".")
  722.                     Call OutputLine(ECHOMINIMAL, "Invalid " & StrVarName & ".")
  723.                     Call OutputLine(ECHOMINIMAL, "Please check the input and try again.")
  724.                     Exit Function
  725.                 End If
  726.  
  727.                 strVar = Wscript.Arguments.Item(intArgIter)
  728.  
  729.                 If Err.Number Then
  730.                     Call OutputLine(ECHOMINIMAL, "Error: " & Err.Number & ": " & Err.Description & ".")
  731.                     Call OutputLine(ECHOMINIMAL, "Invalid " & StrVarName & ".")
  732.                     Call OutputLine(ECHOMINIMAL, "Please check the input and try again.")
  733.                     Exit Function
  734.                 End If
  735.  
  736.                 If InStr(strVar, "/") Then
  737.                     Call OutputLine(ECHOMINIMAL, "Invalid " & StrVarName)
  738.                     Call OutputLine(ECHOMINIMAL, "Invalid Parameter was:" & StrVar)
  739.                     Call OutputLine(ECHOMINIMAL, "Please check the input and try again.")
  740.                     Exit Function
  741.                 End If
  742.  
  743.                 blnGetArg = True 'success
  744.            End If
  745.  
  746.         Else
  747.             strVar    = Right(Wscript.Arguments(intArgIter), _
  748.             Len(Wscript.Arguments(intArgIter)) - 4)
  749.             blnGetArg = True 'success
  750.            Exit Function
  751.         End If
  752.  
  753.     Else
  754.         intArgIter = intArgIter + 1
  755.  
  756.         If intArgIter > (Wscript.Arguments.Count - 1) Then
  757.             Call OutputLine(ECHOMINIMAL, "Parameter Missing: " & StrVarName & ".")
  758.             Call OutputLine(ECHOMINIMAL, "Invalid " & StrVarName & ".")
  759.             Call OutputLine(ECHOMINIMAL, "Please check the input and try again.")
  760.             Exit Function
  761.         End If
  762.  
  763.         strVar = Wscript.Arguments.Item(intArgIter)
  764.  
  765.         If Err.Number Then
  766.             Call OutputLine(ECHOMINIMAL, "Error: " & Err.Number & ": " & Err.Description & ".")
  767.             Call OutputLine(ECHOMINIMAL, "Invalid " & StrVarName & ".")
  768.             Call OutputLine(ECHOMINIMAL, "Please check the input and try again.")
  769.             Exit Function
  770.         End If
  771.  
  772.         If InStr(strVar, "/") Then
  773.             Call OutputLine(ECHOMINIMAL, "Invalid " & StrVarName)
  774.             Call OutputLine(ECHOMINIMAL, "Invalid Parameter was:" & StrVar)
  775.             Call OutputLine(ECHOMINIMAL, "Please check the input and try again.")
  776.             Exit Function
  777.         End If
  778.  
  779.         blnGetArg = True 'success
  780.    End If
  781.  
  782. End Function
  783.  
  784. '********************************************************************
  785. '*
  786. '* Function CreateLogFile()
  787. '*
  788. '* Purpose: Create the local log file of all of the script output
  789. '*
  790. '* Input:  strLogFileName
  791. '*
  792. '********************************************************************
  793. Function CreateLogFile(ByVal strLogFileName)
  794.     Dim FileSystem
  795.     Set FileSystem = CreateObject("Scripting.FileSystemObject")
  796.  
  797.     'Get the actual path
  798.    Dim strFileName
  799.     strFileName = FileSystem.GetAbsolutePathName(strLogFileName)
  800.  
  801.     Call WScript.StdOut.WriteLine ("Log file = " & strFileName)
  802.  
  803.     On Error Resume Next
  804.  
  805.     ' just append to
  806.  
  807.     If FileSystem.FileExists(strFileName) Then
  808.         'Open Existing log
  809.        Set CreateLogFile = FileSystem.OpenTextFile(strFileName, FILE_FLAG_APPEND, True)
  810.     Else
  811.         'Open new log
  812.        Set CreateLogFile = FileSystem.CreateTextFile(strFileName, True)
  813.     End If
  814.  
  815.     Set FileSystem = Nothing
  816.  
  817.     If Err.Number <> 0 Then
  818.         Call WScript.StdErr.WriteLine ("Error creating the log file " & strFileName)
  819.         Call WScript.StdErr.WriteLine ("Error " & Err.Number & " - " & Err.Description)
  820.         Call WScript.Quit (1)
  821.     End If
  822.  
  823.     On Error Goto 0
  824. End Function ' CreateLogFile
  825.  
  826. '********************************************************************
  827. '*
  828. '* Function SetProvider()
  829. '*
  830. '* Purpose:
  831. '*
  832. '* Input:  ProviderString
  833. '*         HashAlg
  834. '*         KeyLen
  835. '*
  836. '********************************************************************
  837. Function SetProvider(ByRef oCASetup, ByVal ProviderString, ByVal HashAlg, ByVal KeyLen)
  838.     Call OutputLine(ECHOMINIMAL, _
  839.     "SetProvider called with " & _
  840.     Chr(34) & ProviderString & Chr(34) & ", " & _
  841.     Chr(34) & HashAlg & Chr(34) & ", " & _
  842.     Chr(34) & KeyLen & Chr(34))
  843.  
  844.     'Declare variable to store KeyInfo object
  845.    Dim oCAKeyInfo
  846.     Dim retVal
  847.  
  848.     retVal = False
  849.  
  850.     Call OutputLine(ECHOMINIMAL, "SetProvider: Creating oCAKeyInfo by calling oCASetup.GetCASetupProperty(SETUPPROP_CAKEYINFORMATION )")
  851.     ' Create CA KeyInfo object
  852.    Set oCAKeyInfo = oCASetup.GetCASetupProperty(SETUPPROP_CAKEYINFORMATION)
  853.  
  854.     If ("" <> ProviderString) Then
  855.         Call OutputLine(ECHOMINIMAL, "SetProvider: Changing oCAKeyInfo.ProviderName to " & ProviderString)
  856.         oCAKeyInfo.ProviderName = ProviderString
  857.     End If
  858.  
  859.     ' Only modify key length if it was specified
  860.  
  861.     If ("" <> KeyLen) Then
  862.         Call OutputLine(ECHOMINIMAL, "SetProvider: Changing oCAKeyInfo.Length to " & KeyLen)
  863.         oCAKeyInfo.Length = KeyLen
  864.     End If
  865.  
  866.     ' Only modify hash algorithm if it was specified
  867.  
  868.     If ("" <> HashAlg) Then
  869.         Call OutputLine(ECHOMINIMAL, "SetProvider: Changing oCAKeyInfo.HashAlgorithm to " & HashAlg)
  870.         oCAKeyInfo.HashAlgorithm = HashAlg
  871.     End If
  872.  
  873.     Call OutputLine(ECHOMINIMAL, "SetProvider: Calling oCASetup.SetCASetupProperty(SETUPPROP_CAKEYINFORMATION, oCAKeyInfo) ")
  874.  
  875.     On Error Resume Next
  876.     Call Err.Clear()
  877.  
  878.     ' Set the keyInfo property
  879.    Call oCASetup.SetCASetupProperty(SETUPPROP_CAKEYINFORMATION, oCAKeyInfo)
  880.  
  881.     If (Err.Number <> 0) Then
  882.         Call OutputLine(ECHOMINIMAL, "SetProvider1: Error " & Err.Number & ": " & Err.Description)
  883.         Call OutputLine(ECHOMINIMAL, "Error Source: " & Err.Source)
  884.         'Exit the script
  885.        Call WScript.Quit (1)
  886.     End If ' error occurred
  887.  
  888.     SetProvider = True
  889. End Function 'SetProvider
  890.  
  891. '********************************************************************
  892. '*
  893. '* Function InstallAndVerifyCA()
  894. '*
  895. '* Purpose: Run setup on CA object with specified parameters
  896. '*
  897. '* Input:  CAType
  898. '*         CAService
  899. '*         WebPages
  900. '*
  901. '********************************************************************'
  902. Function InstallAndVerifyCA(ByVal CAType, ByVal CAService, ByVal WebPages)
  903.     Dim LocalCAConfig
  904.     Dim CADBPath
  905.  
  906.     ' Default to failed
  907.    InstallAndVerifyCA = False
  908.  
  909.     On Error Resume Next
  910.  
  911.     Call Err.Clear()
  912.  
  913.     Call OutputLine(ECHOMINIMAL, "InstallAndVerifyCA: InitializeDefaults")
  914.     Call OutputLine(ECHOMINIMAL, "CAService: " & CAService)
  915.     Call OutputLine(ECHOMINIMAL, "WebPages: " & WebPages)
  916.  
  917.     Err.Number = 0
  918.  
  919.     ' Call this function with an error handling wrapper, or VBScript equivalent
  920.    Call g_oCASetup.InitializeDefaults(CAService, WebPages)
  921.  
  922.     If (0 <> Err.Number) Then
  923.  
  924.         If (5 = Err.Number) Then
  925.             ' uninstall
  926.  
  927.             If(bRecursed          = False) Then
  928.                 bRecursed          = True
  929.                 Call UninstallCA(False)
  930.                 InstallAndVerifyCA = InstallAndVerifyCA( CAType, CAService, WebPages)
  931.                 Exit Function
  932.             End If
  933.  
  934.         End If 'error is already installed
  935.  
  936.         Call PrintErrorInfo("CA already installed and cannot uninstall", Err)
  937.         Call OutputLine(ECHOMINIMAL, "")
  938.         Exit Function 'InstallAndVerifyCA
  939.    End If 'error occurred
  940.  
  941. 'CA Service setup section
  942. If (CAService = True) then
  943. 'Specify CA role
  944. Call OutputLine(ECHOMINIMAL, "InstallAndVerifyCA: SetCASetupProperty - CAType = " & CAType)
  945. Call g_oCASetup.SetCASetupProperty(SETUPPROP_CATYPE,  CAType)
  946.  
  947. If (0 <> Err.Number) And (VALUE_OUT_OF_RANGE <> Err.Number) Then
  948. Call PrintErrorInfo("InstallAndVerifyCA3:unable to set SETUPPROP_CATYPE!", Err)
  949. Exit Function 'InstallAndVerifyCA
  950. End If 'not a domain admin and error occurred
  951.  
  952. If (VALUE_OUT_OF_RANGE = Err.Number) Then
  953. Call OutputLine(ECHOMINIMAL, "InstallAndVerifyCA: Error! Must be a domain administrator to create an enterprise CA")
  954. Exit Function 'InstallAndVerifyCA
  955. End If ' not a domain admin
  956.  
  957. Call Err.Clear()
  958.  
  959. '''''''''''''''''''
  960. if CAType = 0 or CAType = 3 then
  961. Call OutputLine(ECHOMINIMAL, "InstallAndVerifyCA: SetCASetupProperty - ValidityPeriodUnit = " & iValidityPeriod)
  962. Call g_oCASetup.SetCASetupProperty(SETUPPROP_VALIDITYPERIODUNIT,  CLng(iValidityPeriod))
  963.  
  964. If (0 <> Err.Number) Then
  965. Call PrintErrorInfo("InstallAndVerifyCA3:unable to set SETUPPROP_VALIDITYPERIODUNIT!", Err)
  966. Exit Function 'InstallAndVerifyCA
  967. End If 'not a domain admin and error occurred
  968.  
  969. Call Err.Clear()
  970. end if
  971. ''''''''''''''''''''''''
  972.  
  973. if (bInteractive <> FALSE) then
  974. Call OutputLine(ECHOMINIMAL, "InstallAndVerifyCA: SetCASetupProperty - Interactive = " & bInteractive)
  975. Call g_oCASetup.SetCASetupProperty(SETUPPROP_INTERACTIVE,  bInteractive)
  976.  
  977. If (0 <> Err.Number) Then
  978. Call PrintErrorInfo("InstallAndVerifyCA:unable to set Interactive!", Err)
  979. Call OutputLine(ECHOMINIMAL, "")
  980. Exit Function 'InstallAndVerifyCA
  981. End If
  982. end if
  983.  
  984. If (False <> bReuseKey) Or (False <> bReuseCert) Then
  985.  
  986. If (False = SetupKeyReuse(bReuseKey, bReuseCert, strCAName)) Then
  987. Call PrintErrorInfo("InstallAndVerifyCA: SetupKeyReuse failed.", Err)
  988. Exit Function
  989. End If
  990.  
  991. Else
  992. If "" <> strCAName then
  993. Call OutputLine(ECHOMINIMAL, "InstallAndVerifyCA: SetCADistinguishedName")
  994. 'CAName, ignore UTF8, overwrite existing key, overwrite CA in DS
  995. Dim strCAFullDN
  996. strCAFullDN = "CN=" & strCAName
  997. If "" <> strDNSuffix then strCAFullDN = strCAFullDN & "," & strDNSuffix
  998.  
  999. Call g_oCASetup.SetCADistinguishedName(strCAFullDN, True, True, True)
  1000. 'Display errors
  1001.  
  1002. If (g_oCASetup.CAErrorId <> 0) Then
  1003. Call PrintErrorInfo("InstallAndVerifyCA:SetCADistinguishedName failed. ", Err)
  1004. End If
  1005.  
  1006. End If
  1007.  
  1008. End If
  1009.  
  1010. Call Err.Clear()
  1011.  
  1012. If (CAType <> ENTERPRISE_ROOTCA) And (CAType <> STANDALONE_ROOTCA) And (bReuseCert <> True) Then
  1013. If (strRequestFile = "") Then
  1014. Call OutputLine(ECHOMINIMAL, "InstallAndVerifyCA: SetParentCAInformation")
  1015. 'Set parent CA information if it is a subordinate
  1016. Call g_oCASetup.SetParentCAInformation(strRootCAName)
  1017.  
  1018. If (0 <> Err.Number) And (ROOT_CA_NOT_FOUND <> Err.Number) Then
  1019. Call PrintErrorInfo("InstallAndVerifyCA:unable to set ParentCAInformation!", Err)
  1020. Call OutputLine(ECHOMINIMAL, "")
  1021. Exit Function 'InstallAndVerifyCA
  1022. End If ' root ca not found
  1023.  
  1024. If (ROOT_CA_NOT_FOUND = Err.Number) Then
  1025. Call OutputLine(ECHOMINIMAL, "InstallAndVerifyCA: Root CA  could not be found!")
  1026. Exit Function 'InstallAndVerifyCA
  1027. End If ' root ca not found
  1028. Else
  1029. Call g_oCASetup.SetCASetupProperty(SETUPPROP_REQUESTFILE, strRequestFile)
  1030. End If
  1031. End If ' not root
  1032.  
  1033. If (bReuseCert = False) Then
  1034. Dim bProviderSet
  1035. bProviderSet = SetProvider(g_oCASetup, strSelectedCSP, strSelectedHashAlg, iSelectedKeySize)
  1036.  
  1037. If (False = bProviderSet) Then
  1038. Call OutputLine(ECHOMINIMAL, "InstallAndVerifyCA:unable to set key properties!")
  1039. Exit Function 'InstallAndVerifyCA
  1040. End If 'error occurred
  1041. End If
  1042.  
  1043. Call Err.Clear()
  1044. End If
  1045.    
  1046. If (True = WebPages) And (CAType = NO_INSTALL_CA) Then
  1047.         Call OutputLine(ECHOMINIMAL, "InstallAndVerifyCA: SetWebCAInformation")
  1048.         'Set web CA information if it is a web pages
  1049.        Call g_oCASetup.SetWebCAInformation(strRootCAName)
  1050.  
  1051.         If (0 <> Err.Number) Then
  1052.  
  1053.             If ( REG_VALUE_NOT_FOUND <> Err.Number) Then
  1054.                 Call PrintErrorInfo("InstallAndVerifyCA:unable to set SetWebCAInformation!", Err)
  1055.                 Call OutputLine(ECHOMINIMAL, "")
  1056.             Else
  1057.                 Call OutputLine(ECHOMINIMAL, "InstallAndVerifyCA: install failed, registry key not present!")
  1058.             End If
  1059.  
  1060.             Exit Function 'InstallAndVerifyCA
  1061.        End If ' error
  1062.  
  1063.     End If ' web pages should be installed
  1064.  
  1065.     Call OutputLine(ECHOMINIMAL, "InstallAndVerifyCA: Setting Key Properties")
  1066.  
  1067.     Call Err.Clear()
  1068.  
  1069.     Call OutputLine(ECHOMINIMAL, "InstallAndVerifyCA: calling SetProvider")
  1070.  
  1071.     'Dim KeyLenVar
  1072.    'KeyLenVar = ProviderKeyLength(strSelectedCSP)
  1073.  
  1074.     'If ("" <> KeyLenVar) Then
  1075.    '  iSelectedKeySize = KeyLenVar
  1076.    'End If
  1077.  
  1078.     Call Err.Clear()
  1079.  
  1080.     Call OutputLine(ECHOMINIMAL, "InstallAndVerifyCA: BeforeInstall!")
  1081.  
  1082.     Call g_oCASetup.Install()
  1083.  
  1084.     If (0 <> Err.Number) Then
  1085.  
  1086.         If ( REG_VALUE_NOT_FOUND <> Err.Number) Then
  1087.             Call PrintErrorInfo("InstallAndVerifyCA:Install failed!", Err)
  1088.             Call OutputLine(ECHOMINIMAL, "")
  1089.         Else
  1090.             Call OutputLine(ECHOMINIMAL, "InstallAndVerifyCA: install failed, registry key not present!")
  1091.             Call OutputLine(ECHOMINIMAL, "InstallAndVerifyCA: " & Err.Number & ": " & Err.Description)
  1092.         End If
  1093.  
  1094.         Exit Function 'InstallAndVerifyCA
  1095.    End If 'error occurred
  1096.  
  1097.     Call OutputLine(ECHOMINIMAL, "InstallAndVerifyCA: AfterInstall!")
  1098.  
  1099.     On Error GoTo 0
  1100.  
  1101.     Call OutputLine(ECHOMINIMAL, "InstallAndVerifyCA: calling GetLocalCAConfig")
  1102.  
  1103.     LocalCAConfig = GetLocalCAConfig()
  1104.  
  1105.     If (LocalCAConfig = "") Then
  1106.         Call OutputLine(ECHOMINIMAL, "InstallAndVerifyCA: CA registry entry not present!")
  1107.         Exit Function 'InstallAndVerifyCA
  1108.    End If ' getlocalcaconfig failed
  1109.  
  1110.     WScript.Sleep 30000
  1111.  
  1112.     If (CAService = True) Then
  1113.  
  1114.         If (0 <> PingCA(LocalCAConfig)) Then
  1115.             Call OutputLine(ECHOMINIMAL, "InstallAndVerifyCA: Service not started!")
  1116.             Exit Function 'InstallAndVerifyCA
  1117.        End If ' can't ping service
  1118.  
  1119.     End If ' ca set to install as a service
  1120.  
  1121.     InstallAndVerifyCA = True
  1122. End Function 'InstallAndVerifyCA
  1123.  
  1124. '********************************************************************
  1125. '*
  1126. '* Function UninstallCA()
  1127. '*
  1128. '* Purpose: Uninstall all of the CA server components or optionally just the pages
  1129. '*
  1130. '* Input:  
  1131. '*
  1132. '********************************************************************'
  1133. Function UninstallCA(ByVal WebPagesOnly)
  1134.     Dim LocalCAConfig
  1135.  
  1136.     Call OutputLine(ECHOMINIMAL, "UninstallCA: calling GetLocalCAConfig")
  1137.  
  1138.     ' Get the current location of the server
  1139.    LocalCAConfig = GetLocalCAConfig()
  1140.  
  1141. if (WebPagesOnly = False) Then
  1142. If ("" = LocalCAConfig) Then
  1143. Call OutputLine(ECHOMINIMAL, "UninstallCA: CA not installed!")
  1144. UninstallCA = True
  1145. Exit Function 'UninstallCA
  1146. End If ' getlocalcaconfig failed
  1147. End If
  1148.  
  1149.     Call OutputLine(ECHOMINIMAL, "UninstallCA: calling .PreUninstall")
  1150.  
  1151.     ' Clean up the web pages
  1152.    On Error Resume Next
  1153.     Call g_oCASetup.PreUninstall(WebPagesOnly)
  1154.  
  1155.     If Err.Number <> 0 Then
  1156.         Call PrintErrorInfo("UninstallCA: ", Err)
  1157.     End If
  1158.  
  1159.     Call OutputLine(ECHOMINIMAL, "UninstallCA: calling .PostUninstall")
  1160.  
  1161.     Call g_oCASetup.PostUninstall()
  1162.  
  1163.     Call OutputLine(ECHOMINIMAL, "UninstallCA: calling .GetLocalCAConfig")
  1164.  
  1165.     ' Check registry to see if CA is still installed
  1166.    LocalCAConfig = GetLocalCAConfig()
  1167.  
  1168.     If ("" = LocalCAConfig) Then
  1169.         'Not installed!
  1170.        Call OutputLine(ECHOMINIMAL, "UninstallCA: Uninstall completed successfully!")
  1171.         UninstallCA = True
  1172.         Exit Function 'UninstallCA
  1173.    End If 'getlocalcaconfig failed
  1174.  
  1175.     Call OutputLine(ECHOMINIMAL, "UninstallCA: calling PingCA")
  1176.  
  1177.    
  1178.     ' Try pinging the CA
  1179.  
  1180.     If (0 <> PingCA("")) Then
  1181.         UninstallCA = True
  1182.         Exit Function 'UninstallCA
  1183.    End If ' can't ping service
  1184.  
  1185.     ' Default to error
  1186.    UninstallCA = False
  1187. End Function 'UninstallCA
  1188.  
  1189. '********************************************************************
  1190. '*
  1191. '* Function GetLocalCAConfig()
  1192. '*
  1193. '* Purpose: Determine role of CA if installed
  1194. '*
  1195. '* Input:  
  1196. '*
  1197. '********************************************************************'
  1198. Function GetLocalCAConfig()
  1199.     Dim WshShell
  1200.     Dim ActiveConfig
  1201.     Dim CAName
  1202.     Dim CAServer
  1203.  
  1204.     On Error Resume Next
  1205.  
  1206.     Set WshShell = WScript.CreateObject("WScript.Shell")
  1207.     ActiveConfig = WshShell.RegRead("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\CertSvc\Configuration\Active")
  1208.  
  1209.     If (Err.Number <> 0) Then
  1210.  
  1211.         If (REG_VALUE_NOT_FOUND <> Err.Number) Then
  1212.             GetLocalCAConfig = ""
  1213.             Call PrintErrorInfo("GetLocalCAConfig: ", Err)
  1214.             Exit Function 'GetLocalCAConfig
  1215.        Else ' reg value not found
  1216.            GetLocalCAConfig = ""
  1217.             Call OutputLine(ECHOMINIMAL, "GetLocalCAConfig: CA Not Installed!")
  1218.             Call OutputLine(ECHOMINIMAL, "")
  1219.             Exit Function 'GetLocalCAConfig
  1220.        End If ' reg value found
  1221.  
  1222.     End If ' error occurred
  1223.  
  1224.     Call OutputLine(ECHOMINIMAL," Reading HKLM\SYSTEM\CurrentControlSet\Services\CertSvc\Configuration\" & ActiveConfig & "\CommonName")
  1225.     CAName = WshShell.RegRead("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\CertSvc\Configuration\" & ActiveConfig & "\CommonName")
  1226.     Call OutputLine(ECHOMINIMAL, "CAName: " & CAName)
  1227.  
  1228.     Call OutputLine(ECHOMINIMAL," Reading HKLM\SYSTEM\CurrentControlSet\Services\CertSvc\Configuration\" & ActiveConfig & "\CAServerName")
  1229.     CAServer = WshShell.RegRead("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\CertSvc\Configuration\" & ActiveConfig & "\CAServerName")
  1230.     Call OutputLine(ECHOMINIMAL, "CAServer: " & CAServer)
  1231.  
  1232.     ' Cleanup
  1233.    Set WShShell = Nothing
  1234.  
  1235.     'Set Return value
  1236.    GetLocalCAConfig = CAServer & "\" & CAName
  1237. End Function 'GetLocalCAConfig
  1238.  
  1239. '********************************************************************
  1240. '*
  1241. '* Function PingCA()
  1242. '*
  1243. '* Purpose: Use CertUtil to ping the CA
  1244. '*
  1245. '* Input:  
  1246. '*
  1247. '********************************************************************'
  1248. Function PingCA(ByVal CAConfig)
  1249.     Dim WshShell
  1250.     Dim command
  1251.     Dim RunRet
  1252.  
  1253.     Set WshShell = WScript.CreateObject("WScript.Shell")
  1254.  
  1255.     If ("" <> CAConfig) Then
  1256.         command = "certutil -config " & CAConfig & " -ping"
  1257.     Else 'caconfig param null
  1258.        command = "certutil -ping"
  1259.     End If ' caconfig param passed
  1260.  
  1261.     RunRet       = WshShell.Run(command, 1, False)
  1262.  
  1263.     Set WShShell = Nothing
  1264.     PingCA       = RunRet
  1265. End Function ' PingCA
  1266.  
  1267. '********************************************************************
  1268. '*
  1269. '* Function SetUpKeyReuse()
  1270. '*
  1271. '* Purpose:
  1272. '*
  1273. '* Input:  
  1274. '*
  1275. '********************************************************************'
  1276. Function SetUpKeyReuse(ByVal bReuseKey, ByVal bReuseCert, ByVal KeyName)
  1277.  
  1278.     Dim oCAKeyInfo
  1279.     Dim oExistingCerts
  1280.     Dim CertInfo
  1281.  
  1282.     On Error Resume Next
  1283.  
  1284.     Set oCAKeyInfo     = g_oCASetup.GetCASetupProperty(SETUPPROP_CAKEYINFORMATION)
  1285.     Set oExistingCerts = g_oCASetup.GetExistingCACertificates()
  1286.  
  1287.     Call OutputLine(ECHOMINIMAL,"Searching Existing Machine Keys")
  1288.  
  1289.     For Each CertInfo in oExistingCerts
  1290.         wscript.echo "Existing Cert: " & certinfo.ContainerName
  1291.  
  1292.         If (KeyName = certinfo.ContainerName) Then
  1293.             wscript.echo "Found cert!"
  1294.             oCAKeyInfo.Existing      = True
  1295.             If (Err.Number <> 0) Then Call PrintErrorInfo("SetUpKeyReuse: oCAKeyInfo.Existing", Err)
  1296.             oCAKeyInfo.ContainerName = CertInfo.ContainerName
  1297.             If (Err.Number <> 0) Then Call PrintErrorInfo("SetUpKeyReuse: oCAKeyInfo.ContainerName", Err)
  1298.             oCAKeyInfo.HashAlgorithm = CertInfo.HashAlgorithm
  1299.             If (Err.Number <> 0) Then Call PrintErrorInfo("SetUpKeyReuse: oCAKeyInfo.HashAlgorithm", Err)
  1300.             oCAKeyInfo.Length        = CertInfo.Length
  1301.             If (Err.Number <> 0) Then Call PrintErrorInfo("SetUpKeyReuse: oCAKeyInfo.Length", Err)
  1302.             oCAKeyInfo.ProviderName  = CertInfo.ProviderName
  1303.             If (Err.Number <> 0) Then Call PrintErrorInfo("SetUpKeyReuse: oCAKeyInfo.ProviderName", Err)
  1304.  
  1305.             If (bReuseCert = True) Then
  1306.                 oCAKeyInfo.ExistingCACertificate = CertInfo.ExistingCACertificate
  1307.                 If (Err.Number <> 0) Then Call PrintErrorInfo("SetUpKeyReuse: oCAKeyInfo.ExistingCACertificate", Err)
  1308.             End If
  1309.  
  1310.             Call g_oCASetup.SetCASetupProperty(SETUPPROP_CAKEYINFORMATION, oCAKeyInfo)
  1311.             If (Err.Number <> 0) Then Call PrintErrorInfo("SetUpKeyReuse: g_oCASetup.SetCASetupProperty(1, oCAKeyInfo)", Err)
  1312.             wscript.echo g_oCASetup.GetCASetupProperty(SETUPPROP_CANAME)
  1313.             wscript.echo g_oCASetup.GetCASetupProperty(SETUPPROP_CADSSUFFIX)
  1314.         End If
  1315.  
  1316.     Next
  1317.  
  1318.     SetupKeyReuse = True
  1319.  
  1320. End Function ' SetKeyReuse
Advertisement
Add Comment
Please, Sign In to add comment