The Core Technologies Blog

Professional Software for Windows Services / 24×7 Operation


How Dropbox Auto-Upgrade Works (and How to get AlwaysUp to Play Nice with it)

The Problem: Dropbox Automatic Updates

Recently, a few customers reported “issues” with Dropbox automatically updating itself and causing havoc when running under AlwaysUp in their 24×7 environments. Apparently the auto-upgrade would restart Dropbox outside of AlwaysUp and that unmanaged instance would prevent AlwaysUp from starting a new copy under its control. The result was hundreds of Explorer windows open on the screen — a great experience!

Our first instinct was to turn off automatic updates, which are usually a bad idea in a controlled, 24×7 environment anyway. Unfortunately Dropbox does not allow that. Auto-updates are totally managed by Dropbox and there are no exposed options for adjusting the behavior.

The lack of controls thwarted our second brilliant idea as well — scheduling auto-upgrades for a specific time each day/week/month. Apparently changes can take place at any time, at the program’s discretion. Again, not suitable in a managed environment.

A polite email to the Dropbox support folks explaining the situation and requesting help & advice yielded a most unsatisfying generic response:

Hi,

Thanks for writing in. While we'd love to answer every question we get,
we unfortunately can't respond to your inquiry due to a large volume of
support requests. Here are some resources for resolving the most common
issues:

Restore files or folders - www.dropbox.com/help/969
Reset your Dropbox password - www.dropbox.com/forgot
Reset/Disable two-step verification - www.dropbox.com/help/364
Learn about sharing files or folders - www.dropbox.com/help/category/Sharing
Learn about Dropbox's desktop app - www.dropbox.com/help/category/Desktop
Learn about Dropbox's mobile apps - www.dropbox.com/help/category/Mobile
For all other issues, please check out our Help Center - www.dropbox.com/help

We're sorry for the inconvenience,
The Dropbox Team

So time to do some reverse engineering!

The Investigation: How Dropbox Auto-Update Works

We installed an outdated version of Dropbox (2.47, thanks OldApps.com!) on our Windows Server 2012 machine, started it under AlwaysUp and patiently waited with Microsoft’s excellent Process Explorer open. It took about 8 minutes for the action to start…

  • First, Dropbox.exe launched dropbox-upgrade-2.8.2.exe, which it must have silently downloaded into the private cache folder (C:\Users\<UserName>\AppData\Roaming\Dropbox\.dropbox-cache).


    Dropbox upgrade running

  • A few seconds later, the update program spawned a second copy of Dropbox.exe, passing the ominous /killeveryone flag.

    Dropbox killeveryone running
  • Next, all instances of Dropbox subsequently shut down (including the one managed by AlwaysUp), and the updater launched a new copy of Dropbox before it too exited.
    Notice the peculiar command line arguments.


    A new instance of Dropbox is running

  • This is all fine when Dropbox is running normally on your desktop, but it is a problem when Dropbox is being managed by AlwaysUp. Indeed, once AlwaysUp noticed that the Dropbox process it was managing was closed, it started up a second copy:


    A new instance of Dropbox is running

  • Now Dropbox abhors multiple instances, so after a few seconds the AlwaysUp-controlled instance exits — but not before throwing up an Explorer window browsing the Dropbox folder. AlwaysUp, persistent fellow that it is, detects that Dropbox has once again exited, starts it up again and the whole process repeats. It is easy to see that if left unchecked, we may end up with hundreds of redundant Explorer windows!


    Many Dropbox Explorer Windows

The Solution: Configuring AlwaysUp to Tolerate Automatic Dropbox Updates

To prevent the auto-update from triggering ten billion Explorer windows, we must have AlwaysUp close the instance of Dropbox spawned during the upgrade prior to starting its own copy. To do so:

  1. Edit Dropbox in AlwaysUp

  2. Click over to the Startup tab.

    If you have AlwaysUp version 9.0 (released in December 2014) or later, check the Stop all copies of the application running on this computer and the Also whenever the application is restarted boxes as pictured here:


    Dropbox: Run a Single Instance

    Otherwise, if you have an earlier version of AlwaysUp without the “single instance” feature:

    • Download close-application.bat, a DOS batch file that will close a given application. Save it to the AlwaysUp folder (C:\Program Files\AlwaysUp, or C:\Program Files (x86)\AlwaysUp)

    • Check the Run the following program/batch file box and enter the following command line:

      “C:\Program Files (x86)\AlwaysUp\close-application.bat” Dropbox.exe

    • Check the Also run it whenever the application is restarted box as well.


      Close Dropbox at Startup

    These changes will cause AlwaysUp to close all running instances of Dropbox before starting the one that it will monitor.

  3. And finally, to give Dropbox some time to complete its auto-update before AlwaysUp tries to fire it up again, click over to the Restart tab and:

    1. Check the Whenever the application stops, restart it box
    2. Check the Not immediately, but box
    3. Select the After option and enter 5 minutes in the adjacent field.


    Delay Restarting Dropbox

  4. Click the Save >> button to record your settings.

