You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
452 lines
14 KiB
452 lines
14 KiB
|
|
<%
|
|
'
|
|
' Copyright (c) Microsoft Corporation. All rights reserved.
|
|
'
|
|
'-------------------------------------------------------------------------
|
|
Const CONST_wbemPrivilegeSecurity=7 'Privilege constant for WMI connection
|
|
Const CONST_DELAYBEFORESHUTDOWN = 17000
|
|
'---------------------------------------------------------------------------------
|
|
|
|
'---------------------------------------------------------------------------------
|
|
'Function name: LaunchProcess
|
|
'Description: To launch process through cmd exe
|
|
'Input Variables: strCommand,strCurDir
|
|
'Output Variables: None
|
|
'Returns: None
|
|
'Global Variables: CONST_*
|
|
'----------------------------------------------------------------------------------
|
|
Function LaunchProcess(strCommand, strCurDir)
|
|
Err.Clear
|
|
On error Resume Next
|
|
|
|
Dim objService
|
|
Dim objClass
|
|
Dim objProc
|
|
Dim objProcStartup
|
|
Dim nretval
|
|
Dim nPID
|
|
Dim objTemp
|
|
|
|
nretval = 0
|
|
Set objService=getWMIConnection(CONST_WMI_WIN32_NAMESPACE)
|
|
|
|
'objService.Security_.Privileges.Add CONST_wbemPrivilegeSecurity 'giving the req Privilege
|
|
|
|
Set objClass = objService.Get("Win32_ProcessStartup")
|
|
|
|
Set objProcStartup = objClass.SpawnInstance_()
|
|
|
|
objProcStartup.ShowWindow = 2
|
|
|
|
Set objProc = objService.Get("Win32_Process")
|
|
|
|
nretval = objProc.Create(strCommand, strCurDir, objProcStartup,nPID)
|
|
|
|
If Err.number <> 0 Then
|
|
nretval=-1
|
|
LaunchProcess = nretval
|
|
Exit function
|
|
End If
|
|
|
|
set objTemp = objService.Get("Win32_Process.Handle='"&nPID&"'")
|
|
|
|
while Err.number <> -2147217406
|
|
set objTemp = objService.Get("Win32_Process.Handle='"&nPID&"'")
|
|
wend
|
|
Err.Clear
|
|
|
|
LaunchProcess = nretval
|
|
End Function
|
|
|
|
|
|
'----------------------------------------------------------------------------
|
|
' Function name: isScheduleShutdown
|
|
' Description: Serves in checking if a shutdown job is scheduled or not
|
|
' Input Variables: None
|
|
' Output Variables: None
|
|
' Return Values: True/False
|
|
' Global Variables: CONST_*
|
|
' returns true if a shutdown is scheduled ,false if it is not scheduled.
|
|
'----------------------------------------------------------------------------
|
|
Function isScheduleShutdown()
|
|
On error resume next
|
|
Err.Clear()
|
|
|
|
Dim objWMIConnection 'Wmi connection
|
|
Dim strQuery 'wmi query variable
|
|
Dim objCommand 'instances object
|
|
Dim objInstance 'insances count variable
|
|
Const CONST_RESTART = "RESTART"
|
|
Const CONST_SHUTDOWN = "SHUTDOWN"
|
|
|
|
isScheduleShutdown = false
|
|
|
|
'Trying to connect to the server
|
|
set objWMIConnection = getWMIConnection(CONST_WMI_WIN32_NAMESPACE)
|
|
strQuery = "Select * From Win32_ScheduledJob"
|
|
set objCommand= objWMIConnection.ExecQuery(strQuery)
|
|
|
|
If Err.number <> 0 or objCommand.count=0 then
|
|
Call SA_TraceOut("inc_Shutdown.asp", "Cannot find whether shutdown/restart is scheduled")
|
|
exit function
|
|
end if
|
|
|
|
'checking whether the wmiclass instance has the scheduled task
|
|
For Each objInstance in objCommand
|
|
'checking the scheduled task type
|
|
If instr(Ucase(right(objInstance.Command,15)),CONST_RESTART)>0 or instr(Ucase(right(objInstance.Command,15)),CONST_SHUTDOWN)>0 Then
|
|
Call SA_TraceOut("inc_Shutdown.asp", "Shutdown/Restart scheduled")
|
|
'Remove this
|
|
isScheduleShutdown = true
|
|
Exit For
|
|
End if
|
|
Next
|
|
|
|
'Release the objects
|
|
Set objWMIConnection = Nothing
|
|
Set objCommand = Nothing
|
|
|
|
End Function
|
|
|
|
|
|
'---------------------------------------------------------------------------------
|
|
'Function name: SendMessage
|
|
'Description: To send message to the users connected to the server appliance
|
|
'Input Variables: strTime
|
|
'Output Variables: None
|
|
'Returns: None
|
|
'Global Variables: In:L_(*)-Localized Strings
|
|
'----------------------------------------------------------------------------------
|
|
Function SendMessage(strTime,strTask)
|
|
|
|
Err.Clear
|
|
on error resume next
|
|
|
|
Dim strServerName
|
|
Dim objWinNtSysInfo
|
|
Dim objWshShell
|
|
Dim arrRepStrings 'holds the replacement strings
|
|
|
|
redim arrRepStrings(3)
|
|
|
|
SendMessage = false
|
|
|
|
'getting the server name
|
|
Set objWinNTSysInfo = CreateObject("WinNTSystemInfo")
|
|
|
|
strServerName = objWinNTSysInfo.ComputerName
|
|
|
|
arrRepStrings(0) = cstr(strServerName)
|
|
|
|
if ucase(strTask) = ucase(CONST_RESTART_APPLIANCE) then
|
|
arrRepStrings(1) = cstr(L_RESTARTMSG_TEXT)
|
|
arrRepStrings(3) = cstr(L_RESTARTMSG_TEXT)
|
|
else
|
|
arrRepStrings(1) = cstr(L_SHUTDOWNMSG_TEXT)
|
|
arrRepStrings(3) = cstr(L_SHUTDOWNNETMSG_TEXT)
|
|
end if
|
|
|
|
arrRepStrings(2) = cstr(strTime)
|
|
|
|
Set objWshShell =CreateObject("WScript.Shell")
|
|
|
|
L_NETSENDMESSAGE_TEXT = SA_GetLocString("sashutdown_msg.dll", "40400055", arrRepStrings)
|
|
|
|
objWshShell.Run "net send /users "& L_NETSENDMESSAGE_TEXT,0,true
|
|
|
|
If Err.number <> 0 then
|
|
SA_SetErrMsg L_UNABLETOSENDMESSAGE_ERRORMESSAGE
|
|
SendMessage=False
|
|
Exit Function
|
|
End If
|
|
|
|
SendMessage = true
|
|
|
|
'release objects
|
|
Set objWinNTSysInfo = nothing
|
|
Set objWshShell = nothing
|
|
|
|
End Function
|
|
|
|
|
|
'-------------------------------------------------------------------------
|
|
'Function: DeleteAlert()
|
|
'Description: Clears Scheduled alert
|
|
'Input Variables: Alert ID - alert ID of alert to clear
|
|
'Output Variables: None
|
|
'Returns: True or False
|
|
'Global Variables: None
|
|
'-------------------------------------------------------------------------
|
|
Function DeleteAlert(AlertID)
|
|
on error resume next
|
|
err.clear
|
|
|
|
Dim objAM
|
|
Dim rc
|
|
Dim objConnection
|
|
Dim objAlert
|
|
Dim instAlert
|
|
Dim intCookie
|
|
Dim strQuery
|
|
|
|
Const CONST_SHUTDOWN = "ShutdownPending"
|
|
Const CONST_RESTART = "RestartPending"
|
|
|
|
DeleteAlert = false
|
|
|
|
set objConnection = getWMIConnection(CONST_WMI_WIN32_NAMESPACE)
|
|
|
|
strQuery="Select * FROM Microsoft_SA_Alert WHERE AlertID=" & AlertID & " AND AlertLog=" & "'" & CONST_SHUTDOWN & "'" & " OR AlertLog=" & "'" & CONST_RESTART & "'"
|
|
|
|
set objAlert = objConnection.Execquery(strQuery)
|
|
|
|
If Err.number <>0 or objAlert.count = 0 then
|
|
Exit Function
|
|
end if
|
|
|
|
Set objAM = GetObject("WINMGMTS:" & SA_GetWMIConnectionAttributes() & "!\\" & GetServerName & "\root\cimv2:Microsoft_SA_Manager=@" )
|
|
If ( Err.Number <> 0 ) Then
|
|
Call SA_TraceOut(SA_GetScriptFileName(), "Get Microsoft_SA_Manager failed: " + CStr(Hex(Err.Number)) + " " + Err.Description)
|
|
Exit Function
|
|
End If
|
|
|
|
|
|
For Each instAlert In objAlert
|
|
'if instAlert.AlertID = AlertID AND Then
|
|
intCookie = instAlert.Cookie
|
|
|
|
rc = objAM.ClearAlert(CInt(intCookie))
|
|
If rc = 0 And Err = 0 Then
|
|
DeleteAlert = True
|
|
Else
|
|
DeleteAlert = False
|
|
End If
|
|
'end if
|
|
|
|
next
|
|
|
|
'Release the object
|
|
Set objAM = Nothing
|
|
set objConnection = nothing
|
|
Set objAlert = nothing
|
|
|
|
DeleteAlert = true
|
|
|
|
End Function
|
|
|
|
|
|
'------------------------------------------------------------------------------------
|
|
'Function name :ShutdownRaiseAlert
|
|
'Description :Raise alerts for restart/shutdown
|
|
'Input Variables :CONST_WMI_WIN32_NAMESPACE
|
|
'Localization variables - L_*
|
|
'Output Variables :None
|
|
'Returns :Boolean
|
|
'-------------------------------------------------------------------------------------
|
|
Function ShutdownRaiseAlert(Alertid,AlertLog,ReplacementString)
|
|
|
|
Err.Clear
|
|
on error resume next
|
|
|
|
Dim objAS 'holds Appliance services object
|
|
Dim rc 'holds return value
|
|
Dim objConnection 'holds WMI connection object
|
|
Dim oAlertCollection 'holds Alert instances
|
|
Dim oAlert 'holds an instance
|
|
Dim retval 'holds return value
|
|
Dim Rawdata 'holds Rawdata
|
|
Dim AlertType 'holds Alert type
|
|
Dim TimeToLive 'holds time to live
|
|
Dim arrRepStrings 'holds the replacement strings
|
|
|
|
redim arrRepStrings(2)
|
|
|
|
arrRepStrings(0) = cstr(ReplacementString(0))
|
|
arrRepStrings(1) = cstr(ReplacementString(1))
|
|
|
|
'get WMI Connection
|
|
set objConnection = getWMIConnection(CONST_WMI_WIN32_NAMESPACE)
|
|
If ( Err.Number <> 0 ) Then
|
|
Call SA_TraceOut(SA_GetScriptFileName(), "getWMIConnection(CONST_WMI_WIN32_NAMESPACE) failed: " + CStr(Hex(Err.Number)) + " " + Err.Description)
|
|
Exit Function
|
|
End If
|
|
|
|
set oAlertCollection = objConnection.instancesOf("Microsoft_SA_Alert")
|
|
If ( Err.Number <> 0 ) Then
|
|
Call SA_TraceOut(SA_GetScriptFileName(), "objConnection.instancesOf('Microsoft_SA_Alert') failed: " + CStr(Hex(Err.Number)) + " " + Err.Description)
|
|
Exit Function
|
|
End If
|
|
|
|
Dim sAlertIn
|
|
Dim sAlertThis
|
|
|
|
sAlertIn = AlertLog+CStr(AlertId)
|
|
Call SA_TraceOut(SA_GetScriptFileName(), "Looking for alert matching: " + sAlertIn )
|
|
For each oAlert in oAlertCollection
|
|
sAlertThis = oAlert.AlertLog + CStr(oAlert.AlertID)
|
|
Call SA_TraceOut(SA_GetScriptFileName(), "Checking alert: " + sAlertThis )
|
|
If ( sAlertThis = sAlertIn ) Then
|
|
Call SA_TraceOut(SA_GetScriptFileName(), "Shutdown Alert exists, exiting ShutdownRaiseAlert" )
|
|
Exit Function
|
|
End If
|
|
Next
|
|
|
|
'Create Appliance services object
|
|
Set objAS = CreateObject("Appsrvcs.ApplianceServices")
|
|
If Err.Number <> 0 Then
|
|
Call SA_TraceOut(SA_GetScriptFileName(), "CreateObject(Appsrvcs.ApplianceServices) failed: " + CStr(Hex(Err.Number)) + " " + Err.Description)
|
|
SA_SetErrMsg L_UNABLETOGETINSTANCE_ERRORMESSAGE
|
|
exit function
|
|
End If
|
|
|
|
call SA_TraceOut("In inc_shutdown", "Created the appliance services obj")
|
|
|
|
' Initialize the task
|
|
objAS.Initialize()
|
|
If Err.Number <> 0 Then
|
|
Call SA_TraceOut(SA_GetScriptFileName(), "objAS.Initialize() failed: " + CStr(Hex(Err.Number)) + " " + Err.Description)
|
|
SA_SetErrMsg L_UNABLETOGETINSTANCE_ERRORMESSAGE
|
|
exit function
|
|
End If
|
|
|
|
' /**** Structure of Raising Alert ********/
|
|
'long RaiseAlert(
|
|
' [in] long lAlertType,
|
|
' [in] long lAlertId,
|
|
' [in] BSTR bstrAlertLog,
|
|
' [in] BSTR bstrAlertSource,
|
|
' [in] long lTimeToLive,
|
|
' [in] VARIANT* pReplacementStrings,
|
|
' [in] VARIANT* pRawData);
|
|
|
|
|
|
AlertType = 2
|
|
TimeToLive = 2147483647
|
|
|
|
call SA_TraceOut("In inc_shutdown", "calling raisealert func")
|
|
|
|
retval = objAS.RaiseAlert(AlertType,Alertid,AlertLog,"Microsoft_SA_Resource",TimeToLive,arrRepStrings, Rawdata )
|
|
|
|
if Err.number <> 0 then
|
|
Call SA_TraceOut(SA_GetScriptFileName(), "objAS.RaiseAlert(..) failed: " + CStr(Hex(Err.Number)) + " " + Err.Description)
|
|
SA_SetErrMsg L_UNABLETORAISEALERT_ERRORMESSAGE
|
|
end if
|
|
|
|
call SA_TraceOut("In inc_shutdown", "called raisealert func:"+retval)
|
|
|
|
'Release the objects
|
|
Set objAS = Nothing
|
|
set objConnection = nothing
|
|
Set oAlertCollection = nothing
|
|
|
|
End function
|
|
|
|
'----------------------------------------------------------------------------
|
|
' Function : ExecuteShutdownTask
|
|
' Description: Executes the Shutdown task
|
|
' Input Variables: powerOff - bool indicating power off or restart
|
|
' OutputVariables: None
|
|
' Returns: True/False for success/failure
|
|
'
|
|
'----------------------------------------------------------------------------
|
|
Public Function ExecuteShutdownTask(ByVal powerOff )
|
|
Err.Clear
|
|
On Error Resume Next
|
|
|
|
Dim delayBeforeShutdown
|
|
Dim objTaskContext ' to hold taskcontext object
|
|
Dim objAS ' to hold ApplianceServices object
|
|
|
|
Const CONST_METHODNAME = "ShutdownAppliance"
|
|
|
|
'Function call to get the delay
|
|
delayBeforeShutdown = GetShutdownDelay()
|
|
|
|
'Initialize to default
|
|
ExecuteShutdownTask = FALSE
|
|
|
|
Set objTaskContext = CreateObject("Taskctx.TaskContext")
|
|
|
|
If Err.Number <> 0 Then
|
|
SA_SetErrMsg L_TASKCTX_FAILED_ERRORMESSAGE & "(" & Hex(Err.Number) & ")"
|
|
Exit Function
|
|
End If
|
|
|
|
Set objAS = CreateObject("Appsrvcs.ApplianceServices")
|
|
If Err.Number <> 0 Then
|
|
SA_SetErrMsg L_UNABLETOGETINSTANCE_ERRORMESSAGE & "(" & Hex(Err.Number) & ")"
|
|
Exit Function
|
|
End If
|
|
'
|
|
' Set task parameters
|
|
'
|
|
objTaskContext.SetParameter "Method Name", CONST_METHODNAME
|
|
objTaskContext.SetParameter "SleepDuration", delayBeforeShutdown
|
|
objTaskContext.SetParameter "PowerOff", powerOff
|
|
|
|
If Err.Number <> 0 Then
|
|
SA_SetErrMsg L_SETPARAMETER_FAILED_ERRORMESSAGE & "(" & Hex(Err.Number) & ")"
|
|
Exit Function
|
|
End If
|
|
|
|
' Initialize the task
|
|
objAS.Initialize()
|
|
If Err.Number <> 0 Then
|
|
SA_SetErrMsg L_INITIALIZATION_FAILED_ERRORMESSAGE & "(" & Hex(Err.Number) & ")"
|
|
Exit Function
|
|
End If
|
|
|
|
Call objAS.ExecuteTaskAsync("ApplianceShutdownTask", objTaskContext)
|
|
If Err.Number <> 0 Then
|
|
SA_SetErrMsg L_EXECUTETASK_FAILED_ERRORMESSAGE & "(" & Hex(Err.Number) & ")"
|
|
Exit Function
|
|
End If
|
|
|
|
'Release the objects
|
|
Set objAS = Nothing
|
|
Set objTaskContext = Nothing
|
|
|
|
ExecuteShutdownTask = TRUE
|
|
End Function
|
|
|
|
'----------------------------------------------------------------------------
|
|
' Function : GetShutdownDelay
|
|
' Description : support function for getting the no of seconds
|
|
' Input Variables : None
|
|
' OutputVariables : None
|
|
' Returns : int-delay in seconds
|
|
' Global Variables : In:CONST_DELAYBEFORESHUTDOWN
|
|
'----------------------------------------------------------------------------
|
|
Private Function GetShutdownDelay()
|
|
On error resume Next
|
|
|
|
Dim objRegistry
|
|
Dim nShutdownDelay
|
|
|
|
|
|
Set objRegistry = RegConnection()
|
|
|
|
'Function call to get the required value from the registry
|
|
nShutdownDelay = GetRegkeyValue( objRegistry, _
|
|
"SOFTWARE\Microsoft\ServerAppliance\WebFramework",_
|
|
"RestartTaskDelay", CONST_DWORD)
|
|
|
|
'Cheking for non numeric
|
|
If ( not IsNumeric(nShutdownDelay)) Then
|
|
nShutdownDelay = CONST_DELAYBEFORESHUTDOWN 'Assign to default
|
|
ElseIf nShutdownDelay=0 or nShutdownDelay < CONST_DELAYBEFORESHUTDOWN then
|
|
nShutdownDelay = CONST_DELAYBEFORESHUTDOWN 'Assign to default
|
|
End If
|
|
|
|
'Set to nothing
|
|
Set objRegistry = Nothing
|
|
|
|
GetShutdownDelay=nShutdownDelay
|
|
|
|
If Err.Number <> 0 Then
|
|
Call SA_TraceOut(SA_GetScriptFileName , "error in getting delay")
|
|
End If
|
|
|
|
End Function
|
|
%>
|