There are several scenarios where a published application can cause a "session" to not terminate properly due to open child processes.
The most common of these is a Citrix Published Application which then keeps the user session open on the server until the Disconnect/Terminate timers step in. The user launches a published application running on the server. This creates a user session on the terminal server and the primary exe of the application is started. If this exe starts a child process but does not directly manage it, when the primary exe terminates because the user is through with this application this child process will keep the session open. This is what you might want if the child process has a visible GUI. For example if the child process is a mshelp application - the user may have shut down the app as troubleshooting and wants this help page to remain up as (s)he restarts the application. But many times the child has no GUI. So the session remains open on the server until the termination timer hits (typically an hour).
With Windows 2008 and RDP published applications there will be the same problem (although with Windows 2008 and either rdp or ica sessions there will be a change that extends the life of the session for a short while anyway, hoping that the user will launch another app. This will be more like 2 minutes. I am hoping we can configure that time frame down in the final release).
We also see this problem in Virtualized Applicaitons, such as in SoftGrid and Citrix Streaming for sure, and I suspect Thinstall as well. Instead of keeping a session open, it would keep the virtual environment open, which is bad enough on a desktop OS - but on a terminal server also manages to keep the user session open. SoftGrid added a option that will terminate the child processes a couple of years after I wrote this utility to help out. This is the unabashedly named TERMINATE_CHILDREN=TRUE tag in the OSD. But we still have need for this app.
LaunchIt (available in the Tools section at www.tmurgent.com ) is a simple exe that takes as an argument the path/name of another exe to launch and monitor. For example, to launch word the command line would be "LaunchIt.exe msword.exe". In the case of the user starting a child mshelp process, when msword.exe terminates LaunchIt will terminate the child processes for you. So you just include LaunchIt on your system (or in your virtual application package) and modify the published command line.
There is also a nice option of using "LaunchIt.exe /v msword.exe" which will detect msword ending and (if there are any child processes) prompt the user about these processes. The dialog box lists the short name of the exes and process IDs and asks if the user wishes to terminate these as well. Many times this is the desired approach.