That’s it! The next time Dropbox decides to automatically update itself, AlwaysUp will quickly bring it back under control — for continued 24×7 operation.

Posted in AlwaysUp | Tagged , | 8 Comments

AlwaysUp 8.7: Restart your Application when the PC Resumes

We are happy to report that AlwaysUp now integrates with the Windows power management system, to provide the ability to restart your applications when the host computer resumes from a low-power state (sleep or hibernation). This option is useful if your application being run as a Windows Service fails to properly handle the “time lapse” that occurs when a PC is put to sleep and later revived.

This new, easy to use functionality is available on the Monitor tab. Simply check the box highlighted below and you will be ready to go:


Stop the application when the PC resumes

Enjoy!

Posted in AlwaysUp | Tagged , | 2 Comments

How to Start your Windows Service When a USB Flash Drive is Inserted

Windows Services are designed to start up at boot and run 24×7, but that framework is overkill for server software that must occasionally come alive to process specific events and go back to a waiting state. Service Triggers were introduced in Windows 7 to remedy the situation but at this point, only a handful of triggering events are supported. We look forward to more capabilities (and better documentation!) of this useful feature in future versions of Windows.

If you have a Windows Service that works with USB flash drives, you can use our free Service Trigger Editor utility to configure your service to start when a flash drive is inserted. To do so:

  1. Download Service Trigger Editor from our web site. Note that it is a standalone executable, ServiceTriggerEditor.exe, so just save it in a new folder on your hard drive.

  2. Run ServiceTriggerEditor.exe. You should see the standard security prompt if User Account Control (UAC) is enabled on your PC:


    Service Trigger Editor: UAC Prompt

    Service Trigger Editor is digitally signed by our company for your safety & security so please click Yes to proceed.

  3. Once the utility’s main window comes up, listing all services installed on your PC, find and highlight the service you wish to modify. We have selected the SyncToy service (created by our AlwaysUp product) for this tutorial.


    Service Trigger Editor: Main Window

  4. Select Trigger > Add… to summon the Add Trigger window. Adjust the settings to start the service when A specific device arrives (or is present at startup).


    Add a Device Arrival Trigger

  5. Next, click the Add… button on the right, enter USBSTOR\GenDisk in the window that comes up, and click OK to record that value.


    Add Trigger Data

    We’re now done configuring this new trigger so click the Save >> button.


    Add a Device Arrival Trigger

That’s it. Next time you insert a USB flash drive, your service will start. Enjoy!

Posted in Service Trigger Editor | Tagged , , | Leave a comment

Essential Tools for Windows Services: SC.EXE

While the useful NET.EXE utility is great for starting an stopping windows services, it cannot do much beyond that. Enter Microsoft’s SC.EXE – a versatile command-line utility built into Windows that can help you start, stop, restart or configure any Windows Service.

Type SC at a command prompt to see the extensive set of options available:

DESCRIPTION:
        SC is a command line program used for communicating with the
        Service Control Manager and services.
USAGE:
        sc <server> [command] [service name] <option1> <option2>...
        The option  has the form "\\ServerName"
        Further help on commands can be obtained by typing: "sc [command]"
        Commands:
          query-----------Queries the status for a service, or
                          enumerates the status for types of services.
          queryex---------Queries the extended status for a service, or
                          enumerates the status for types of services.
          start-----------Starts a service.
          pause-----------Sends a PAUSE control request to a service.
          interrogate-----Sends an INTERROGATE control request to a service.
          continue--------Sends a CONTINUE control request to a service.
          stop------------Sends a STOP request to a service.
          config----------Changes the configuration of a service (persistent).
          description-----Changes the description of a service.
          failure---------Changes the actions taken by a service upon failure.
          failureflag-----Changes the failure actions flag of a service.
          sidtype---------Changes the service SID type of a service.
          privs-----------Changes the required privileges of a service.
          qc--------------Queries the configuration information for a service.
          qdescription----Queries the description for a service.
          qfailure--------Queries the actions taken by a service upon failure.
          qfailureflag----Queries the failure actions flag of a service.
          qsidtype--------Queries the service SID type of a service.
          qprivs----------Queries the required privileges of a service.
          qtriggerinfo----Queries the trigger parameters of a service.
          qpreferrednode--Queries the preferred NUMA node of a service.
          delete----------Deletes a service (from the registry).
          create----------Creates a service. (adds it to the registry).
          control---------Sends a control to a service.
          sdshow----------Displays a service's security descriptor.
          sdset-----------Sets a service's security descriptor.
          showsid---------Displays the service SID string corresponding to
                          an arbitrary name.
          triggerinfo-----Configures the trigger parameters of a service.
          preferrednode---Sets the preferred NUMA node of a service.
          GetDisplayName--Gets the DisplayName for a service.
          GetKeyName------Gets the ServiceKeyName for a service.
          EnumDepend------Enumerates Service Dependencies.

        The following commands don't require a service name:
        sc <server> <command> <option>
          boot------------(ok | bad) Indicates whether the last boot should
                          be saved as the last-known-good boot configuration
          Lock------------Locks the Service Database
          QueryLock-------Queries the LockStatus for the SCManager Database

