Search code examples
windows-store-appswindows-8.1windowssideloadingdism

How do I Sideload a Windows App for All Users on Already Deployed Windows Images?


We have an enterprise Windows store app targeting Windows 8.1 and Windows 10. We are currently using sideloading to deploy the app. We need to be able to deploy the app for all users on a particular device.

According to this technet article:

https://technet.microsoft.com/en-us/library/dn613833(v=ws.11).aspx

You can use DISM to provision an app for all users on a device, but only for users that have not already logged in on that device:

Provisioned apps are injected in the image and are installed for every user the first time the user logs on.

What I want to do is install our app for all current users on a particular device, regardless of whether or not they’ve logged into that device before.

I’ve done quite a bit of research and I haven’t found anything that details how to accomplish this.

Is this currently possible with Windows store apps?


Solution

  • I solved this issue by using a scheduled task to install the app for users when they login. Here's the xml for my scheduled task - feel free to import this xml into the task scheduler in order to see a formatted version:

    <?xml version="1.0" encoding="UTF-16"?>
    <Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
      <RegistrationInfo>
        <Date>2016-08-11T15:22:07.0657007</Date>
        <Author>YourNameHere</Author>
        <Description>This task installs and updates the app</Description>
        <URI>\app_install_task</URI>
      </RegistrationInfo>
      <Triggers>
        <LogonTrigger>
          <Enabled>true</Enabled>
        </LogonTrigger>
      </Triggers>
      <Principals>
        <Principal id="Author">
          <GroupId>S-1-5-32-545</GroupId>
          <RunLevel>HighestAvailable</RunLevel>
        </Principal>
      </Principals>
      <Settings>
        <MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
        <DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries>
        <StopIfGoingOnBatteries>true</StopIfGoingOnBatteries>
        <AllowHardTerminate>true</AllowHardTerminate>
        <StartWhenAvailable>false</StartWhenAvailable>
        <RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
        <IdleSettings>
          <StopOnIdleEnd>true</StopOnIdleEnd>
          <RestartOnIdle>false</RestartOnIdle>
        </IdleSettings>
        <AllowStartOnDemand>true</AllowStartOnDemand>
        <Enabled>true</Enabled>
        <Hidden>false</Hidden>
        <RunOnlyIfIdle>false</RunOnlyIfIdle>
        <WakeToRun>false</WakeToRun>
        <ExecutionTimeLimit>PT1H</ExecutionTimeLimit>
        <Priority>7</Priority>
      </Settings>
      <Actions>
        <Exec>
          <Command>C:\Windows\System32\GroupPolicy\User\Scripts\Logon\your_app_bundle\install.exe</Command>
        </Exec>
      </Actions>
    </Task>
    

    There were a few additional steps I had to take in order to make this as seamless as possible:

    1. I moved my app's installation bundle to C:\Windows\System32\GroupPolicy\User\Scripts\Logon\ so that it can always be accessible to the task scheduler
    2. I used PowerGUI (available for free online) to compile my Powershell installation script to a .exe so that the install runs in the background - no Powershell window pops up when the installation runs
    3. I also added some Powershell code to check if the application is already installed, so that the installer doesn't run every time the user logs in - it only installs the app if the app is not installed, or if the app versions are different (this would indicate that the app needs to be updated)

    If anyone else comes across a simpler way to accomplish this, please let me know – I’d love to simplify this process in the future.