Upload
buinguyet
View
238
Download
0
Embed Size (px)
Citation preview
Const ScriptVersion = "4.19"
'=============== Info =======================================
' USEAGE: CLIENT HEALTH REPAIR
' Based on source at: Dude Works http://wwww.dudeworks.com/Support/SupportForum/tabid/83/mid/475/groupid/6/Default.aspx
' Based on source at: www.1e.com
' Based on source at: Shaun Cassells at http://myitforum.com/cs2/blogs/scassells/default.aspx
'============================================================
' Requirements
' Requires sc.exe either present in run directory, %systemroot%\system32\, or %systemroot%\system32\dllcache
' Requires regsrv32.exe to be in %systemroot%\system32\ or accessible in path
'============================================================
' Overview
' The following script fixes generic workstation issues in a networked corporate environment
' not designed to run on servers
'============================================================
' UPDATES
' 4.19
' Fixed %Temp% not existing
' Fixed error log reporting to be consistant
' Fixed CLIENTSTATE to be less sensetive
' (including not caring where sc.exe is found as long as it is found)
' Other random bug fixes
' ToDo
' Test with ConfigMgr 2007
'============================================================
On ERROR Resume Next
Dim objWMIService, oWMIService, oServices
Dim ADSiteName
Dim oUIResManager
Dim oCache, CacheSize
Dim SiteName,SiteCode,GUID,Version,strComputerRole
Dim dd,strLogFile,tempPath,CCM_DIR,ddr
Dim CLIENTSTATE,StrERRType
Dim strValue,strValues
Dim GoodLogPath,BadLogPath,logGood,LogBad,doRunCheck,eventlog
Dim StrCCRServer,strCCRSiteCode,strLOGServer
Dim LocalAdminGroup,admACCT
Dim do_CHK_LOCALADMIN,do_CHK_ADMSHARE,do_CHK_RemoteReg,do_CHK_WMI_SERVICE,do_CHK_BITS_SERVICE,do_REG_XML
Dim do_CHK_AdvClient,do_SEND_CCR,do_RUN_CCMSetUP,do_REBUILD,do_REPAIR,do_CHK_DCOM,do_StartSeriviceViaSC,SCEXELocation
Dim intEventType,strEventDescription
Dim bClientExist
Dim iniResult
Dim sOStype,isOS,OS, sOSversion
Dim strEnvLog, strEnvVal
Dim SMSCLIENTLASTERROR
Dim oSmsversion,SMSVersion,ConfigMgrVersion
'===========File System Constants=====================================
Const ForReading = 1, TemporaryFolder = 2, ForAppending = 8
Const OverwriteExisting = True
'===========Registry Constants=====================================
Const HKeyName_LOCAL_MACHINE = &H80000002
'Const HKeyName_CURRENT_USER = &H80000001
'===========Event Log Constants=====================================
Const EVENT_SUCCESS = 0
Const EVENT_ERROR = 1
Const EVENT_WARNING = 2
Const EVENT_INFORMATION = 4
Const AUDIT_SUCCESS = 8
Const AUDIT_FAILURE = 16
'=============== Load/Create Objects =====================================
On ERROR Resume Next
Dim WSHShell: Set WSHShell = CreateObject("WScript.Shell")
If err <> 0 Then WSHShell.LogEvent EVENT_ERROR, "SMS STARTUP SCRIPT - WScript.Shell is broken" : CleanUp(err) 'Windows Scripting Host is busted!
WSHShell.LogEvent EVENT_INFORMATION, "SMS STARTUP SCRIPT - Last Run @ " & now
Dim objSysInfo: Set objSysInfo = CreateObject("ADSystemInfo")
If err <> 0 Then WSHShell.LogEvent EVENT_ERROR, "SMS STARTUP SCRIPT - ADSystemInfo is broken" : CleanUp(err)
Dim objFSO: Set objFSO = CreateObject("Scripting.FileSystemObject")
If err <> 0 Then WSHShell.LogEvent EVENT_ERROR, "SMS STARTUP SCRIPT - Scripting.FileSystemObject is broken" : CleanUp(err)
Dim oLocator: Set oLocator = CreateObject("WbemScripting.SWbemLocator")
If err <> 0 Then WSHShell.LogEvent EVENT_ERROR, "SMS STARTUP SCRIPT - WbemScripting.SWbemLocator is broken" : CleanUp(err)
' Dim objNetwork: Set objNetwork = WScript.CreateObject("WScript.Network")
'=============== GET ENVIRONMENT and LOGGING DETAILS ==============
'Set Current Directory
wshshell.CurrentDirectory = WScript.ScriptFullName & "\.."
Dim strCurrentDir: strCurrentDir = wshSHELL.CurrentDirectory
Dim Computer: Computer = WSHShell.ExpandEnvironmentStrings("%COMPUTERNAME%")
If Computer = "%COMPUTERNAME%" Then WSHShell.LogEvent EVENT_ERROR, "SMS STARTUP SCRIPT - COMPUTERNAME value is empty" : CleanUp(err)
Dim windir: windir = WSHShell.ExpandEnvironmentStrings("%WINDIR%")
If windir = "%WINDIR%" Then WSHShell.LogEvent EVENT_ERROR, "SMS STARTUP SCRIPT - WINDIR value is empty" : CleanUp(err)
Dim SysDrive: SysDrive = WSHShell.ExpandEnvironmentStrings("%SystemDrive%")
If SysDrive = "%SystemDrive%" Then WSHShell.LogEvent EVENT_ERROR, "SMS STARTUP SCRIPT - SysDrive value is empty" : CleanUp(err)
Dim UserTempPath: UserTempPath = WSHShell.ExpandEnvironmentStrings("%TEMP%")
If err <> 0 Then WSHShell.LogEvent EVENT_ERROR, "SMS STARTUP SCRIPT - ExpandEnvironmentStrings is broken" : CleanUp(err)
'Set Logfile location
StrERRType = ""
strFileName = "sms_chk_" & computer & ".log"
'Issue with this variable
'Some machines do not have a %temp% defined.
'Default seems to be %windir%\temp. However some machines have c:\temp. Oppurtunity to classify. I just go with the flow.
'If a machine does not have a %temp% defined then I write an ERROR and set path to %windir%\temp
'Check if Directory exists
If objFSO.FolderExists(UserTempPath) Then
'Check to see if last char is a \. if so remove it.
If Right(UserTempPath,1) = "\" Then
UserTempPath = Left(UserTempPath,Len(UserTempPath) - 1)
End If
strLogFile = UserTempPath & "\" & strFileName
If InStr(UserTempPath,windir) Then
strDirectory = "\Admin$" & Right(UserTempPath,Len(UserTempPath)- Len(windir))
Else
strDirectory = "\C$" & Right(UserTempPath,Len(UserTempPath)- Len(SysDrive))
End If
strUNCLogFile = "\\" & Computer & strDirectory & "\" & strFileName
Else
'Houston we have a problem
WSHShell.LogEvent EVENT_ERROR, "SMS STARTUP SCRIPT - TEMP value is empty"
UserTempPath = windir & "\temp"
strLogFile = UserTempPath & "\" & strFileName
'Ran into machines without the %windir%\temp directory for system account
'lenWinDir = Len(windir)
'strUNCLogFile = "\\" & Computer & "\admin$" & Right(UserTempPath,Len(UserTempPath)- lenWinDir) & "\" & strFileName
'****Fixed write to %windir%\temp directory
strUNCLogFile = "\\" & Computer & "\admin$\Temp\" & strFileName
End If
'Check to see what state of client is in
'Errors are incremented
CLIENTSTATE=0
' ==========CONFIG SETTINGS=========================================
'/// Check System role, If role =0 or 1 Then WKS, 2 3 4 & 5 are Server roles
SMSVersion="4.00.6221.1000"
ConfigMgrVersion="4.00.6221.1000" 'SP1
CompanyName="Astellas"
bClientExist = False
'AUTO because AD is extended with servers published
WKS_ASSIGNSITECODE = "AUTO"
WKS_CacheSize = 5120 'Plenty large enough for service packs
WKS_PortNumber = 80 'We use a non 80 port number so the network monitors wont give false positives.
'WKS_LocalAdminGroup = "Administrators" 'SpecIfy Local Admin group to add SMS Admin Acount to (DEFAULT=Administrators)
'WKS_admACCT = "Domain\Group" 'SpecIfy SMS Admin account (group)
'//Registry for counts
RegPath = "HKLM\SYSTEM\Setup\ClientHealthStartup"
'// CCR's
StrCCRServer = "USDADASSCPW01" 'SpecIfy Site server to send CCR's to
strCCRSiteCode = "AST"
' ===================================================================
' ==========Logging SETTINGS=========================================
' ===================================================================
'// LOGGING
logToEventsSummary=True 'Post single event log item that includes all events(DEFAULT=True) '
LogToConsoleVerbose=False 'wscript.echo the log file to the console (DEFAULT=False)
LogToConsoleDebug=False 'Wscript.echo for debugging (DEFAULT=False)
LogEnvironment=True 'Log environment, will aid in troubleshooting client, includes: system,user,process, volatile
Do_WebSubmit = False 'Submits to a website for centralized reporting
iHoursBetweenRun = 12 ' Number of hours that must have elapsed before next run
doRunCheck=False ' Will only allow the script to fully run on a system once within iHoursBetweenRun hours
LogGood=True 'Renames the front of the file to represent a good file prefix
LogBad=True 'Add prefix for type of ERROR
'If you use this method you need to grant
'DOMAIN\DOMAIN COMPUTERS write permissions (NFTS) to that share since the script runs under local system
GoodLogPath ="\\Usdadasscpw01\Logs\HealthCheck\Good" 'SpecIfy Site server to send good/success logs (DEFAULT)
BadLogPath ="\\Usdadasscpw01\Logs\HealthCheck\Bad" 'SpecIfy Site server to send bad/fail logs
' Always capture your bad client logs so you can see who and where you have bad systems.
' ===================================================================
' ==========SMS Install SETTINGS=====================================
' ===================================================================
'//CCMSetUP LOCATION
CCMSetUP = "\\USDADASSCPW01\SMSClient\i386\ccmSetup.exe" 'Path to CCMSetup.exe
CCM_DIR = windir & "\system32\CCM\"
' ===================================================================
' ==========WMI SETTINGS=============================================
' ===================================================================
'// WMI REPAIR OPTIONS - WARNING - ONLY SELECT ONE OPTION TO REPAIR WMI
do_REBUILD = False '(DEFAULT=False)this option uses a BRUTE FORCE and renames the repository to repository_old and allows WMI to rebuild a new repository
'this wil also wipe out any custom data you have stored in WMI- so beware - however this the MOST EFFECTIVE
do_REPAIR = True 'this option uses the repair upgrade option of WMI to attempt a gentle recovery without losing any custom data
'If BOTH options are Set to False we will only log the WMI issue and you'll be able to manually deal with the WMI issues
' however the script will NOT repair anything Else until WMI is fixed.
' ===================================================================
' ==========WMI SETTINGS=============================================
' ===================================================================
'// enable True / False tasks you wish to run
do_CHK_CheckLogFileModifyDate = True 'Check to see if log file is updating recently
do_CHK_CCMEXEC = True ' CHK_CCMEXEC should ALWAYS RUN - LEAVE at TRUE
do_CHK_AdvClient = True ' Checks Advanced client state
do_SEND_CCR = True ' Sends a CCR to your site server( only use If you dont use RUN_CCMSetUP )
do_RUN_CCMSetUP = True ' Runs CCMSetUP from specified server share location in order to reinstall the client
'Requires that Domain\Domain Computers account have access to share to run the setup file. Must be explicitly set on server share
' only use one install method CCR or CCMSetUP.. option is for enviroments where clients dont haven rights to write a CCR to the server but can pull CCMSetUP
' Running CCMSetUP can be a little brutal but it should only happen once and its a much surer way to make sure that client gets installed correctly and right away
do_CHK_SMSUPDATECLIENT = True ' CHECK latest SMS client version and install updated client If needed.
do_CHK_CACHESIZE = True ' checks/Sets the cache size
'Checks
do_CHK_SYSTEMPATH = True ' Cleans up the System PATH statement environment by ensuring the wbem is near the front of and that there are no duplicates in the path
do_CHK_DCOM = True ' Forces DCOM security premissions for SMS client access
'May not work currently
do_CHK_LOCALADMIN = False ' Adds your SMS Account to the local admins group
do_CHK_ADMSHARE = True ' checks and repairs Admin$
'Services
do_CHK_RPC_SERVICE = True 'Turns on RPC before everything
do_CHK_WMI_SERVICE = True ' Checks WMI service
do_CHK_FIREWALL_ICS_SERVICE = True 'Truns on ICS after WMI
do_CHK_SERVER_SERVICE = True ' Checks Server Service
do_CHK_RemoteReg = True ' Enables remote registry
do_CHK_BITS_SERVICE = True ' Checks BITS service
do_CHK_WUS_SERVICE = True ' Checks Automatic service
do_CHK_TERMSERVICE_SERVICE = True ' Checks Terminal service
do_CHK_MSI_SERVICE = True ' Checks Windows Installer service
'Register
do_REG_XML = True ' Registers XML
do_REG_BITS = True ' Registers two Bits files - if True service will be reset too
do_REG_OLEAut32 = True ' Registers OLEAut32
do_REG_Msiexec = True ' Registers msiexec /regserver
Debug("********** Start ***********")
'===================================================================
'===================================================================
'=================== START =========================================
'===================================================================
'===================================================================
'check to see when last time script was run based on last log date
' dont run more than once in 12 hrs
' this prevents a client that is really hosed to not keep reinstalling everytime the user logs in
' but rather attempts more fixes once a day
On ERROR Resume Next
If doRunCheck=True Then
If objFSO.FileExists(strLogFile) Then
Set ofile =objFSO.GetFile(strLogFile)
'Debug("Date diff = " & DateDIff("h", ofile.DateLastModified , Now))
'Debug("iHoursBetweenRun = " & iHoursBetweenRun)
If DateDIff("h", ofile.DateLastModified , Now) < iHoursBetweenRun Then
Debug("ran recently")
WSHShell.LogEvent EVENT_WARNING, "SMS STARTUP SCRIPT - Ran less than " & iHoursBetweenRun & " hours ago " & Now
CleanUp("doRunCheck")
End If
End If
End If
'Deletes the previous log file
If objFSO.FileExists(strLogFile) Then
objFSO.DeleteFile(strLogFile)
End If
'Creates new log file
err.clear
Set oFile = objFSO.CreateTextFile(strLogFile)
If err <> 0 Then WSHShell.LogEvent EVENT_ERROR, "SMS STARTUP SCRIPT - Unable to create log file: " & strLogFile : CleanUp(err)
oFile.Close
err.clear
'Grab OS version
GetOs
If isOS="workstation" Then
If InStr(UCase(WScript.ScriptName),"SRV") Then CleanUp(err)
LocalAdminGroup = WKS_LocalAdminGroup
admACCT = WKS_admACCT
ASSIGNSITECODE = WKS_ASSIGNSITECODE
CacheSize = WKS_CacheSize
PortNumber = WKS_PortNumber
Else
'Disabled as this will not run on servers
COLLECTMSG "isOS","ERROR","Non workstation computer type"
WSHShell.LogEvent EVENT_FAILURE, "SMS STARTUP SCRIPT - Ran less than " & iHoursBetweenRun & " hours ago " & Now
CleanUp(err)
End If
WSHShell.LogEvent EVENT_INFORMATION, "SMS STARTUP SCRIPT - Last Full Run @ " & now
ADSiteName = objSysInfo.SiteName
Debug("********** Begin System_Info ***********")
COLLECTMSG "SYSTEM_INFO","SCRIPT_SOURCE","WKS"
COLLECTMSG "SYSTEM_INFO","SCRIPT_VERSION",ScriptVersion
COLLECTMSG "SYSTEM_INFO","SCRIPT_LOCATION",strCurrentDir
COLLECTMSG "SYSTEM_INFO","SYSTEMNAME", Computer
COLLECTMSG "SYSTEM_INFO","OPERATING_SYSTEM",OS & " " & sOSversion
'Disabled because this check uses WMI. Also this script is designed to only run on workstations
'COLLECTMSG "SYSTEM_INFO","SYSTEMROLE",strComputerRole
COLLECTMSG "SYSTEM_INFO","LOGFILE", strLogFile
COLLECTMSG "SYSTEM_INFO","AD_USERNAME", objSysInfo.UserName
COLLECTMSG "SYSTEM_INFO","AD_COMPUTERNAME", objSysInfo.ComputerName
COLLECTMSG "SYSTEM_INFO","AD_SITENAME", objSysInfo.SiteName
' =============================================================================
' RunTasks
' Description: CONNECT TO MGMT SERVICE
' =============================================================================
Err.clear
Debug("********** Chk DCOM & System Path & Local Admin Group ***********")
If do_CHK_DCOM = True Then CHK_DCOM
If do_CHK_SYSTEMPATH = True Then CHK_SYSTEMPATH ' This will ensure that the wbem path is near the front or the environment.
SCFileExist
' True if sc.exe file is found; False if not
' Checks current path and %systemroot%\system32
' SC.exe attempts to start a service
If do_CHK_LOCALADMIN = True Then CHK_SMSLOCALADMIN
Debug("********** Check WMI Service Mode ***********")
COLLECTMSG "WMI Service",">",null
'Check to see if Service is disabled
WMIRegValue = wshshell.regread("HKLM\SYSTEM\CurrentControlSet\Services\winmgmt\Start")
Select Case WMIRegValue
Case 2
'Auto setting - GOOD
COLLECTMSG "WMI","Service in Reg is set to Auto",null
Debug("WMI is set to auto")
Case 3
'Manual setting - Connecting will start
'Make service set to Automatic
COLLECTMSG "WMI","WARNING","Service in Reg is set to Manual"
Debug("WMI is set to Manual")
Debug("do_StartSeriviceViaSC = " & do_StartSeriviceViaSC)
If do_StartSeriviceViaSC Then StartSeriviceViaSC "winmgmt","auto"
StrERRType=StrERRType & "WMIManual_"
RegCounter "WMI",1
CLIENTSTATE = CLIENTSTATE + 1
Case 4
'Attempts to use sc.exe to start the service
COLLECTMSG "WMI","WARNING","Service in Reg is set to Disabled"
Debug("WMI Service is not set to AUTO")
Debug("do_StartSeriviceViaSC = " & do_StartSeriviceViaSC)
If do_StartSeriviceViaSC Then StartSeriviceViaSC "winmgmt","auto"
StrERRType=StrERRType & "WMIDisabled_"
RegCounter "WMI",1
CLIENTSTATE = CLIENTSTATE + 1
Case Else
'UNKNOWN Service State
COLLECTMSG "WMI","ERROR","Service in Reg is set to " & WMIRegValue & " Unknown value"
Debug("WMI Service is not set to " & WMIRegValue & " Unkown")
Debug("do_StartSeriviceViaSC = " & do_StartSeriviceViaSC)
If do_StartSeriviceViaSC Then StartSeriviceViaSC "winmgmt","auto"
StrERRType=StrERRType & "WMIUnknown_"
RegCounter "WMI",1
CLIENTSTATE = CLIENTSTATE + 1
End Select
' =============================================================================
'CHECK If WMI IS ACCESSIBLE and CONNECT
' =============================================================================
Debug("********** Check WMI Connection ***********")
On ERROR Resume Next
err.clear
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & Computer & "\root\cimv2")
If Err <> 0 Then
COLLECTMSG "WMI_CONNECT","ERROR",err & " " & err.description
Debug("********** WMI Connection FAIL ***********")
RegCounter "WMI",1
StrERRType=StrERRType & "WMIConnect_"
'//CANNOT CONNECT TO WMI
Debug("Registry WMIStatus = " & WSHShell.Regread(RegPath & "\WMIStatus"))
Select Case WSHShell.Regread(RegPath & "\WMIStatus")
Case ""
Debug("WMIStatus = no prior break")
RegCounter "WMIFail",1
CLIENTSTATE = CLIENTSTATE + 50
If do_REPAIR = True Then
REPAIR_WMI_XP : RegCounter "WMIStatus","REPAIRED"
COLLECTMSG "WMI Repair","Waring","Doing the first repair on WMI"
StrERRType=StrERRType & "WMIRepair_"
End If
Case "REPAIRED"
Debug("WMIStatus = REPAIRED")
RegCounter "WMIFail",1
CLIENTSTATE = CLIENTSTATE + 100
If do_REBUILD = True Then
REBUILD_WMI_BRUTE_FORCE : RegCounter "WMIStatus","REPAIRED"
COLLECTMSG "WMI BRUTE FORCE","ERROR","This machine has gone through Repair - still failing"
StrERRType=StrERRType & "WMIRebuild_"
End If
Case "REBUILT"
Debug("WMIStatus = REBUILT")
RegCounter "WMIFail",1
CLIENTSTATE = CLIENTSTATE + 1000
StrERRType=StrERRType & "WMIFAIL_"
COLLECTMSG "WMI REBUILT","ERROR","This machine has gone through Repair and Rebuild - still failing"
End Select
err.clear
WSHShell.LogEvent EVENT_INFORMATION, "SMS STARTUP SCRIPT - WMI " & WSHShell.Regread(RegPath & "\WMIStatus") & " " & Now
Debug("ClientState = " & CLIENTSTATE)
CleanUp(err)
End If
'***Repleace with Registry counter
RegCounter "WMIStatus",""
'WriteEnvVar "SMSCLIENT_CHK_WMI_CONNECT","","system","0"
'WriteEnvVar "SMSCLIENT_CHK_WMI_LAST","","system","0"
' =============================================================================
' RunTasks
' Description: Generic Health Tasks
' =============================================================================
Err.clear
Debug("********** Begin Checks ***********")
If do_CHK_ADMSHARE = True Then CHK_ADMSHARE
If do_REG_XML = True Then REG_XML
If do_REG_BITS = True Then REG_SVR32 "REG_BITS", "Qmgr.dll" : REG_SVR32 "REG_BITS", "qmgrprxy.dll"
If do_REG_OLEAut32 = True Then REG_SVR32 "REG_OLEAut32", "OLEaut32.dll"
If do_REG_Msiexec = True Then REG_Msiexec
Debug("********** Begin Services ***********")
If do_CHK_RPC_SERVICE = True Then Fix_Service "CHK_RPC_SERVICE","RpcSs","auto","Running"
If do_CHK_WMI_SERVICE = True Then Fix_Service "CHK_WMI_SERVICE","winmgmt","auto","Running"
If do_CHK_FIREWALL_ICS_SERVICE = True Then Fix_Service "CHK_FIREWALL_ICS_SERVICE","SharedAccess","auto","Running"
If do_CHK_SERVER_SERVICE = True Then Fix_Service "CHK_SERVER_SERVICE","lanmanserver","auto","Running"
If do_CHK_RemoteReg = True Then Fix_Service "CHK_RemoteReg","RemoteRegistry","auto","Running"
If do_CHK_BITS_SERVICE = True Then Fix_Service "CHK_BITS_SERVICE","BITS","NotDisabled","unimportant"
If do_CHK_WUS_SERVICE = True Then Fix_Service "CHK_WUS_SERVICE","wuauserv","auto","Running"
If do_CHK_TERMSERVICE_SERVICE = True Then Fix_Service "TERMSERVICE_SERVICE","TermService","Manual","unimportant"
If do_CHK_MSI_SERVICE = True Then Fix_Service "MSI_SERVICE","MSIServer","Manual","unimportant"
Debug("********** Begin SMS ***********")
CHK_SMSVERSION
If do_CHK_CCMEXEC = True Then bClientExist = Fix_Service("CHK_CCMEXEC","CcmExec","auto","Running")
If do_CHK_SMSUPDATECLIENT = True Then CHK_SMSUPDATECLIENT
COLLECTMSG "SYSTEM_INFO","CLIENTSTATE",CLIENTSTATE
Debug("Client State = " & CLIENTSTATE)
If CLIENTSTATE = 0 Then
' =============================================================================
' RunTasks
' Description: Run Healthy Client
' =============================================================================
Debug("********** Healthy last SMS ***********")
If do_CHK_CheckLogFileModifyDate = True Then CheckLogFileModifyDate("PolicyEvaluator.log")
CHK_ASSIGNMENT ' now that everything is fixed we check that the client is assigned and If not we'll
' force a new client install and since everything Else has now been fixed this new
' install should take care of any last client hang ups, If your client still does not
' function after this Then you need to reimage the computer because nothing Else is going to help
WSHShell.LogEvent EVENT_INFORMATION, now & " SMS STARTUP SCRIPT/CLIENT STATE= HEALTHY"
Else
' =============================================================================
' RunTasks
' Description: Run Client Stupid Healing Tasks
' =============================================================================
Debug("********** NOT Healthy last SMS ***********")
If do_CHK_AdvClient = True Then CHK_ADVCLIENT
If do_CHK_CACHESIZE = True Then CHK_CACHESIZE
If bClientExist = False Then
If do_SEND_CCR = True Then SEND_CCR
If do_RUN_CCMSetUP = True Then RUN_CCMSetUP
End If
If LogEnvironment = True Then
GetLogEnvironment
End If
'Added now to Next line - not sure If that works with Event_Warning
If logToEventsSummary=True Then WSHShell.LogEvent EVENT_WARNING, Now & vbCRLF & eventlog & vbCrLf & strEnvLog
End If
'Clean up
CleanUp(err)
'***********************************************************************************************
'***********************************************************************************************
'************* Start SMS Client SECTION
'***********************************************************************************************
'***********************************************************************************************
' =============================================================================
' Method: CHK_SMSVERSION
' Description: checks ccmexec file version, If no match latest version
' reinstall latest client
' =============================================================================
Sub CHK_SMSVERSION()
Dim objWMIServiceCLI,colCLIPropsList,colCLIProps
On ERROR Resume Next
COLLECTMSG "CHK_SMSVERSION","SMSVERSION_SITE",SMSVersion
Set objWMIServiceCLI = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & Computer & "\root\ccm")
If Err <> 0 Then
CLIENTSTATE = CLIENTSTATE + 1
StrERRType=StrERRType & "SMSVERSION_"
COLLECTMSG "CHK_SMSVERSION","ERROR","Cannot connect to \ROOT\CCM client may not exist"
bClientExist = False
Exit Sub
End If
Set colCLIPropsList = objWMIServiceCLI.ExecQuery("Select * from SMS_Client")
For Each colCLIProps In colCLIPropsList
COLLECTMSG "CHK_SMSVERSION","VERSION", colCLIProps.ClientVersion
oSmsversion=colCLIProps.ClientVersion
Debug("Client Version " & oSmsversion)
bClientExist = True
Next
End Sub
' =============================================================================
' Method: CHK_SMSUPDATECLIENT
' Description: checks SMS Client Version
' =============================================================================
Sub CHK_SMSUPDATECLIENT()
If oSmsversion < SMSVersion Then
CLIENTSTATUS=1
COLLECTMSG "CHK_SMSVERSION","UPDATE_SMSCLIENT","This system in not running the latest version SMS Client, reinstalling new client"
RUN_CCMSETUP
COLLECTMSG "CHK_SMSVERSION","UPDATE_SMSCLIENT","Completed"
End if
End Sub
'Sub CHK_SMSUPDATECLIENT()
'
' If oSmsversion < SMSVersion Then
' CLIENTSTATE = CLIENTSTATE + 1
' RegCounter "CHK_SMSUPDATECLIENT",1
' COLLECTMSG "CHK_SMSVERSION","UPDATE_SMSCLIENT","This system in not running the latest version SMS Client, reinstalling new client"
' If Do_RUN_CCMSetUP Then RUN_CCMSetUP
' ElseIf do_SEND_CCR = True Then SEND_CCR
' End If
' COLLECTMSG "CHK_SMSVERSION","UPDATE_SMSCLIENT","Completed"
' End If
'
'End Sub
' =============================================================================
' Method: CHK_AdvClient
' Description: Checks CHK_AdvClient components
' =============================================================================
Sub CHK_ADVCLIENT()
On ERROR Resume Next
COLLECTMSG "CHK_ADVCLIENT",">", Null
Dim oCPAppletMgr 'Control Applet manager object.
Dim oClientComponent 'Individual client components.
Dim oClientComponents 'A collection of client components.
'Get the Control Panel applet manager object.
Set oCPAppletMgr = CreateObject("CPApplet.CPAppletMgr")
If oCPAppletMgr Is Nothing Then
CLIENTSTATE = CLIENTSTATE + 1
RegCounter "CHK_ADVCLIENT",1
Debug("Cannot connect to CPApplet.CPAppletMgr")
StrERRType=StrERRType & "CPAppletMgr_"
Exit Sub
End If
'Get a collection of components.
Set oClientComponents = oCPAppletMgr.GetClientComponents
If oClientComponents Is Nothing Then
Set oCPAppletMgr = Nothing
Debug("No ADV Client Components")
CLIENTSTATE = CLIENTSTATE + 1
RegCounter "CHK_ADVCLIENT",1
StrERRType=StrERRType & "ADVCLIENT_"
Exit Sub
End If
For Each oClientComponent In oClientComponents
Debug(oClientComponent.DisplayName)
Select Case oClientComponent.State
Case 0
cmsg= "installed"
Case 1
cmsg= "enabled"
Case 2
cmsg= "disabled"
End Select
'If oClientComponent.DisplayName = "SMS Client Core Components" Then
'CLIENTSTATE = oClientComponent.State
'COLLECTMSG oClientComponent.DisplayName, oClientComponent.State, Null
'End If
DisplayName=oClientComponent.DisplayName
COLLECTMSG "CHK_ADVCLIENT",DisplayName,cmsg
Next
Set oClientComponents = Nothing
Set oCPAppletMgr = Nothing
If Err <> 0 Then COLLECTMSG "CHK_ADVCLIENT", "ERROR", Null
End Sub
' =============================================================================
' Method: CHK_ASSIGNMENT
' Description: Checks Client Site Assignment
' =============================================================================
Sub CHK_ASSIGNMENT
On ERROR Resume Next
Err.clear
COLLECTMSG "CHK_ASSIGNMENT",">",NULL
Dim oSMSClient
Set oSMSClient = CreateObject ("Microsoft.SMS.Client")
If err.Number<>0 Then
COLLECTMSG "CHK_ASSIGNMENT","ERROR", Err.description
COLLECTMSG "CHK_ASSIGNMENT","Could not create SMS Client Object - Quitting", Null
Else
If Len(oSMSClient.GetAssignedSite) = 0 Then
CLIENTSTATE = CLIENTSTATE + 1
RegCounter "CHK_ASSIGNMENT",1
'oSMSClient.SetAssignedSite("CRV")
'have the client determine from AD or SLP appropraite site code
oSMSClient.ReAssignSite
COLLECTMSG "CHK_ASSIGNMENT", "Error - Client not installed correctly - Setting AUTO", Null
StrERRType=StrERRType & "ASSIGNMENT_"
Else
COLLECTMSG "CHK_ASSIGNMENT",">", "Assigned Site = " & oSMSClient.GetAssignedSite
End If
End If
Set oSMSClient=Nothing
End Sub
' =============================================================================
' Method: CHK_CACHESIZE
' Description: Checks Client Cache Size
' =============================================================================
Sub CHK_CACHESIZE
On ERROR Resume Next
COLLECTMSG "CHK_CACHESIZE",">",NULL
Set oUIResManager = createobject("UIResource.UIResourceMgr")
If oUIResManager Is Nothing Then
CLIENTSTATE = CLIENTSTATE + 1
RegCounter "CHK_CACHESIZE",1
COLLECTMSG "CHK_CACHESIZE","ERROR", Err.description
COLLECTMSG "CHK_CACHESIZE","ERROR","Could not create Resource Manager - Quitting"
StrERRType=StrERRType & "UIResourceMgr_"
Exit Sub
End If
Set oCache=oUIResManager.GetCacheInfo()
If oCache Is Nothing Then
Set oUIResManager=Nothing
CLIENTSTATE = CLIENTSTATE + 1
RegCounter "CHK_CACHESIZE",1
COLLECTMSG "CHK_CACHESIZE","ERROR","Could not get cache info - Quitting"
StrERRType=StrERRType & "CACHESIZE_"
Exit Sub
End If
oCache.TotalSize=CacheSize
COLLECTMSG "CHK_CACHESIZE","CACHE SIZE", CacheSize
If Err <> 0 Then COLLECTMSG "CHK_CACHESIZE", "ERROR", Null
End Sub
' =============================================================================
' Method: SEND_CCR
' Description: Sends a CCR
' =============================================================================
Sub SEND_CCR()
COLLECTMSG "SEND_CCR",">", Null
CCRPathFile = "\\"& StrCCRServer& "\SMS_" & strCCRSiteCode & "\inboxes\CCR.BOX\" & Computer & ".CCR"
Set fsCCR = objFSO.CreateTextFile(CCRPathFile, True)
fsCCR.writeline ("[NT Client Configuration Request]")
fsCCR.writeline ("Machine Name=" & Computer)
fsCCR.Close
COLLECTMSG "SEND_CCR","SENT|" & CCRPathFile, Null
End Sub
' =============================================================================
' Method: RUN_CCMSetUP
' Description: Runs CCMSetUP to install SMS Client
' =============================================================================
Sub RUN_CCMSetUP()
On ERROR Resume Next
COLLECTMSG "RUN_CCMSetUP",">", Null
Set oWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & Computer & "\root\cimv2:Win32_Process")
result = oWMIService.Create(CCMSetUP & " SMSSITECODE=" & ASSIGNSITECODE & " SMSCACHESIZE=" & CacheSize & " DISABLECACHEOPT=TRUE DISABLESITEOPT=TRUE CCMHTTPPORT=" & PortNumber , Null, Null, intProcessID)
COLLECTMSG "RUN_CCMSetUP","Path | " & CCMSetUP, Null
COLLECTMSG "RUN_CCMSetUP","SMSSITECODE | " & ASSIGNSITECODE, Null
COLLECTMSG "RUN_CCMSetUP","SMSCACHESIZE | " & CacheSize, Null
COLLECTMSG "RUN_CCMSetUP","ProcessID | " & intProcessID, Null
COLLECTMSG "RUN_CCMSetUP","Result | " & result, Null
Set oWMIService = Nothing
If Err <> 0 Then COLLECTMSG "RUN_CCMSetUP", "ERROR", Null : CLIENTSTATE = CLIENTSTATE + 1 : RegCounter "RUN_CCMSetUP",1 : StrERRType=StrERRType & "RUN_CCMSetUP_"
End Sub
'***********************************************************************************************
'***********************************************************************************************
'************* End SMS Client SECTION
'***********************************************************************************************
'***********************************************************************************************
'************* Start WMI SECTION
'***********************************************************************************************
'***********************************************************************************************
' =============================================================================
' Method: REPAIR_WMI_XP
' =============================================================================
Sub REPAIR_WMI_XP()
On ERROR Resume Next
COLLECTMSG "REPAIR_WMI_XP",">", Null
REPAIR_WMI_REGISTER
If do_StartSeriviceViaSC Then StartSeriviceViaSC "winmgmt","auto"
COLLECTMSG "REPAIR_WMI_XP","CMD","rundll32 wbemupgd, UpgradeRepository"
wshshell.run "rundll32 wbemupgd, UpgradeRepository",0,1
StrERRType=StrERRType & "RepairWMI_"
'WriteEnvVar "SMSCLIENT_CHK_WMI_LAST","REPAIRED","system","1"
If Err <> 0 Then COLLECTMSG "REPAIR_WMI_XP","ERROR", Null
End Sub
' =============================================================================
' Method: REBUILD_WMI_BRUTE_FORCE
' Description: Rebuilds WMI repository
' =============================================================================
Sub REBUILD_WMI_BRUTE_FORCE()
On ERROR Resume Next
COLLECTMSG "REBUILD_WMI_BRUTE_FORCE",">", Null
REPAIR_WMI_REGISTER
StrERRType=StrERRType & "BruteWMI_"
wshshell.run "net stop winmgmt /y",0,1
WbemPath = windir & "\system32\wbem\Repository"
objFSO.MoveFolder WbemPath, WbemPath & "_Old"
'Repalced the following line with StartSeriviceViaSC sub (6 lines lower)
'wshshell.run "net start winmgmt",0,1
If do_StartSeriviceViaSC Then StartSeriviceViaSC "winmgmt","auto"
REPAIR_WMI_MOF
REPAIR_SMS_MOF
StrERRType=StrERRType & "RebuildWMI_"
COLLECTMSG "REBUILD_WMI_BRUTE_FORCE","Finished", Null
'WriteEnvVar "SMSCLIENT_CHK_WMI_LAST","REBUILT","system","1"
If Err <> 0 Then COLLECTMSG "REBUILD_WMI_BRUTE_FORCE","ERROR", Err.Description
End Sub
' =============================================================================
' Method: REPAIR_WMI_REGISTER
' Description: Re-register WMI components
' =============================================================================
Sub REPAIR_WMI_REGISTER()
On ERROR Resume Next
COLLECTMSG "REGISTER_WMI",">", Null
'ClearADAP
wshshell.run windir &"\system32\wbem\winmgmt.exe /CLEARADAP"
'ReSynchPref
wshshell.run windir &"\system32\wbem\winmgmt.exe /RESYNCPERF"
Set objFolder = objFSO.GetFolder(windir &"\system32\wbem")
Set colFiles = objFolder.Files
For Each objFile in colFiles
If InStr(objFile.Name,".dll") Then
wshshell.run "RegSvr32 /s " & objFile.Path,0,1
End If
If InStr(objFile.Name,".exe") Then
If InStr(objFile.Name,"wbemtest.exe") Then
Else
wshshell.run objFile.Path & " /RegServer",0,1
End If
End If
COLLECTMSG "REGISTER_WMI",objFile.Path, Null
Next
COLLECTMSG "REGISTER_WMI","Finished", Null
If Err <> 0 Then COLLECTMSG "REGISTER_WMI", "ERROR", Null : StrERRType=StrERRType & "REGISTER_WMI_"
End Sub
' =============================================================================
' Method: REPAIR_WMI_MOF
' Description: MofComp WMI MOF's
' =============================================================================
Sub REPAIR_WMI_MOF()
On ERROR Resume Next
COLLECTMSG "REPAIR_WMI_MOF",">", Null
Set objFolder = objFSO.GetFolder(windir &"\system32\wbem")
Set colFiles = objFolder.Files
For Each objFile in colFiles
If InStr(objFile.Name,".mof") Then
wshshell.run "mofcomp " & objFile.Path,0,1
End If
If InStr(objFile.Name,".mfl") Then
wshshell.run "mofcomp " & objFile.Path,0,1
End If
COLLECTMSG "REPAIR_WMI_MOF",objFile.Path, Null
Next
COLLECTMSG "REPAIR_WMI_MOF","Finished", Null
If Err <> 0 Then COLLECTMSG "REPAIR_WMI_MOF", "ERROR", Null : StrERRType=StrERRType & "REPAIR_WMI_MOF_"
End Sub
' =============================================================================
' Method: REPAIR_SMS_MOF
' Description: MofComp SMS MOF's
' =============================================================================
Sub REPAIR_SMS_MOF()
On ERROR Resume Next
COLLECTMSG "REPAIR_SMS_MOF",">", Null
Set objFolder = objFSO.GetFolder(windir &"\system32\ccm")
Set colFiles = objFolder.Files
For Each objFile in colFiles
If InStr(objFile.Name,".mof") Then
wshshell.run "mofcomp " & objFile.Path,0,1
End If
If InStr(objFile.Name,".mfl") Then
wshshell.run "mofcomp " & objFile.Path,0,1
End If
COLLECTMSG "REPAIR_SMS_MOF",objFile.Path, Null
Next
COLLECTMSG "REPAIR_SMS_MOF","Finished", Null
If Err <> 0 Then COLLECTMSG "REPAIR_SMS_MOF", "ERROR", Null : StrERRType=StrERRType & "REPAIR_SMS_MOF_"
End Sub
'***********************************************************************************************
'***********************************************************************************************
'************* END WMI SECTION
'***********************************************************************************************
'***********************************************************************************************
' =============================================================================
' Method: REG_XML
' Description: Re-Registers XML DLL
' =============================================================================
Sub REG_XML()
On ERROR Resume Next
COLLECTMSG "REG_XML",">" , Null
'// Register XML
XMLREG = windir & "\system32\regsvr32.exe /s " & windir & "\system32\msxml3.dll"
COLLECTMSG "REG_XML","CMD | " & XMLREG, Null
Set oWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & Computer & "\root\cimv2:Win32_Process")
result = oWMIService.Create(XMLREG, Null, Null, intProcessID)
If Err <> 0 Then COLLECTMSG "REG_XML", "ERROR", Null : CLIENTSTATE = CLIENTSTATE + 1 : RegCounter "REG_XML",1 : StrERRType=StrERRType & "REGXML_"
COLLECTMSG "REG_XML","ProcessID | " & intProcessID, Null
COLLECTMSG "REG_XML","Result | " & result, Null
End Sub
' =============================================================================
' Method: REG_Msiexec
' Description: Re-Registers msiexec
' =============================================================================
Sub REG_Msiexec()
On ERROR Resume Next
COLLECTMSG "REG_Msiexec",">" , Null
'// Register XML
XMLREG = windir & "\system32\msiexec.exe /regserver"
COLLECTMSG "REG_Msiexec","CMD | " & XMLREG, Null
Set oWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & Computer & "\root\cimv2:Win32_Process")
result = oWMIService.Create(XMLREG, Null, Null, intProcessID)
If Err <> 0 Then COLLECTMSG "REG_Msiexec", "ERROR", Null : CLIENTSTATE = CLIENTSTATE + 1 : RegCounter "REG_Msiexec",1 : StrERRType=StrERRType & "REGMsiexec_"
COLLECTMSG "REG_Msiexec","ProcessID | " & intProcessID, Null
COLLECTMSG "REG_Msiexec","Result | " & result, Null
End Sub
' =============================================================================
' Method: REG_SVR32
' Description: Re-Registers DLLs
' =============================================================================
Sub REG_SVR32(nCHK, nFile)
On ERROR Resume Next
COLLECTMSG nCHK,">" , Null
'// Register XML
REGsvr = windir & "\system32\regsvr32.exe /s " & windir & "\system32\" & nFile
COLLECTMSG nCHK,"CMD | " & REGsvr, Null
Set oWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & Computer & "\root\cimv2:Win32_Process")
result = oWMIService.Create(REGsvr, Null, Null, intProcessID)
If Err <> 0 Then COLLECTMSG nCHK, "ERROR", Null : CLIENTSTATE = CLIENTSTATE + 1 : RegCounter nCHK,1 : StrERRType=StrERRType & "RegServ32_"
COLLECTMSG nCHK,"ProcessID | " & intProcessID, Null
COLLECTMSG nCHK,"Result | " & result, Null
End Sub
' =============================================================================
' Method: CHK_DCOM
' Description: Sets DCOM sercurity premissions
' =============================================================================
Sub CHK_DCOM()
COLLECTMSG "CHK_DCOM",">" , Null
'// Sets DCOM
If wshshell.regRead("HKLM\SOFTWARE\Microsoft\Ole\EnableDCOM") <> "Y" Then
COLLECTMSG "CHK_DCOM", "ERROR", "EnableDCOM | write reg Y"
wshshell.RegWrite "HKLM\SOFTWARE\Microsoft\Ole\EnableDCOM","Y","REG_SZ"
CLIENTSTATE = CLIENTSTATE + 1
RegCounter "CHK_DCOM",1
StrERRType=StrERRType & "DCOME_"
End If
If wshshell.regRead("HKLM\SOFTWARE\Microsoft\Ole\EnableRemoteConnect") <> "Y" Then
COLLECTMSG "CHK_DCOM", "ERROR", "EnableRemoteConnect | write reg Y"
wshshell.RegWrite "HKLM\SOFTWARE\Microsoft\Ole\EnableRemoteConnect","Y","REG_SZ"
CLIENTSTATE = CLIENTSTATE + 1
RegCounter "CHK_DCOM",1
StrERRType=StrERRType & "DCOMERC_"
End If
If wshshell.regRead("HKLM\SOFTWARE\Microsoft\Ole\LegacyAuthenticationLevel") <> "2" Then
COLLECTMSG "CHK_DCOM", "ERROR", "LegacyAuthenticationLevel | write reg 2"
wshshell.RegWrite "HKLM\SOFTWARE\Microsoft\Ole\LegacyAuthenticationLevel","0x00000002","REG_DWORD"
CLIENTSTATE = CLIENTSTATE + 1
RegCounter "CHK_DCOM",1
StrERRType=StrERRType & "DCOMLAL_"
End If
If wshshell.regRead("HKLM\SOFTWARE\Microsoft\Ole\LegacyImpersonationLevel") <> "2" Then
COLLECTMSG "CHK_DCOM", "ERROR", "LegacyImpersonationLevel | write reg 2"
wshshell.RegWrite "HKLM\SOFTWARE\Microsoft\Ole\LegacyImpersonationLevel","0x00000002","REG_DWORD"
CLIENTSTATE = CLIENTSTATE + 1
RegCounter "CHK_DCOM",1
StrERRType=StrERRType & "DCOMLIL_"
End If
'Orginal Code
'wshshell.run ("REG ADD HKLM\SOFTWARE\Microsoft\Ole /v EnableDCOM /t REG_SZ /d Y /f",0,1)
'wshshell.run ("REG ADD HKLM\SOFTWARE\Microsoft\Ole /v EnableRemoteConnect /t REG_SZ /d Y /f",0,1)
'wshshell.run ("REG ADD HKLM\SOFTWARE\Microsoft\Ole /v LegacyAuthenticationLevel /t REG_DWORD /d 0x00000002 /f",0,1)
'wshshell.run ("REG ADD HKLM\SOFTWARE\Microsoft\Ole /v LegacyImpersonationLevel /t REG_DWORD /d 0x00000002 /f",0,1)
End Sub
' =============================================================================
' Method: Fix_Service
' Description: Checks the status of a service
' =============================================================================
Function Fix_Service(nCHK, nService,nMode,nStatus)
On ERROR Resume Next
'Variable to identify when a service is missing
' Example Bits is not installed
Dim bServiceFound: bServiceFound = False
COLLECTMSG nCHK,">", Null
err.clear
Set colServiceList = objWMIService.ExecQuery _
("Select * from Win32_Service where Name = '" & nService &"'")
If Err<>0 Then
COLLECTMSG "Fix_Service","ERROR execQuery",err & " " & err.description
Debug("Err = " & err & " " & err.description)
If nMode = "NotDisabled" Then nMode = "Manual"
If do_StartSeriviceViaSC Then StartSeriviceViaSC nService, nMode
End If
err.clear
For Each objService In colServiceList
'Found a service
'Debug("objService Name = " & objService.name)
'Debug("objService Caption = " & objService.Caption)
bServiceFound = True
'COLLECTMSG nCHK,"Mode | " & objService.StartMode, Null
'COLLECTMSG nCHK,"Status | " & objService.State, Null
'Added this check in for services that mode matters but not status
'If the status is unimportant then ignore the tests below
If nStatus = "unimportant" Then
tempStatus = objService.State
Else
tempStatus = nStatus
End If
'Debug("tempStatus = " & tempStatus)
'Added this check in for services that mode doesn't matter as long as it is not disabled
'Example being BITS
Debug("nMode = " & nMode)
If nMode = "NotDisabled" Then
If objService.StartMode <> "disabled" Then
tempMode = objService.StartMode
'Debug("1 tempMode = " & tempMode)
Else
'Service is set to disabled. Change to manual to allow it to start
tempMode = "Manual"
'Debug("2 tempMode = " & tempMode)
End If
Else
'Service is setting to some value
tempMode = nMode
'Debug("3 tempMode = " & tempMode)
End If
If LCase(objService.StartMode) <> LCase(tempMode) Or LCase(objService.State) <> LCase(tempStatus) Then
'Debug(objService.StartMode & " <> " & nMode)
'Debug(objService.State & " <> " & tempStatus)
CLIENTSTATE = CLIENTSTATE + 1
RegCounter nCHK,1
COLLECTMSG nCHK, "ERROR","Current StartMode " & objService.StartMode
COLLECTMSG nCHK, "ERROR","Current State " & objService.State
COLLECTMSG nCHK, "ERROR","Changing StartMode to " & tempMode
err.clear
errReturnCode = 0
If tempMode = "auto" Then tempMode = "automatic"
errReturnCode = objService.ChangeStartMode(tempMode)
If errReturnCode <> 0 Then
'More detail here
' http://msdn.microsoft.com/en-us/library/aa384896(VS.85).aspx
Debug("err = " & err & " " & err.description & " return code = " & errReturnCode)
COLLECTMSG nCHK,"ChangedStartMode",errReturnCode
COLLECTMSG nCHK, "ERROR","Failed to Change StartMode | " & tempMode
CLIENTSTATE = CLIENTSTATE + 1
If do_StartSeriviceViaSC Then StartSeriviceViaSC nService, tempMode
End If
err.clear
If (tempStatus = "Running") And objService.State <> nStatus Then
CLIENTSTATE = CLIENTSTATE + 1
RegCounter nCHK,1
err.clear
errReturnCode = objService.startservice
If errReturnCode <> 0 Then
Debug("err= " & err & " RC= " & errReturnCode & " " & err.description)
COLLECTMSG nCHK, "ERROR","Failed to Startservice | " & tempMode
CLIENTSTATE = CLIENTSTATE + 1
If do_StartSeriviceViaSC Then StartSeriviceViaSC nService, tempMode
End If
COLLECTMSG nCHK, "Info","Startservice | "& errReturnCode
End If
StrERRType=StrERRType & nService & "_"
End If
Next
If bServiceFound=False Then
COLLECTMSG nCHK,"ERROR", nService & " | Found | FALSE" : CLIENTSTATE = CLIENTSTATE + 1 : RegCounter nCHK,1
StrERRType=StrERRType & "NO" & nService & "_"
End If
Fix_Service = bServiceFound
If Err <> 0 Then COLLECTMSG nCHK, "ERROR", null : CLIENTSTATE = CLIENTSTATE + 1 : RegCounter nCHK,1
End Function
' =============================================================================
' Method: CHK_SYSTEMPATH
' Description: checks that wbem is near the front of the sys path and cleans
' any duplicate statements from the path environment
' =============================================================================
Sub CHK_SYSTEMPATH()
WindirPath = LCase(windir)
System32path = LCase(windir & "\system32")
WBEMpath = LCase(windir & "\system32\wbem")
WindirPathFound = False
System32pathFound = False
WBEMpathFound = False
SystemRoot = False
strKeyNamePath = "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"
strValueName = "Path"
'// GET PATH STATEMENT
strValue = wshshell.regRead("HKLM\" & strKeyNamePath & "\" & strValueName)
strValue = LCase(strValue)
ARRpath = Split(LCase(strValue), ";")
For i = 0 To UBound(ARRpath)
'Repalce SystemRoot with actual value
If InStr(ARRpath(i), LCase("%systemroot%")) <> 0 Then
strValue = Replace(strValue, LCase("%systemroot%"), LCase(windir))
SystemRoot = True
COLLECTMSG "CHK_SYSTEMPATH","Warning","Replaced %systemroot% " & SystemRoot
End If
If ARRpath(i) = WindirPath Then WindirPathFound = True
If ARRpath(i) = System32path Then System32pathFound = True
If ARRpath(i) = WBEMpath Then WBEMpathFound = True
Next
If (WBEMpathFound = True) And (System32pathFound = True) And (WindirPathFound = True) And (SystemRoot = False) Then COLLECTMSG "CHK_SYSTEMPATH","All Paths Found",WBEMpathFound: Exit Sub
COLLECTMSG "CHK_SYSTEMPATH","PATH",strValue
'// Log the results
logit=False
If WBEMpathFound = False Then strValue = WBEMpath & ";" & strValue : COLLECTMSG "CHK_SYSTEMPATH","ERROR","WBEMpathFound " & WBEMpathFound:logit=True : CLIENTSTATE = CLIENTSTATE + 1
If WindirPathFound = False Then strValue = WindirPath & ";" & strValue : COLLECTMSG "CHK_SYSTEMPATH","ERROR", "WindirPathFound " & WindirPathFound :logit=True : CLIENTSTATE = CLIENTSTATE + 1
If System32pathFound = False Then strValue = System32path & ";" & strValue : COLLECTMSG "CHK_SYSTEMPATH","ERROR", "System32pathFound " & System32pathFound:logit=True : CLIENTSTATE = CLIENTSTATE + 1
If logit = True Then StrERRType = StrERRType & "SYSTEMPATH_"
'//Take out duplicates
'Dictionary Object is Much faster
ARRpath = Split(LCase(strValue), ";")
Set PureString = CreateObject("Scripting.Dictionary")
For i = 0 To UBound(ARRpath)
If Not PureString.Exists(ARRpath(i)) Then PureString.Add ARRpath(i), ARRpath(i) : Debug(ARRpath(i))
Next
strValues = ""
For Each strKeyName in PureString.Keys
strValues = strValues & strKeyName & ";"
Next
Set PureString = Nothing
'Remove duplicate semicolons
If InStr(strValues, ";;") <> 0 Then strValues = Replace(Replace(strValues, ";;", ";"), ";;", ";")
'Remove trailing semicolons
ln = Len(strValues)
If InStr(ln, strValues, ";") <> 0 Then strValues = Left(strValues, ln - 1)
'// Set PATH STATEMENT
'Set to current runtime path
Set oEnv = WshShell.Environment("System")
oEnv("Path")=strValues
Set oEnv = Nothing
'Set to Registry for next restart
wshshell.regwrite "HKLM\" & strKeyNamePath & "\" & strValueName,strValues,"REG_SZ"
RegCounter "CHK_SYSTEMPATH",1
COLLECTMSG "CHK_SYSTEMPATH","PATH_CLEAN", strValues
End Sub
' =============================================================================
' Method: CHK_SMSLOCALADMIN
' Description: Adds your SMS Admin Account to the local admininstrators group
' =============================================================================
Sub CHK_SMSLOCALADMIN()
COLLECTMSG "CHK_SMSLOCALADMIN",">", Null
On ERROR Resume Next
'>>> Add SMS ADMIN to Local Administrator group
If InStr(admACCT, "\") <> 0 Then admACCT = replace(admACCT, "\", "/")
Set objGroup = GetObject("WinNT://" & Computer & "/" & LocalAdminGroup & ",group")
If Not objGroup.IsMember("WinNT://" & admACCT) Then
CLIENTSTATE = CLIENTSTATE + 1
RegCounter "CHK_SMSLOCALADMIN",1
'Change slash to allow adding
objGroup.Add ("WinNT://"& admACCT)
COLLECTMSG "CHK_SMSLOCALADMIN", "Added", Null
StrERRType=StrERRType & "LocalAdmin_"
Else
COLLECTMSG "CHK_SMSLOCALADMIN", "True" , Null
End If
If Err <> 0 Then COLLECTMSG "CHK_SMSLOCALADMIN","ERROR", Err & Err.Description
End Sub
' =============================================================================
' Method: CHK_ADMSHARE
' Description: Checks ADMIN SHARES ACCESS
'Value Data: (0 = disable shares, 1 = enable)
' =============================================================================
Sub CHK_ADMSHARE()
admShareFound = False
Set colshares = objWMIService.ExecQuery("Select * from Win32_Share where Name = 'ADMIN$'")
For Each objShare In colshares
admShareFound = True
COLLECTMSG "CHK_ADMSHARE", "FOUND",admShareFound
Next
If admShareFound = False Then
CLIENTSTATE = CLIENTSTATE + 1
RegCounter "CHK_ADMSHARE",1
StrERRType=StrERRType & "ADMSHARE_"
COLLECTMSG "CHK_ADMSHARE","FOUND",admShareFound
Set oReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & _
Computer & "\root\default:StdRegProv")
strKeyNamePath = "SYSTEM\CurrentControlSet\Services\LanManServer\Parameters"
'strValueNameSRV = "AutoShareServer" ' for servers
strValueNameWS = "AutoShareWks" ' for workstations
oReg.SetDWORDValue HKeyName_LOCAL_MACHINE, strKeyNamePath, strValueNameWS, 1
COLLECTMSG "CHK_ADMSHARE", "FIXED", Null
End If
End Sub
' =============================================================================
' HELPERS
' =============================================================================
' =============================================================================
' Method: GetSystemRole
' Description: Checks System role
' Disabled as this check requires WMI and reporting of this info is before WMI check
' =============================================================================
Function GetSystemRole()
On ERROR Resume Next
COLLECTMSG "GetSystemRole",">", Null
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & Computer & "\root\cimv2")
Set colComputers = objWMIService.ExecQuery _
("Select DomainRole from Win32_ComputerSystem")
For Each objComputer In colComputers
Select Case objComputer.DomainRole
Case 0
strComputerRole = "Standalone Workstation"
Case 1
strComputerRole = "Member Workstation"
Case 2
strComputerRole = "Standalone Server"
Case 3
strComputerRole = "Member Server"
Case 4
strComputerRole = "Backup Domain Controller"
Case 5
strComputerRole = "Primary Domain Controller"
End Select
GetSystemRole=objComputer.DomainRole
COLLECTMSG "GetSystemRole","System Role", GetSystemRole
Next
End Function
' =============================================================================
' Determines OS by reading reg val & comparing to known values
' OS version number returned as number of type double:
' Windows Vista: 6
' Windows 2k: 5
' Windows XP: 5.1
' Windows Server 2003: 5.2
' Windows x: >5.2
'
' =============================================================================
Sub GetOs()
On ERROR Resume Next
COLLECTMSG "GetOs",">", Null
Err.clear
sOStype = WSHShell.RegRead("HKLM\SYSTEM\CurrentControlSet\Control\ProductOptions\ProductType")
sOSversion = WSHShell.RegRead("HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\CurrentVersion")
sOSType = Trim(sOSversion)
If Err <> 0 Then
CLIENTSTATE = CLIENTSTATE + 1
GetOsVersionNumber = "Unknown NTx"
' Could not determine NT version
Exit Sub ' >>>
End If
Select Case sOSversion
Case 6.1
Os = "Windows 7"
isOS="workstation"
Exit Sub
Case 6
Os = "Vista"
isOS="workstation"
Exit Sub
Case 5
Os= "2000"
isOS="workstation"
Case 5.1
Os = "XP"
isOS="workstation"
Exit Sub
Case 5.2
Os = "2003"
isOS="server"
WSHShell.LogEvent EVENT_INFORMATION, "SMS STARTUP SCRIPT - Do not run on servers@ " & Now
COLLECTMSG "GetOs","ERROR", "Server OS Quiting"
CleanUp(err)
Exit Sub
End Select
If IsOS ="workstation" And sOStype="WinNT" Then IsOS ="workstation" Else IsOS ="server"
If Os= "2000" And sOStype="WinNT" Then IsOS ="workstation" Else IsOS ="server"
End Sub
' =============================================================================
' Method: StrDateTime
' Description: Converts WMI TIME tokens
' Not USED
' =============================================================================
Function StrDateTime(d)
Dim strDate
Dim strTime
Dim strVal
strVal = CStr(d)
strDate = DateSerial(Left(strVal, 4), _
Mid(strVal, 5, 2), _
Mid(strVal, 7, 2))
strTime = TimeSerial(Mid(strVal, 9, 2), _
Mid(strVal, 11, 2), _
Mid(strVal, 13, 2))
StrDateTime = strDate + strTime
End Function
' =============================================================================
' Method: Set_LogFolder
' Description: Sets the logginf folder path
' =============================================================================
Sub Set_LOGFOLDER()
On ERROR Resume Next
If LogGood=True And ClientState=0 Then
LogPath = GoodLogPath
If objFSO.FolderExists(GoodLogPath) Then
Set objFolder = objFSO.GetFolder(LogPath)
Else
Set objFolder = objFSO.CreateFolder(LogPath)
End If
LogPath = GoodLogPath & "\" & StrERRType & computer & ".log"
COLLECTMSG "Set_LOGFOLDER","ClientState = " & ClientState,"LogPath = " & LogPath
Err.clear
objFSO.CopyFile strLogFile , LogPath , OverwriteExisting
If Err<>0 Then COLLECTMSG "Set_LOGFOLDER","ERROR","Write Log Folder File " & err & " " & err.description
ElseIf LogBad=True And ClientState<>0 Then
LogPath = BadLogPath
If objFSO.FolderExists(BadLogPath) Then
Set objFolder = objFSO.GetFolder(LogPath)
Else
Set objFolder = objFSO.CreateFolder(LogPath)
End If
LogPath = BadLogPath & "\" & StrERRType & computer & ".log"
COLLECTMSG "Set_LOGFOLDER","ClientState = " & ClientState,"LogPath = " & LogPath
Err.clear
objFSO.CopyFile strLogFile , LogPath , OverwriteExisting
If Err<>0 Then COLLECTMSG "Set_LOGFOLDER","ERROR","Write Log Folder File " & err & " " & err.description
Else
COLLECTMSG "Set_LOGFOLDER","No Criteria Matched for Log Forwarding","ClientState = " & ClientState & " LogGood = " & LogGood & " LogBad = " & LogBad
End If
End Sub
' =============================================================================
' Method: COLLECTMSG
' Description: Collections Errors for logging to log file
' =============================================================================
Sub COLLECTMSG(Section,KeyName,value)
On ERROR Resume Next
Dim f
Const ForReading = 1, ForWriting = 2, ForAppending = 8
Set f = objFSO.OpenTextFile(strLogFile, ForAppending, True)
strmsg = now & " | " & Section & " | " & KeyName & " | "& value
If Err <> 0 Then
strmsg=strmsg & vbCrLf _
& "ERROR COLLECTMSG | " & Hex(Err.Number) & " h (" & CStr(Err.Number) & ") | Description |" & Err.Description
End If
eventlog=eventlog & strmsg & vbCrLf
f.Writeline strmsg
VerboseCHK(strmsg)
f.Close
strmsg=""
Err.Clear
End Sub
' =============================================================================
' Method: ReadEnvVar
' Description: Read Environment Variables
' =============================================================================
Function ReadEnvVar(envField,envType)
On ERROR Resume Next
Select Case envType
Case "system"
Set oEnv = WshShell.Environment("System")
Case "user"
Set oEnv = WshShell.Environment("User")
Case "volatile"
Set oEnv = WshShell.Environment("Volatile")
Case "process"
Set oEnv = WshShell.Environment("Process")
End Select
ReadEnvVar = oEnv(envField)
End Function
' =============================================================================
' Method: WriteEnvVar
' Description: WMI Write Environment Variables
' =============================================================================
Sub WriteEnvVar(envField,envValue,envType,envAddDel)
'Example Call
'WriteEnvVar "StartWMIbyADSI","Started","system","1"
On ERROR Resume Next
Select Case envType
Case "system"
Set oEnv = WshShell.Environment("System")
Case "user"
Set oEnv = WshShell.Environment("User")
Case "volatile"
Set oEnv = WshShell.Environment("Volatile")
Case "process"
Set oEnv = WshShell.Environment("Process")
End Select
' add a var
If envAddDel=1 Then oEnv(envField) = envValue
' remove a var
If envAddDel=0 Then oEnv.Remove envField
End Sub
' =============================================================================
' Method: GetLogEnvironment
' Description: Get Logs Environments
' =============================================================================
Sub GetLogEnvironment()
Dim f
Const ForReading = 1, ForWriting = 2, ForAppending = 8
Set f = objFSO.OpenTextFile(strLogFile, ForAppending, True)
'// List all vars in all environment types
'//System Type
Set oEnv = WshShell.Environment("System")
For Each sItem In oEnv
strEnvVal = strEnvVal & sItem & vbCrLf
Next
strEnvLog = strEnvLog & "[SystemEnvironment]" & vbCrLf & strEnvVal & vbCrLf
strEnvVal = ""
'//Process Type
Set oEnv = WshShell.Environment("Process")
For Each sItem In oEnv
strEnvVal = strEnvVal & sItem & vbCrLf
Next
strEnvLog = strEnvLog & "[ProcessEnvironment]" & vbCrLf & strEnvVal & vbCrLf
strEnvVal = ""
'//User Type
Set oEnv = WshShell.Environment("User")
For Each sItem In oEnv
strEnvVal = strEnvVal & sItem & vbCrLf
Next
strEnvLog = strEnvLog & "[UserEnvironment]" & vbCrLf & strEnvVal & vbCrLf
strEnvVal = ""
'//Volatile Type
Set oEnv = WshShell.Environment("Volatile")
For Each sItem In oEnv
strEnvVal = strEnvVal & sItem & vbCrLf
Next
strEnvLog= strEnvLog & "[VolatileEnvironment]" & vbCrLf & strEnvVal & vbCrLf
strEnvVal = ""
Set oEnv = Nothing
f.Writeline strEnvLog
f.Close
Err.Clear
End Sub
' =============================================================================
' Method: StartWMIbyADSI
' =============================================================================
Sub StartWMIbyADSI()
On ERROR Resume Next
COLLECTMSG "StartWMIbyADSI","ADSI","Start the service"
' define a constant for stopped services
' define ADSI status constants
Const ADS_SERVICE_STOPPED = 1
Const ADS_SERVICE_START_PENDING = 2
Const ADS_SERVICE_STOP_PENDING = 3
Const ADS_SERVICE_RUNNING = 4
Const ADS_SERVICE_CONTINUE_PENDING = 5
Const ADS_SERVICE_PAUSE_PENDING = 6
Const ADS_SERVICE_PAUSED = 7
Const ADS_SERVICE_ERROR = 8
' get an ADSI object for a computer
Set objComputer = GetObject("WinNT://" & COMPUTER & ",computer")
' get an object for a service
Set objService = objComputer.GetObject("Service","winmgmt")
' check to see if the service is stopped
If (objService.Status = ADS_SERVICE_STOPPED) Then
' if the service is stopped, then start it
objService.Start
If Err.number<>0 Then 'Exit sub
'Start Failed
RegCounter "StartWMIbyADSI",1
wshshell.run SCEXELocation & " config winmgmt start= auto",0,1
wshshell.run SCEXELocation & " start winmgmt",0,1
CleanUp(err)
End If
While objService.Status <> ADS_SERVICE_RUNNING: Wend
End If
StrERRType=StrERRType & "StartWMIADSI_"
'WriteEnvVar "StartWMIbyADSI","Started","system","1"
If Err <> 0 Then COLLECTMSG "StartWMIbyADSI","ERROR",Err & " " & Err.Description
End Sub
' =============================================================================
' Method: StartSeriviceViaSC
' =============================================================================
Sub StartSeriviceViaSC(ServiceName, nMode)
On ERROR Resume Next
Debug("ServiceName = " & ServiceName)
Debug("nMode = " & nMode)
COLLECTMSG "StartSeriviceViaSC","ERROR",ServiceName & " Service not running"
COLLECTMSG "StartSeriviceViaSC","INFO","Attempting to start via sc.exe"
errreturn = 0
Debug("Set " & ServiceName & " to " & nMode & " = " & SCEXELocation & " config " & ServiceName & " start= " & LCase(nMode))
errreturn = wshshell.run(SCEXELocation & " config " & ServiceName & " start= " & LCase(nMode),0,1)
Debug("errreturn = " & errreturn)
If errreturn <> 0 Then
Debug("Errored out in " & ServiceName & " during StartSeriviceViaSC")
RegCounter "StartSeriviceViaSC",1
COLLECTMSG "StartSeriviceViaSC","ERROR","sub was unable to set service " & ServiceName & " to zero"
StrERRType=StrERRType & "Start" & ServiceName & "SC_"
Exit Sub
End If
Debug(LCase(nMode) & " = auto")
If LCase(nMode) = "auto" Then
errreturn = 0
errreturn = wshshell.run(SCEXELocation & " start " & ServiceName,0,1)
Debug("errreturn = " & errreturn)
If errreturn <> 0 Then
RegCounter "StartSeriviceViaSC",1
Debug("ErrReturn = " & errreturn)
COLLECTMSG "StartSeriviceViaSC","ERROR","sub was unable to start service" & ServiceName
StrERRType=StrERRType & "Start" & ServiceName & "SC_"
Exit Sub
Else
Debug("Successfully Started " & ServiceName)
'Debug("Sleeping 500")
'WSHShell.sleep(500)
End If
End If
COLLECTMSG "StartSeriviceViaSC","INFO","Service is set to " & nMode
'WriteEnvVar "StartSeriviceViaSC","Started","system","1"
If Err <> 0 Then COLLECTMSG "StartSeriviceViaSC","ERROR", Err & " " & Err.Description : StrERRType=StrERRType & "Start" & ServiceName & "SC_"
End Sub
' =============================================================================
' Method: RegCounter subprocedure
' Descriptoin: Takes the value from a KeyName and adds in the number
' =============================================================================
Sub RegCounter(KeyName, Number)
On ERROR Resume Next
COLLECTMSG "RegCounter",">", KeyName
CurrentKeyName = WSHShell.Regread(RegPath & "\" & KeyName)
Debug("Orginal CurrentKeyName = " & CurrentKeyName)
If LCase(KeyName) <> LCase("WMIStatus") Then Number = CurrentKeyName + Number
Debug("New Number = " & Number)
'Write new value
WSHSHell.RegWrite RegPath & "\" & KeyName, Number, "REG_SZ"
'Write Time Stamp
WSHSHell.RegWrite RegPath & "\" & KeyName & "_TIME", Now(), "REG_SZ"
End Sub
' =============================================================================
' Method: WebSubmit
' Description: WebPage submit to SQL function Version 2... no outside requirements
' =============================================================================
Function WebSubmit(StatusWeb)
Dim strWebAddress, strPost, strRequest
COLLECTMSG "WebSubmit",">", Null
Dim oHTTP, HTTPPost
On ERROR Resume Next
' Gather Info
strWebAddress = "http://<FQDN>/clienthealth/default.asp"
'Debug(strWebAddress)
If Len(StrERRType) = 0 Then StrERRType = "None"
strPost = "Cname=" & Computer & "&LogFile=" & strUNCLogFile & "&ErrType=" & StrERRType & "&Status=" & StatusWeb
COLLECTMSG "WebSubmit","Post", strPost
strRequest = strWebAddress & " " & strPost
'Debug(strRequest)
'Submit Info
Set oHTTP = CreateObject("Microsoft.XMLHTTP")
oHTTP.open "POST", strWebAddress, false
oHTTP.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
oHTTP.setRequestHeader "Content-Length", Len(strRequest)
oHTTP.send strPost
WebSubmit = oHTTP.responseText
COLLECTMSG "WebSubmit","Sent", Null
'Debug(WebSubmit)
Set oHTTP = Nothing
End Function
' =============================================================================
' Method: ShowFileAccessInfo
' Description: Get Last File Access Info
' =============================================================================
Function ShowFileAccessInfo(filespec)
On ERROR Resume Next
COLLECTMSG "ShowFileAccessInfo",">", Null
If objFSO.FileExists(filespec) Then
Set f = objFSO.GetFile(filespec)
filespec_date = f.DateLastModified
FSpace = Instr(filespec_date," ") - 1
ShowFileAccessInfo = Left(filespec_date,FSpace)
COLLECTMSG "ShowFileAccessInfo",filespec & " file date", ShowFileAccessInfo
Else
'File is missing
COLLECTMSG "ShowFileAccessInfo","ERROR", "No Log file to check " & filespec
End If
End Function
' =============================================================================
' Method: SCFileExist
' Description: Does a file exist?
' =============================================================================
Sub SCFileExist()
On ERROR Resume Next
COLLECTMSG "SCFileExist",">", Null
If objFSO.FileExists(strCurrentDir & "\sc.exe") Then
SCEXELocation = strCurrentDir & "\sc.exe"
do_StartSeriviceViaSC = True
COLLECTMSG "SCFileExist",SCEXELocation,do_StartSeriviceViaSC
ElseIf objFSO.FileExists(windir & "\system32\sc.exe") Then
'Disabled due to user requests
'CLIENTSTATE = CLIENTSTATE + 1
'RegCounter "SCFileExist",1
SCEXELocation = windir & "\system32\sc.exe"
do_StartSeriviceViaSC = True
COLLECTMSG "SCFileExist",SCEXELocation,do_StartSeriviceViaSC
ElseIf objFSO.FileExists(windir & "\system32\dllcache\sc.exe") Then
'Disabled due to user requests
'CLIENTSTATE = CLIENTSTATE + 1
'RegCounter "SCFileExist",1
SCEXELocation = windir & "\system32\dllcache\sc.exe"
do_StartSeriviceViaSC = True
COLLECTMSG "SCFileExist",SCEXELocation,do_StartSeriviceViaSC
Else
'Only ERROR
CLIENTSTATE = CLIENTSTATE + 1
RegCounter "SCFileExist",1
'SC.exe does not exist, do not run service start
do_StartSeriviceViaSC = False
COLLECTMSG "SCFileExist","ERROR","No sc.exe " & do_StartSeriviceViaSC
End If
End Sub
' =============================================================================
' Method: CheckLogFileModifyDate
' Description: SMS Logs recently updated
' =============================================================================
Sub CheckLogFileModifyDate(LogToCheck)
On ERROR Resume Next
COLLECTMSG "CheckLogFileModifyDate",">", Null
strSMSPolEval = windir & "\system32\CCM\Logs\" & LogToCheck
'Debug(strSMSPolEval)
startdate = ShowFileAccessInfo(strSMSPolEval)
'Debug(startdate)
If isDate(startdate) Then
diffdate = DateDiff("d", startdate, date())
Debug(diffdate)
End If
If diffdate > 14 Then
COLLECTMSG "CheckLogFileModifyDate","ERROR", LogToCheck & " inactive for " & diffdate & " Days"
Debug("File activity > 14 days Should repair client")
Dim oSMSClient
Set oSMSClient = CreateObject ("Microsoft.SMS.Client")
If err.Number<>0 Then
COLLECTMSG "CheckLogFileModifyDate","ERROR", Err & " " & Err.description
COLLECTMSG "CheckLogFileModifyDate","Could not create SMS Client Object - Quitting", Null
Else
oSMSClient.RepairClient
COLLECTMSG "CheckLogFileModifyDate","RepairClient",Null
End If
End If
End Sub
' =============================================================================
' Method: VerboseCHK
' Description: Debugging, writes to console
' =============================================================================
Sub VerboseCHK(output)
If LogToConsoleVerbose Then wscript.echo output
End Sub
' =============================================================================
' Method: Debug
' Description: Debugging, writes to console
' =============================================================================
Sub Debug(output)
If LogToConsoleDebug Then wscript.echo output
End Sub
Sub CleanUp(ErrorCode)
On ERROR Resume Next
Debug("********** Centralize Info ***********")
'Used to count number of times this script has run
RegCounter "RunCount", 1
'Submit Status
If ErrorCode <> "doRunCheck" Then
If LogGood Or LogBad Then Set_LOGFOLDER
If Do_WebSubmit Then WebSubmit(CLIENTSTATE)
End If
COLLECTMSG "CleanUp","Successfully got to the end",ErrorCode
Debug("********** CleanUp Objects ***********")
Set oHTTP = Nothing
Set objEmail = Nothing
Set colServiceList = Nothing
Set colComputers = Nothing
Set fsCCR = Nothing
Set oWMIService = Nothing
Set objComputer = Nothing
Set objService = Nothing
Set objFolder = Nothing
Set ColFiles = Nothing
Set ofile = Nothing
Set objWMIService = Nothing
Set colCLIPropsList = Nothing
Set objWMIServiceCLI = Nothing
Set PureString = Nothing
Set oEnv = Nothing
Set colshares = Nothing
Set oReg = Nothing
Set oClientComponents = Nothing
Set oCPAppletMgr = Nothing
Set oSMSClient = Nothing
Set oCache = Nothing
Set oUIResManager = Nothing
Set objGroup = Nothing
Set objSysInfo = Nothing
Set objNetwork = Nothing
Set WSHShell = Nothing
Set objSysInfo = Nothing
Set objFSO = Nothing
Set oLocator = Nothing
Debug("********** End ***********")
Debug("ErrorCode = " & ErrorCode)
If ErrorCode = "doRunCheck" Then Wscript.Quit "12Hour"
wscript.quit ErrorCode
End Sub