File: C:/Windows/OEM/Certificates.wsf
<package>
<?component error="true" debug="true" ?>
<comment>
Manages cloud-based certificates.
</comment>
<component id="CertificateManager">
<registration
progid="WaGuest.CertificateManager"
description=""
version="1.0.0.0"
clsid="{11F1516F-829F-42BE-A328-F3E0CA9E247A}"/>
<public>
<property name="WScript" />
<method name="Initialize">
<parameter name="objGuestInterface" />
</method>
<method name="InstallCertificates">
</method>
</public>
<object id="WshShell" progid="WScript.Shell" />
<object id="FSO" progid="Scripting.FileSystemObject" />
<script language="VBScript" src="Utility.vbs" />
<script language="VBScript">
Option Explicit
Const ERROR_CERTSYNCFAILURE = 2
Const CERTIFICATE_STORE_PASSWORD = ""
Dim g_Trace
Dim oTraceEvent
Dim g_objGuestInterface
Sub Initialize(objGuestInterface)
Set g_Trace = GetScriptObject(Me.WScript, "Tracing.wsf", "TraceSource")
g_Trace.Name = "Certificates"
Set g_objGuestInterface = objGuestInterface
End Sub
Sub InstallCertificates()
Dim certs, numCertsInstalled
numCertsInstalled = 0
certs = g_objGuestInterface.GetCertificates()
If Not IsNull(certs) Then
Dim objCert
For Each objCert In certs
Dim certId, certName, certStore
certId = objCert.thumbprint
certName = objCert.name
certStore = objCert.storeName
Dim sCertFile : sCertFile = objCert.tmpFile
On Error Resume Next
ImportCertificate sCertFile, objCert
If Err.Number = 0 Then
Set oTraceEvent = g_Trace.CreateEvent("INFO")
With oTraceEvent.appendChild(oTraceEvent.ownerDocument.createElement("InstalledCertificate"))
.setAttribute "certId", certId
.setAttribute "certName", certName
.setAttribute "certStore", certStore
End With
g_Trace.TraceEvent oTraceEvent
ElseIf Err.Number = &h80040002 Then
Set oTraceEvent = g_Trace.CreateEvent("ERROR")
With oTraceEvent.appendChild(oTraceEvent.ownerDocument.createElement("CertificateNotFound"))
.setAttribute "certId", certId
.setAttribute "certName", certName
.setAttribute "certStore", certStore
End With
g_Trace.TraceEvent oTraceEvent
Else
TraceError g_Trace, "SyncCertificates: ImportCertificate failed for cert '" & certName & " (" & certId & ")'"
End If
On Error Goto 0
numCertsInstalled = numCertsInstalled + 1
Next
' cleanup
FSO.DeleteFile sCertFile
End If
Set oTraceEvent = g_Trace.CreateEvent("INFO")
With oTraceEvent.appendChild(oTraceEvent.ownerDocument.createElement("AllCertificatesInstalled"))
.setAttribute "count", numCertsInstalled
End With
g_Trace.TraceEvent oTraceEvent
End Sub
Private Function ImportCertificate(sCertFile, cert)
On Error Resume Next
Dim oResults, certLocation, certHash, certStoreName
' obtain the hash and trim the "sha1:" prefix
certHash = cert.thumbprint
If InStr(1, certHash, "sha1:", 1) = 1 Then
certHash = Right(certHash, Len(certHash) - 5)
End If
certStoreName = cert.storeName
certLocation = cert.storeLocation
If Not(certLocation = "System" Or certLocation = "LocalMachine" Or certLocation = "CurrentUser") Then
Err.Raise vbObjectError + ERROR_PROTOCOLVIOLATION, "Certificates.wsf", "An invalid certificate location, " & certLocation & ", was specified"
Exit Function
End If
If certLocation = "System" Then
certLocation = "LocalMachine"
End If
Set oResults = ExecuteAndTraceWithResults("%SystemRoot%\OEM\WaGuest.exe /importcert" & _
" """ & sCertFile & """" & _
" """ & CERTIFICATE_STORE_PASSWORD & """" & _
" """ & certHash & """" & _
" """ & certLocation & """" & _
" """ & certStoreName & """", g_Trace)
If oResults.ExitCode <> 0 Then
Err.Raise vbObjectError + ERROR_CERTSYNCFAILURE, "Certificates.wsf", "Import Error (" & Trim(oResults.StdErr) & ")"
Exit Function
End If
End Function
</script>
</component>
</package>