I confess, the question title suggest a "too broad" question, but here me out first... I am only interested in verifying my findings in that regard.
All the following situations have the following in common:
- Binaries and supporting files (no user data) of an unspecified application should be installed onto the target system.
- Configuration, user data shall be stored on the target system.
- Start menu shortcuts shall be created on the target system.
- The roaming/local synchronization concept should be considered.
The scenarios are:
- A machine-wide installation; all users on the target system can see the start menu shortcuts within their user desktop, and can use the application. Configuration and user data are shared across all users (are common, no individual configuration or user data).
- A machine-wide installation; all users on the target system can see the start menu shortcuts within their user desktop, and can use the application. Configuration and user data are individual to the specific user and isolated from each other (users cannot access configuration and other data from other users).
- A per-user only installation; users needs to install the application by themselves. If user A installs the application, the installation of user A is not accessible to user B. If user B wants to use the application, user B has to install the application individually.
From my "research", I have identified the following directories for the mentioned scenarios:
Scenario 1: machine-wide installation, shared configuration and common user data
- Application binaries:
C:\Program Files\[Manufacturer]\[ProductName]
- Configuration and user data:
C:\ProgramData\[Manufacturer]\[ProductName]
- Start menu shortcuts:
C:\ProgramData\Microsoft\Windows\Start Menu
Scenario 2: machine-wide installation, individual configuration and individual user data
- Application binaries:
C:\Program Files\[Manufacturer]\[ProductName]
- Configuration and user data:
C:\Users\[UserName]\AppData\Roaming\[Manufacturer]\[ProductName]
- Start menu shortcuts:
C:\ProgramData\Microsoft\Windows\Start Menu
Scenario 3: per-user only installation, individual configuration and individual user data
- Application binaries:
C:\Users\[UserName]\AppData\Local\[Manufacturer]\[ProductName]
- Configuration and user data:
C:\Users\[UserName]\AppData\Roaming\[Manufacturer]\[ProductName]
- Start menu shortcuts:
C:\Users\[UserName]\AppData\Roaming\Microsoft\Windows\Start Menu
Pit fall with scenario 3: The user may install the application on a computer A, which is Active Directory connected, switches to computer B. The application is not installed on computer B, since the application was installed on computer A within Local
, so the data was not shared/synced with the Active Directory environment. The issue is, that the user sees the shortcuts, as they were added to Roaming
. I could not find a Local
start menu.
On the other hand, when the application would be installed within the Roaming
domain, Active Directory administrators will quickly argue against the installation of the software, as shared/synced Roaming
is not intended for application binaries, but user data.
There are several (unnamed) application available, which do not uses the "common directories". For example, new directories were created on the root level (directly under C:\
, like C:\[Manufacturer]\[ProductName]
) or in the (visible) user home directory (like C:\Users\[UserName]\Documents\[Manufacturer]\[ProductName]
). I disfavor such solutions, as an administrator would have hard times finding application binaries or user data, and, related to C:\Users\[UserName]\Documents
, will populate the visible user home with data, the users has not placed there by themselfs. The possibility of the user deleting mandatory configuration or user data files is high, because the user thinks "I do not have placed it there".
Edit I missed to reveal some information that clarifies the/my situation. I am operating an installation builder software, that provides me with generic path variables, such as LocalAppDir
, RemoteAppDir
, ProgramsDir
, ProgramDataDir
, etc ..
I have picked some of the most common used targets (paths) to discus, whether the (resolved and absolute) path is the right path to use.
@MSalters pointed out the localization issue, and ProgramData dir moved issue. However, those issues are mitigated by using the path variables provided by the installation builder software.
Using a Windows-based system (as of Windows 7, 8.1, 10), what are the correct (intended) storage locations (folders) for an application?