In the past I have posted a VBScript that I use to install the SCCM Client and check SCCM Client health. The updates that I have are related to fixing broken WMI. The script is put in a GPO as a Computer Startup Script.
' NAME: SCCM_Client_Health_Check
' AUTHOR: Matthew Teegarden
' DATE : 08/25/2010
' Based on the script by Chris Stauffer http://myitforum.com/cs2/blogs/cstauffer/archive/2009/12/18/sccm-sp2-health-check-startup-script-1-7.aspx
' COMMENT: Version 1.1
' 1.0 - initial script
' 1.1 - complete re-write. added WMI check / Fix
Option Explicit
On Error Resume Next
Dim WshShell ' Wscript.shell
Dim fso ' FileSystemObject
Dim StrScanRun ' used for incremental count of the amount of times this script has run
Dim StrSCCMPath ' used for the location of SCCM client
Dim CCMSetupFolder ' used for the location of the CCMSetup folder
Dim SMSClientVersion ' used for storing SCCM Client Version
Dim InstallArgs ' used for SCCM Client installation switches
Dim ComSpec ' WshShell.ExpandEnvironmentStrings("%COMSPEC%")
Dim smsinstall ' SCCM Installation command
Dim strAdmAcct ' used for storing the AD Group that needs to be in the local administrators group
Dim strDomain ' stores the domain of the AD Group that needs to be in the local administrators group
Dim strGroupName ' stores the AD Group name that needs to be in the local administrators group
Dim objLocalGroup ' stores the Administrators local group
Dim strComputerName ' used for storing the computer name
Dim gstrSiteCode ' used to determine the site code of the strComptuerName
Dim Results ' used to store service state
Dim sFolder ' used to store folder path
Dim oFolder ' used to store specific folders
Dim oFile ' used for specific files
Dim WBEMFolder ' used for the wbem repository
Dim startdate ' used for SMSProvide log file access time
Dim enddate ' used for comparing the current time with last access time of the SMSProvider log file
Dim diffdate ' used to store the difference between startdate and enddate
Dim colItems ' used in For Each loops
Dim objItem ' used in For Each loops
Dim bAlreadyExists ' stores TRUE or FALSE values for strAdmAcct in the local Administrators group
Dim CurrentDirectory ' stores the location that the script is running from
Dim ScriptFullName ' stores the scripts full name. Used with CurrentDirectory
Dim objWMI ' Used for the WMI service
Dim returncode ' used to store return codes of functions
Dim servicename ' used to pass a service name into functions
Dim Started, Stopped ' used for starting and stopping services
Dim StrSCCMInstall ' counter for how many times SCCM Client has been installed
Dim AssignedSite ' used for SCCM site assignment
Dim AutoAssignedSite ' used for auto site assignment
Dim SmsClient ' used for the SCCM WMI namespace
Dim strValueName ' used for storing registry values during the History Shift function
Dim strLogging ' used for turning logging on or off
Dim logfile ' used to write to the log file
Dim strKeyPath ' used to find the value (if exists) in the registry if the DISABLECACHEOPT and DISABLESITEOPT option was used during install
Dim strEntryName ' used to find the value (if exists) in the registry if the DISABLECACHEOPT and DISABLESITEOPT option was used during install
Dim strValue ' ' used to find the value (if exists) in the registry if the DISABLECACHEOPT and DISABLESITEOPT option was used during install
Dim WMIisCorrupt ' used to determine if WMI is functional
Dim SomethingIsWrong ' used to determine is something is wrong!
Dim booOverWrite
Set WshShell = CreateObject ("WScript.Shell")
Set fso = CreateObject("Scripting.FileSystemObject")
'===========File System Constants==================================
Const ForReading = 1, ForWriting = 2, ForAppending = 8
Const OverwriteExisting = True
Const HARD_DISK = 3
'===========Registry Constants=====================================
Const HKEY_LOCAL_MACHINE = &H80000002
InstallArgs = " SMSSITECODE=AUTO SMSCACHESIZE=4096"' only needed if you have not extended AD other wise enter SCCM Client Install aguments
strAdmAcct = "DOMAIN/GROUP" 'Specify Desktop SMS Admin account domain/account
strDomain = "DOMAIN"
strGroupName = "GROUP"
strComputerName = WshShell.ExpandEnvironmentStrings("%computername%")
ComSpec = WshShell.ExpandEnvironmentStrings("%COMSPEC%")
strLogging = "enabled"
' Log file
If strLogging = "enabled" Then
Set logfile = fso.OpenTextFile("c:\windows\temp\ConfigMgrClient.Log",ForWriting,True)
logfile.Writeline ""
logfile.Writeline Now
logfile.Writeline ""
End If
'WMI Test
Set objWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
Set colItems = objWMI.ExecQuery ("Select * from Win32_Service Where Name = 'WinMgmt'")
For Each objItem In colItems
Results = objItem.name
Next
If Results = "" Or IsNull(results) Then
If strLogging = "enabled" Then
logfile.Writeline "WMI Is Corrupt"
End If
WMIisCorrupt = "True"
CheckSCCMInstall
AdvCliInst(ComSpec)
WScript.Quit
Else
If strLogging = "enabled" Then
logfile.Writeline "WMI is good"
End If
Set Results = nothing
End If
' Get Local CCM Path
StrSCCMPath = WshShell.RegRead("HKLM\SOFTWARE\Microsoft\SMS\Client\Configuration\Client Properties\Local SMS Path")
If StrSCCMPath = "" Or IsNull (StrSCCMPath) Then
StrSCCMPath = WshShell.RegRead("HKLM\SOFTWARE\Wow6432Node\Microsoft\SMS\Client\Configuration\Client Properties\Local SMS Path")
End If
If strLogging = "enabled" Then
logfile.Writeline "Get local CCM Path = " & StrSCCMPath
End If
If StrSCCMPath = "" Or IsNull (StrSCCMPath) Then
CheckSCCMInstall
AdvCliInst(ComSpec)
WScript.Quit
End If
' Check for SCCM Helath Check registry key and create it if it doesn't exist
StrScanRun = WshShell.RegRead("HKLM\SOFTWARE\SCCM\SCCM_Health_Check\Scan_Run")
If StrScanRun = "" Or IsNull (StrScanRun) Then
StrScanRun = WshShell.RegRead("HKLM\SOFTWARE\Wow6432Node\SCCM\SCCM_Health_Check\Scan_Run")
End If
If StrScanRun = "" Or IsNull (StrScanRun) Then
WshShell.RegWrite ("HKLM\SOFTWARE\SCCM\SCCM_Health_Check\Scan_Run"), "0"
End If
' Write current time to the registry
WshShell.RegWrite ("HKLM\SOFTWARE\SCCM\SCCM_Health_Check\Last_Run"), Now()
' Check for CCMEXEC service
Results = ServiceState("ccmexec")'Check CCM Status
If strLogging = "enabled" Then
logfile.Writeline "SMS Agent Host = " & Results
End If
If LCase(Results) = LCase("Running")Then
WshShell.RegWrite ("HKLM\SOFTWARE\SCCM\SCCM_Health_Check\CCM_Service_Check"), "Running"
If strLogging = "enabled" Then
logfile.Writeline "SMS Agent Host = " & Results
End If
' CCMExec serivice is running. Do SCCM Health checks
Check_Client_info 'Check Client Variable
CheckSitecode 'Check Client SiteCode
ClientVersionCheck 'Check Client Versiont
ElseIf LCase(Results) = LCase("Stopped")Then
If strLogging = "enabled" Then
logfile.Writeline "SMS Agent Host = " & Results
End If
set Results = Nothing
Call EnableService("ccmexec")
KickService("ccmexec")
WshShell.RegWrite ("HKLM\SOFTWARE\SCCM\SCCM_Health_Check\CCM_Service_Check"), "CCM Service was Stopped"
' CCMExec serivice is running. Do SCCM Health checks
Check_Client_info 'Check Client Variable
CheckSitecode 'Check Client SiteCode
ClientVersionCheck 'Check Client Version
ElseIf Results = "" Or IsNull (Results) Then
If strLogging = "enabled" Then
logfile.Writeline "SMS Agent Host not found"
End If
WMIisCorrupt = "True"
CheckSCCMInstall
AdvCliInst(ComSpec)
WScript.Quit
End If
CheckSCCMInstall'Check to see if CCMSetup failed and fix error
Script_increment 'Increment Registery Key For script by 1 And move present value To history
Check_AdminShare ' Check Admin$ Share
Check_SMSLOCALADMIN'Check Local Admin account
WS-- USEnabled ' check to ensure windows update service is enabled
Function CheckSCCMInstall
On Error Resume Next
booOverWrite = vbFalse
CurrentDirectory = replace(WScript.ScriptFullName,WScript.ScriptName,"")
If strLogging = "enabled" Then
logfile.Writeline "Starting CheckSCCMInstall with directory " & CurrentDirectory
End If
If fso.FolderExists("C:\Windows\System32\CCMSetup\LastError") Or fso.FolderExists("C:\Windows\CCMSetup\LastError") or WMIisCorrupt = "True" or SomethingIsWrong = "True" Then
If strLogging = "enabled" Then
logfile.Writeline "LastError folder exists or Can not connect to WMI. Deinstalling client and reinstalling"
End If
' Set objWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
' Set colItems = objWMI.ExecQuery ("Select * from Win32_Service Where Name = 'CCMSETUP'")
' For Each objItem In colItems
' objItem.StopService()
' Next
WshShell.Run("Net Stop CCMSetup /Y"), 0, True
If strLogging = "enabled" Then
logfile.Writeline "Stopped CCMSEtup service if existed"
End If
' ' Set colItems = objWMI.ExecQuery ("Select * from Win32_Process Where Name = 'CCMSETUP.EXE'")
' ' For Each objItem In colItems
' ' objItem.Terminate()
' ' Next
' oFile = CurrentDirectory & "PSKILL.EXE"
' If strLogging = "enabled" Then
' logfile.Writeline "Copying " & oFile
' End If
' fso.CopyFile oFile, "C:\Windows\Temp\", booOverWrite
' 'WScript.Sleep 10000
' WshShell.Run "c:\Windows\Temp\pskill ccmsetup",,True
' If strLogging = "enabled" Then
' logfile.Writeline "Stopped CCMSEtup process if existed"
' End If
oFile = CurrentDirectory & "ccmclean.exe"
If strLogging = "enabled" Then
logfile.Writeline "Copying " & oFile
End If
fso.CopyFile oFile, "C:\Windows\Temp\", booOverWrite
'WScript.Sleep 10000
WshShell.Run "c:\Windows\Temp\CCMClean /all /q",,True
If strLogging = "enabled" Then
logfile.Writeline "Ran CCMClean 1"
End If
WshShell.Run "c:\Windows\Temp\CCMClean /all /q",,True
If strLogging = "enabled" Then
logfile.Writeline "Ran CCMClean 2"
End If
oFile = CurrentDirectory & "ccmdelcert.exe"
If strLogging = "enabled" Then
logfile.Writeline "Copying " & oFile
End If
fso.CopyFile oFile, "C:\Windows\Temp\", booOverWrite
'WScript.Sleep 10000
WshShell.Run "c:\Windows\Temp\ccmdelcert.exe",,True
If strLogging = "enabled" Then
logfile.Writeline "Ran CCMDelCert"
End If
fso.DeleteFile "C:\windows\SMSCFG.INI", True
If strLogging = "enabled" Then
logfile.Writeline "Delete SMSCFG.INI"
End If
' Set colItems = objWMI.ExecQuery("Associators of " _
' & "{Win32_Service.Name='Winmgmt'} Where " _
' & "AssocClass=Win32_DependentService " & "Role=Antecedent" )
' For Each objItem In colItems
' objItem.StopService()
' Next
' WScript.Sleep 20000
' Set colItems = objWMI.ExecQuery _
' ("Select * from Win32_Service where Name='Winmgmt'")
' For Each objItem In colItems
' objItem.StopService()
' Next
WshShell.Run("C:\Windows\System32\regsvr32.exe c:\windows\system32\atl.dll /s"),0, True
WshShell.Run("C:\Windows\System32\rundll32.exe wbemupgd, UpgradeRepository"), 0, True
If strLogging = "enabled" Then
logfile.Writeline "Ran C:\Windows\System32\rundll32.exe wbemupgd, UpgradeRepository"
End If
WScript.Sleep 60000
Set objWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
Set colItems = objWMI.ExecQuery ("Select * from Win32_Service Where Name = 'WinMgmt'")
For Each objItem In colItems
Results = objItem.name
Next
If Results = "" Or IsNull(results) Then
If strLogging = "enabled" Then
logfile.Writeline "WMI Is STILL Corrupt"
End If
WshShell.Run("Net Stop Winmgmt /Y"), 0, True
If strLogging = "enabled" Then
logfile.Writeline "Stopped Winmgmt"
End If
fso.DeleteFolder ("C:\Windows\System32\WBEM\Repository"), True
If strLogging = "enabled" Then
logfile.Writeline "Deleted Repository"
End If
WshShell.Run("Net Start Winmgmt"), 0, True
If strLogging = "enabled" Then
logfile.Writeline "Started Winmgmt"
End If
sFolder = WshShell.ExpandEnvironmentStrings("%windir%\System32\WBEM")
Set oFolder = fso.GetFolder(sFolder)
For Each oFile In oFolder.Files
Select Case lCase(fso.GetExtensionName(oFile))
Case "mof", "mfl"
WshShell.Run oFolder & "\mofcomp.exe """ & oFile & """", 0, True
If strLogging = "enabled" Then
logfile.Writeline "Compiled " & oFile
End If
End Select
Next
WshShell.Run("C:\Windows\System32\rundll32.exe wbemupgd, UpgradeRepository"), 0, True
If strLogging = "enabled" Then
logfile.Writeline "Ran C:\Windows\System32\rundll32.exe wbemupgd, UpgradeRepository"
End If
WScript.Sleep 60000
End If
fso.DeleteFolder ("C:\Windows\System32\CCMSetup"), True
fso.DeleteFolder ("C:\Windows\CCMSetup"), True
fso.DeleteFolder ("C:\Windows\System32\CCM"), True
fso.DeleteFile ("C:\Windows\Temp\ccmclean.exe"), True
fso.DeleteFile ("C:\Windows\Temp\ccmdelcert.exe"), True
' fso.DeleteFile ("C:\Windows\Temp\PSKILL.exe"), True
End If
If strLogging = "enabled" Then
logfile.Writeline "Ending CheckSCCMInstall"
End If
End Function
Function Check_Client_info
On Error Resume Next
If strLogging = "enabled" Then
logfile.Writeline "Starting Check_Client_info"
End If
Set SmsClient = GetObject("winmgmts:ROOT/CCM:SMS_Client=@")
SMSClientVersion = SmsClient.ClientVersion
If SMSClientVersion = "" Or IsNull (SMSClientVersion) Then
SMSClientVersion = WshShell.RegRead("HKLM\SOFTWARE\Microsoft\SMS\Mobile Client\ProductVersion")
End If
If strLogging = "enabled" Then
logfile.Writeline "Ending Check_Client_info"
End If
End Function
Function Script_increment
On Error Resume Next
If strLogging = "enabled" Then
logfile.Writeline "starting Script_increment"
End If
StrScanRun = WshShell.RegRead("HKLM\SOFTWARE\SCCM\SCCM_Health_Check\Scan_Run")
If StrScanRun = "" Or IsNull (StrScanRun) Then
WshShell.RegWrite ("HKLM\SOFTWARE\SCCM\SCCM_Health_Check\Scan_Run"), "0"
Else
StrScanRun = StrScanRun + 1
WshShell.RegWrite ("HKLM\SOFTWARE\SCCM\SCCM_Health_Check\Scan_Run"), StrScanRun
End If
If StrScanRun >= 2 Then
History_Shift
End If
If strLogging = "enabled" Then
logfile.Writeline "Ending Script_increment"
End If
End Function
Function Check_AdminShare
On Error Resume Next
If strLogging = "enabled" Then
logfile.Writeline "starting Check_AdminShare "
End If
Set objWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
Set colItems = objWMI.ExecQuery("Select * from Win32_Share Where Name = 'ADMIN$'")
If colItems.Count > 0 Then
WshShell.RegWrite ("HKLM\SOFTWARE\SCCM\SCCM_Health_Check\AdminShare_Check"), "Admin$ is present"
If strLogging = "enabled" Then
logfile.Writeline "Admin$ is present"
End If
Else
WshShell.RegWrite ("HKLM\SOFTWARE\SCCM\SCCM_Health_Check\AdminShare_Check"), "Admin$ Is missing"
If strLogging = "enabled" Then
logfile.Writeline "Admin$ is missing"
End If
Set colItems = objWMI.execquery("select state from win32_service where name='LanmanServer'")
For Each objItem In colItems
objItem.StopService
Next
Do Until Stopped = True
Set colItems = objWMI.execquery("select state from win32_service where name='LanmanServer'")
For Each objItem In colItems
If lcase(objItem.State) = lcase("Stopped") Then
Stopped = True
End If
Next
Loop
Set colItems = objWMI.execquery("select state from win32_service where name='LanmanServer'")
For Each objItem In colItems
objItem.StartService
Next
End If
If strLogging = "enabled" Then
logfile.Writeline "ending Check_AdminShare "
End If
End Function
Function Check_SMSLOCALADMIN
On Error Resume Next
If strLogging = "enabled" Then
logfile.Writeline "starting Check_SMSLOCALADMIN"
End If
Set objLocalGroup = GetObject("WinNT://" & strComputerName & "/Administrators, group")
For Each objItem In objLocalGroup.Members
If InStr(UCase(objItem.ADSPath),UCase(strDomain & "/" & strGroupName)) <> 0 Then
WshShell.RegWrite ("HKLM\SOFTWARE\SCCM\SCCM_Health_Check\Account_Check"), strAdmAcct & " is in the Admins group"
If strLogging = "enabled" Then
logfile.Writeline strAdmAcct & " is in the Admins group"
End If
bAlreadyExists = True
End If
Next
If bAlreadyExists <> True Then
WshShell.RegWrite ("HKLM\SOFTWARE\SCCM\SCCM_Health_Check\Account_Check"), strAdmAcct & " was not in Admins group - adding"
If strLogging = "enabled" Then
logfile.Writeline strAdmAcct & " was not in Admins group - adding"
End If
objLocalGroup.Add("WinNT://" & strDomain & "/" & strGroupName)
End If
If strLogging = "enabled" Then
logfile.Writeline "starting Check_SMSLOCALADMIN"
End If
End Function
Function WS-- USEnabled
On Error Resume Next
If strLogging = "enabled" Then
logfile.Writeline "starting WS-- USEnabled"
End If
Results = ServiceState("wuauserv")'Check Windows Update Status
If LCase(Results) = LCase("Running")Then
WshShell.RegWrite ("HKLM\SOFTWARE\SCCM\SCCM_Health_Check\WindowsUpdate_Service_Check"), "Running"
If strLogging = "enabled" Then
logfile.Writeline "Auto Updates Serivice = " & Results
End If
ElseIf LCase(Results) = LCase("Stopped")Then
If strLogging = "enabled" Then
logfile.Writeline "Auto Updates Serivice = " & Results
End If
Call EnableService("wuauserv")
KickService("wuauserv")
WshShell.RegWrite ("HKLM\SOFTWARE\SCCM\SCCM_Health_Check\WindowsUpdate_Service_Check"), "Windows Update Service was Stopped"
End If
Set Results = Nothing
If strLogging = "enabled" Then
logfile.Writeline "ending WS-- USEnabled"
End If
End Function
Function ClientVersionCheck
On Error Resume Next
If strLogging = "enabled" Then
logfile.Writeline "starting ClientVersionCheck "
End If
If SMSClientVersion = "" Then
WshShell.RegWrite ("HKLM\SOFTWARE\SCCM\SCCM_Health_Check\CCM_Client_Check"), "Client Not Installed"
If strLogging = "enabled" Then
logfile.Writeline "SMSClientVersion = NO CLIENT"
End If
Call AdvCliInst(ComSpec)
WScript.Quit
Else
If strLogging = "enabled" Then
logfile.Writeline "SMSClientVersion = " & SMSClientVersion
End If
Select Case SMSClientVersion
' RTM 4.00.5931.0001
' SP1 4.00.6221.1000
' SP2 4.00.6487.2000
' R3 4.00.6487.2157
Case "4.00.6487.2157" ' SCCM SP2 R3 client version
PolicyEval
ContentTransferMangerEval
InventoryAgentEval
Case "4.00.6487.2000" ' SCCM SP2 client version
If strLogging = "enabled" Then
logfile.Writeline "Needs R3 hotfix"
End If
CurrentDirectory = replace(WScript.ScriptFullName,WScript.ScriptName,"")
smsinstall =ComSpec & " /c msiexec.exe /p "& CurrentDirectory & "SMSClient\i386\hotfix\KB977384\sccm2007ac-sp2-kb977384-x86-enu.msp /L*v %TEMP%\sccm2007ac-sp2-kb977384-x86-enu.msp.LOG /q REINSTALL=ALL REINSTALLMODE=mous"
WshShell.Run smsinstall,0,False
If strLogging = "enabled" Then
logfile.Writeline "Install R3 hotfix"
End If
PolicyEval
ContentTransferMangerEval
InventoryAgentEval
Case Else
If strLogging = "enabled" Then
logfile.Writeline "ClientVersionCheck could not determine client version - installing client"
End If
' WshShell.Run("Net Stop CCMSetup /Y"), 0, True
' If strLogging = "enabled" Then
' logfile.Writeline "Stopped CCMSEtup service if existed"
' End If
' ' Set colItems = objWMI.ExecQuery ("Select * from Win32_Process Where Name = 'CCMSETUP.EXE'")
' ' For Each objItem In colItems
' ' objItem.Terminate()
' ' Next
oFile = CurrentDirectory & "PSKILL.EXE"
fso.CopyFile oFile, "C:\Windows\Temp", True
WshShell.Run "c:\Windows\Temp\pskill ccmsetup",,True
If strLogging = "enabled" Then
logfile.Writeline "Stopped CCMSEtup process if existed"
End If
oFile = CurrentDirectory & "ccmclean.exe"
fso.CopyFile oFile, "C:\Windows\Temp", True
WshShell.Run "c:\Windows\Temp\CCMClean /all /q",,True
If strLogging = "enabled" Then
logfile.Writeline "Ran CCMClean 1"
End If
WshShell.Run "c:\Windows\Temp\CCMClean /all /q",,True
If strLogging = "enabled" Then
logfile.Writeline "Ran CCMClean 2"
End If
oFile = CurrentDirectory & "ccmdelcert.exe"
fso.CopyFile oFile, "C:\Windows\Temp", True
WshShell.Run "c:\Windows\Temp\ccmdelcert.exe",,True
If strLogging = "enabled" Then
logfile.Writeline "Ran CCMDelCert"
End If
fso.DeleteFile "C:\windows\SMSCFG.INI", True
If strLogging = "enabled" Then
logfile.Writeline "Delete SMSCFG.INI"
End If
fso.DeleteFolder ("C:\Windows\System32\CCMSetup"), True
fso.DeleteFolder ("C:\Windows\CCMSetup"), True
fso.DeleteFile ("C:\Windows\Temp\ccmclean.exe"), True
fso.DeleteFile ("C:\Windows\Temp\ccmdelcert.exe"), True
fso.DeleteFile ("C:\Windows\Temp\PSKILL.exe"), True
Call AdvCliInst(ComSpec)
WScript.Quit
End Select
End If
If strLogging = "enabled" Then
logfile.Writeline "ending ClientVersionCheck "
End If
End Function
Function PolicyEval
On Error Resume Next
If strLogging = "enabled" Then
logfile.Writeline "starting PolicyEval "
End If
Set oFile = fso.GetFile (StrSCCMPath & "Logs\CCMExec.log")
startdate = ofile.DateLastModified
enddate = date()
If isDate(startdate) Then
diffdate = DateDiff("d", startdate, enddate)
If strLogging = "enabled" Then
logfile.Writeline "CCMExec.log last accessed = " & diffdate
End If
End If
If diffdate > 21 Then
If strLogging = "enabled" Then
logfile.Writeline "CCMExec.log last accessed more than 21 days ago. Repair client"
End If
SomethingIsWrong = "True"
call CheckSCCMInstall
call AdvCliInst(ComSpec)
wscript.quit
End If
If strLogging = "enabled" Then
logfile.Writeline "ending PolicyEval "
End If
End Function
Function ContentTransferMangerEval
On Error Resume Next
If strLogging = "enabled" Then
logfile.Writeline "starting ContentTransferManager.log Eval "
End If
Set oFile = fso.GetFile (StrSCCMPath & "Logs\ContentTransferManager.log")
startdate = ofile.DateLastModified
enddate = date()
If isDate(startdate) Then
diffdate = DateDiff("d", startdate, enddate)
If strLogging = "enabled" Then
logfile.Writeline "ContentTransferManager.log last accessed = " & diffdate
End If
End If
If diffdate > 45 Then
If strLogging = "enabled" Then
logfile.Writeline "ContentTransferManager.log last accessed more than 45 days ago. Repair client"
End If
SomethingIsWrong = "True"
call CheckSCCMInstall
call AdvCliInst(ComSpec)
wscript.quit
End If
If strLogging = "enabled" Then
logfile.Writeline "ending ContentTransferManager.log eval "
End If
End Function
Function InventoryAgentEval
On Error Resume Next
If strLogging = "enabled" Then
logfile.Writeline "starting InventoryAgent.log Eval "
End If
Set oFile = fso.GetFile (StrSCCMPath & "Logs\InventoryAgent.log")
startdate = ofile.DateLastModified
enddate = date()
If isDate(startdate) Then
diffdate = DateDiff("d", startdate, enddate)
If strLogging = "enabled" Then
logfile.Writeline "InventoryAgent.log last accessed = " & diffdate
End If
End If
If diffdate > 10 Then
If strLogging = "enabled" Then
logfile.Writeline "InventoryAgent.log last accessed more than 10 days ago. Repair client"
End If
SomethingIsWrong = "True"
call CheckSCCMInstall
call AdvCliInst(ComSpec)
wscript.quit
End If
If strLogging = "enabled" Then
logfile.Writeline "ending InventoryAgent.log eval "
End If
End Function
Function CheckSitecode
' On Error Resume Next
' If strLogging = "enabled" Then
' logfile.Writeline "starting CheckSitecode "
' End If
' 'Ensure that the client is auto assigned to sites and that the client is assigned to the correct site
' Set SmsClient = CreateObject ("Microsoft.SMS.Client")
' AssignedSite = SmsClient.GetAssignedSite
' If ((Len(strComputerName) = 13) And (Mid(strComputerName, 7, 1) = "X")) Then
' gstrSiteCode = Mid(strComputerName, 3, 4)
' end If
' WshShell.RegWrite ("HKLM\SOFTWARE\SCCM\SCCM_Health_Check\SCCM_AssignedSite"), AssignedSite
' If strLogging = "enabled" Then
' logfile.Writeline "SCCM Assigned Site = " & AssignedSite
' End If
' Set objWMI = GetObject("winmgmts:ROOT/CCM:SMS_Client=@")
' AutoAssignedSite = objWMI.EnableAutoAssignment
' If AutoAssignedSite = True Then
' WshShell.RegWrite ("HKLM\SOFTWARE\SCCM\SCCM_Health_Check\SCCM_AutoAssignment"), "TRUE"
' If strLogging = "enabled" Then
' logfile.Writeline "SCCM Auto Assignement = TRUE"
' End If
' Else
' WshShell.RegWrite ("HKLM\SOFTWARE\SCCM\SCCM_Health_Check\SCCM_AutoAssignment"), "FALSE"
' If strLogging = "enabled" Then
' logfile.Writeline "SCCM Auto Assignement = FALSE"
' End If
' SmsClient.EnableAutoAssignment 1
' End If
' If gstrSiteCode = "MN00" Then
' If AssignedSite <> "P01" Then
' SmsClient.SetAssignedSite("P01")
' End If
' Else
' If AssignedSite <> "CEN" Then
' SmsClient.SetAssignedSite("CEN")
' End If
' End If
' If strLogging = "enabled" Then
' logfile.Writeline "ending CheckSitecode "
' End If
End Function
Function KickService(servicename)
On Error Resume Next
If strLogging = "enabled" Then
logfile.Writeline "starting KickService " & servicename
End If
Results = ServiceState(servicename)
Set objWMI = getobject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
If Not LCase(Results) = LCase("Running")Then
Set colItems = objWMI.execquery("select state from win32_service where name='" & servicename & "'")
For Each objItem In colItems
' Start Service
objItem.StartService
Next
' Do Until Started = True
' Set colItems = objWMI.execquery("select state from win32_service where name='" & servicename & "'")
' For Each objItem In colItems
' If lcase(objItem.State) = lcase("Running") Then
' Started = True
' end If
' Next
' Loop
End If
set Results = Nothing
If strLogging = "enabled" Then
logfile.Writeline "ending KickService " & servicename
End If
End Function
Function EnableService(servicename)
On Error Resume Next
If strLogging = "enabled" Then
logfile.Writeline "starting EnableService " & servicename
End If
Set objWMI = GetObject("winmgmts:root\cimv2:Win32_Service.Name='" & servicename & "'")
Results = objWMI.ChangeStartMode("automatic")
If strLogging = "enabled" Then
logfile.Writeline "ending EnableService " & servicename
End If
End Function
Function ServiceState(servicename)
On Error Resume Next
If strLogging = "enabled" Then
logfile.Writeline "starting ServiceState " & servicename
End If
Set objWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
Set colItems = objWMI.execquery("select state from win32_service where name='" & servicename & "'")
For Each objItem In colItems
Results = objItem.State
Next
If strLogging = "enabled" Then
logfile.Writeline servicename & " is " & Results
End If
ServiceState = Results
set Results = Nothing
If strLogging = "enabled" Then
logfile.Writeline "ending ServiceState " & servicename
End If
End Function
Sub AdvCliInst(ComSpec)
On Error Resume Next
If strLogging = "enabled" Then
logfile.Writeline "starting AdvCliInst"
End If
If ComSpec = "" Then
WScript.Quit
Else
CurrentDirectory = replace(WScript.ScriptFullName,WScript.ScriptName,"")
smsinstall =ComSpec & " /c "& CurrentDirectory & "SMSClient\CCMSetup.exe" & InstallArgs
SCCM_Install
WshShell.Run smsinstall,0,True
If strLogging = "enabled" Then
logfile.Writeline "Starting CCMSetup"
End If
Do While GetObject("WinMgmts:/root/cimV2").ExecQuery("SELECT * FROM Win32_Process WHERE Name='CCMSetup.exe'").Count
WScript.Sleep 1000
Loop
If strLogging = "enabled" Then
logfile.Writeline "Ending CCMSetup"
End If
If strLogging = "enabled" Then
logfile.Writeline "Starting R3 patch"
End If
smsinstall =ComSpec & " /c msiexec.exe /p "& CurrentDirectory & "SMSClient\i386\hotfix\KB977384\sccm2007ac-sp2-kb977384-x86-enu.msp /L*v %TEMP%\sccm2007ac-sp2-kb977384-x86-enu.msp.LOG /q REINSTALL=ALL REINSTALLMODE=mous"
WshShell.Run smsinstall,0,True
If strLogging = "enabled" Then
logfile.Writeline "Ending R3 patch"
End If
End If
If strLogging = "enabled" Then
logfile.Writeline "ending AdvCliInst"
End If
End Sub
Function SCCM_Install
On Error Resume Next
If strLogging = "enabled" Then
logfile.Writeline "starting SCCM_Install"
End If
StrSCCMInstall = WshShell.RegRead("HKLM\SOFTWARE\SCCM\SCCM_Health_Check\SCCM_Install")
If StrSCCMInstall = "" Or IsNull (StrSCCMInstall) Then
WshShell.RegWrite ("HKLM\SOFTWARE\SCCM\SCCM_Health_Check\SCCM_Install"), "1"
Else
StrSCCMInstall = WshShell.RegRead("HKLM\SOFTWARE\SCCM\SCCM_Health_Check\SCCM_Install")
StrSCCMInstall = StrSCCMInstall + 1
WshShell.RegWrite ("HKLM\SOFTWARE\SCCM\SCCM_Health_Check\SCCM_Install"), StrSCCMInstall
End If
If strLogging = "enabled" Then
logfile.Writeline "Ending SCCM_Install"
End If
End Function
Function History_Shift
On Error Resume Next
If strLogging = "enabled" Then
logfile.Writeline "starting History_Shift"
End If
' CCM service History move
strValueName = WshShell.RegRead("HKLM\SOFTWARE\SCCM\SCCM_Health_Check\CCM_Service_Check")
If strValueName = "" Or IsNull (strValueName) Then
strValueName = "CCM Service was Stopped"
WshShell.RegWrite ("HKLM\SOFTWARE\SCCM\SCCM_Health_Check\CCM_Service_Check"), strValueName
Else
WshShell.RegWrite ("HKLM\SOFTWARE\SCCM\SCCM_Health_Check\HS_CCM_Service_Check"), strValueName
End If
Set strValueName = Nothing
' Admin$ Check History move
strValueName = WshShell.RegRead("HKLM\SOFTWARE\SCCM\SCCM_Health_Check\AdminShare_Check")
If strValueName = "" Or IsNull (strValueName) Then
strValueName = "Admin$ Is missing"
WshShell.RegWrite ("HKLM\SOFTWARE\SCCM\SCCM_Health_Check\AdminShare_Check"), strValueName
Else
WshShell.RegWrite ("HKLM\SOFTWARE\SCCM\SCCM_Health_Check\HS_AdminShare_Check"), strValueName
End If
Set strValueName = Nothing
'Account Check History move
strValueName = WshShell.RegRead("HKLM\SOFTWARE\SCCM\SCCM_Health_Check\Account_Check")
If strValueName = "" Or IsNull (strValueName) Then
strValueName = strAdmAcct & " was not in Admins group"
WshShell.RegWrite ("HKLM\SOFTWARE\SCCM\SCCM_Health_Check\Account_Check"), strValueName
Else
WshShell.RegWrite ("HKLM\SOFTWARE\SCCM\SCCM_Health_Check\HS_Account_Check"), strValueName
End If
Set strValueName = Nothing
'Windows Update Service History move
strValueName = WshShell.RegRead("HKLM\SOFTWARE\SCCM\SCCM_Health_Check\WindowsUpdate_Service_Check")
If strValueName = "" Or IsNull (strValueName) Then
strValueName = "Windows Update service was not running"
WshShell.RegWrite ("HKLM\SOFTWARE\SCCM\SCCM_Health_Check\WindowsUpdate_Service_Check"), strValueName
Else
WshShell.RegWrite ("HKLM\SOFTWARE\SCCM\SCCM_Health_Check\HS_WindowsUpdate_Service_Check"), strValueName
End If
Set strValueName = Nothing
'SCCM_AssignedSite History move
strValueName = WshShell.RegRead("HKLM\SOFTWARE\SCCM\SCCM_Health_Check\SCCM_AssignedSite")
If strValueName = "" Or IsNull (strValueName) Then
strValueName = "No Assigned Site"
WshShell.RegWrite ("HKLM\SOFTWARE\SCCM\SCCM_Health_Check\SCCM_AssignedSite"), strValueName
Else
WshShell.RegWrite ("HKLM\SOFTWARE\SCCM\SCCM_Health_Check\HS_SCCM_AssignedSite"), strValueName
End If
Set strValueName = Nothing
'SCCM_AutoAssignment History move
strValueName = WshShell.RegRead("HKLM\SOFTWARE\SCCM\SCCM_Health_Check\SCCM_AutoAssignment")
If strValueName = "" Or IsNull (strValueName) Then
strValueName = "SCCM Autoassignment failure"
WshShell.RegWrite ("HKLM\SOFTWARE\SCCM\SCCM_Health_Check\SCCM_AutoAssignment"), strValueName
Else
WshShell.RegWrite ("HKLM\SOFTWARE\SCCM\SCCM_Health_Check\HS_SCCM_AutoAssignment"), strValueName
End If
Set strValueName = Nothing
If strLogging = "enabled" Then
logfile.Writeline "ending History_Shift"
End If
End Function