Stopping/Starting a Service with SC

To stop a windows service from an elevated DOS prompt, run:

SC STOP <Service-Name>

where <Service-Name> is the name of the service. Be sure to enclose the name in quotes if it contains a space!

For example, to stop the Print Spooler service (named “Spooler”), run:

SC STOP Spooler


SC: Stopping the Print Spooler Service

Notice that the SC command will simply make a request for the service to stop and return immediately, before the service has actually stopped. This is evidenced by the STOP_PENDING state (which means that the service is in the process of winding down) returned in the screenshot above. If you plan to use this command in a batch file, you may need to add a sleep/pause after calling SC to give the service some time to respond. (The NET.EXE command, which will wait/block until the service has completely stopped, may be a better choice in this respect.)

Similarly, to start a windows service, use:

SC START <Service-Name>

Again, the request will be made but SC will not wait for the service to complete its startup before returning.

Using SC to Check the Status of a Service

To discover the state of your service, run SC with the QUERYEX option:

SC QUERYEX <Service-Name>

Check on the Spooler service like this:

SC QUERYEX Spooler


SC: Checking the Print Spooler Service

If the service is running, SC will return the underlying process identifier (“PID”) which can be used to manipulate the service’s process. This is very handy information when a service is stuck or unresponsive and must be forcibly terminated!

Disabling a Service

The CONFIG option enables you to modify a service’s settings. If you wish to disable a naughty service, preventing anyone from starting it, type:

SC CONFIG <Service-Name> start= disabled

For example, this command disables the infamous Interactive Services Detection Service (named “UI0Detect”):

SC CONFIG UI0Detect start= disabled

Note that the space in between “start=” and “disabled” is required!

How to Create a New Service with SC

SC can be used to create a new service as well. Type “SC CREATE” to see the many settings that can be applied but at a minimum you must specify:

  • the name of the service,
  • the display name of the service (a more descriptive moniker),
  • the full path to the executable hosting the service

For example, the following command creates a service called “MyService” with an executable located in “C:\MyService\MyService.exe”:

SC CREATE MyService binPath= “C:\MyService\MyService.exe” DisplayName= “My very cool service”

Once installed, you can work with the new service as normal in the Services application:

SC: New Service Created

Note that only executables explicitly written to interface with the Windows Service Control Manager should be installed this way. While SC will happily accept a regular, non-service binary, you will receive the fatal Error 1053 when you attempt to start the service. Employ a service wrapper like AlwaysUp in that situation.

Using SC to Delete a Service

The command to remove a service with SC is straightforward:

SC DELETE <Service-Name>

To discard the service named “MyService” that we installed above, use:

SC DELETE MyService

Needless to say, please use this command with caution!. Once a service is deleted it cannot be easily re-instated. Removing the wrong service can render your computer unusable!

SC is the Complete Command Line Utility for Windows Services

So whenever you need to work with a service via a batch file or from a DOS command prompt, look to SC for support. This versatile, essential tool has earned its reputation as the “Swiss Army Knife” for Windows Services!

Posted in Windows Services | Tagged , , | 8 Comments

Trouble with MT4 Build 600 and AlwaysUp?

Version 4 of the popular MetaTrader trading platform (affectionately called MT4) received a major overhaul in February. This forum post describes the many improvements in that “Build 600”, but perhaps the most dramatic changes were to the data storage layer:


The new version of the MetaTrader 4 terminal features the updated structure of user data storage. In earlier versions all programs, templates, profiles etc. were stored directly in terminal installation folder. Now all necessary data required for a particular user are stored in a separate directory called data folder.

Unfortunately this can cause MetaTrader terminals installed under AlwaysUp to stop working!

If you are having problems running MT4 as a Windows Service with AlwaysUp, please:

  1. Make sure you have your Windows account specified on the Logon tab, as described in step 6 of our MT4 tutorial. Using the default LocalSystem account is no longer an option now that the terminal’s data is kept in a user-specific folder.

    AlwaysUp Logon Tab

  2. When upgrading to build 600, MT4 moves many files automatically but some files will need to be moved manually. Please review “Automatic Copying of MQL4 Programs When Updating from Older Builds” and ensure that all your terminal’s files are migrated to the new locations.

Following this advice has worked for all MT4 customers experiencing problems with build 600 to date. Of course, please feel free to contact us if you have any questions or remain stuck after implementing the above!

Posted in AlwaysUp | Tagged , | Leave a comment