A: Many application update programs automatically check if the application is running. If it is, they will stop the application, then perform the update, so no manual actions should be required. However, if your application update doesn’t perform this, you still have some options.

Firstly you could use SCCM to deploy the update only when no one is logged on, which would ensure the application is not running. Configure this through the Environment tab, where you would select the option Only when no user is logged on, which Figure 1 shows below:

Savill Fig1 sccmnouserloggedon_0
Savill Fig1 System Center Config Mgr no user logged on


Another option would be to configure the actual SCCM advertisement to run either at logon or logoff which would again ensure the application isn’t running. Set this via the Schedule tab of the advertisement, and set a mandatory assignment that you can configure to Assign immediately after this event, which allows logon/logoff to be selected (see Figure 2 below).

Savill Fig2 sccmlogonlogoff_0
Savill Fig2 System Center Config Manager logon/logoff


If your users never log off, you can write a custom script to check if the program is running. If it’s running, you can create a prompt to kill it or give users five minutes to finish up their work and close it themselves or it will be killed; then, at the end of the script, run the update exe or msi (using msiexec /i). This custom script would be specified as the SCCM program instead of the normal setup program. Below is a very short example that could be used as a foundation.
set objWMIService = GetObject ("winmgmts:")                              foundProc = False                              procName = "winword.exe"                              procNameFriend = "Word"                              for each Process in objWMIService.InstancesOf ("Win32_Process")                                  If StrComp(Process.Name,procName,vbTextCompare) = 0 then                                      foundProc = True                                      procID = Process.ProcessId                                  End If                              Next                              If foundProc = True Then                                  WScript.Echo "Found Process (" & procID & ")"                                  UserConfirm = MsgBox("Process found, click OK to stop it or Cancel to wait 5 minutes",vbOKCancel+vbQuestion+vbSystemModal,"Stop " & procNameFriend & " Process")                                  If UserConfirm = vbOK then                                      WScript.Echo "Killing Process"                                      Set colProcessList = objWMIService.ExecQuery("Select * from Win32_Process where ProcessId =" &  procID)                                      For Each objProcess in colProcessList                                              objProcess.Terminate()                                      Next                                      WScript.Sleep(1000) 'wait for a second                                      Set colProcessList = objWMIService.ExecQuery("Select * from Win32_Process where ProcessId =" &  procID)                                      If colProcessList.count = 0 Then                                          WScript.Echo "Process killed"                                      End If                                  Else 'the user said to wait                                      WScript.Sleep(360000) 'wait for 5 minutes                                      WScript.Echo "Killing Process if not already stopped"                                      Set colProcessList = objWMIService.ExecQuery("Select * from Win32_Process where ProcessId =" &  procID)                                      For Each objProcess in colProcessList                                              objProcess.Terminate()                                      Next                                      WScript.Sleep(1000) 'wait for a second                                      Set colProcessList = objWMIService.ExecQuery("Select * from Win32_Process where ProcessId =" &  procID)                                      If colProcessList.count = 0 Then                                          WScript.Echo "Process not running"                                      End If                                  End If                               End If                              'perform the software installation in the next line                              'msiexec /i appinstall.msi