About once a month, I get asked: What are the GUIDs for?
Application Streaming uses GUIDs to identify execution targets of a profile. These are most visible as the RadeCache sub-directory names that hold the execution image of an application.
In this post, I’ll remove some of the mystery and provide the rationale behind their use.
GUID = Globally Unique IDentifier. The more correct term is UUID = Universally Unique Identifer. I’ll stick with GUID.
Application Streaming has a few components which are key for this discussion.
- Streaming Profiler
- Streaming Client
- Application Hub (Fancy name for a file server)
The job of the Streaming Profiler is to create an application profile and store that profile on the file server where it can be seen by the clients for execution and where it can be referenced by the Access Management Console for publishing.
Profile: XML file that describes things that can be published.
Target: CAB file that holds the content used to actually run an application.
The profile holds a list of application names and a set of icon data that go with the applications. Notice that this is all the information that is needed by the Access Management Console when publishing applications.
The target holds everything needed by the Streaming Client for purposes of actually running an application. It holds the file system and registry data that was collected during the profiling process or more precisely, it holds the stuff that was intercepted when an installation program was run under the Streaming Profiler.
Notice that a single profile can support multiple execution targets.
Minimal number of icons
An Application Streaming design goal was that a single publishable application (name and icon), could support multiple execution images where the “correct” execution image could be runtime selected from a list that is carried along with the profile.
Consider creating a profile of the Mozilla Firefox browser and profiling the installer twice, once for 32-bit execution and a second time for 64-bit. The following is a high level view of what is in the profile.
- Application 1: Firefox
- Application 2: Firefox Safe Mode (right, we don’t publish that one)
- “Target 1”: (The 32-bit target) and
- “Target 2”: (The 64-bit target)
In theory, we could create a directory for the profile and then subdirectories for the execution images. Example:
- Firefox\Target 1
- Firefox\Target 2
It gets complicated when you consider that the association of Target 1 with the 32-bit systems and Target 2 with the 64 could actually change as the profile evolved.
Targets are associated with client execution machines on several factors, including:
- Boot drive letter
- Language of OS
- Operating System version
The target that is “correct” for Windows XP 32-bit English right now, may later be the correct target for Windows XP and Vista 32-bit English and German. Then the following week, it may drop German and add Japanese or all languages and figure out that the Vista execution really needs to be in its own Target and have a 3rd created.
Using numeric integer target names would work (1, 2, 3, 4), but this gets a bit strange when Targets are erased from a profile. It also fails to satisify a second requirement of the isolation system. By design SaveAs creates a new target that will never conflict with the target that was opened for editing.
A profile is “new” if it is created or if a file / SaveAs occurs. The Targets in a profile that is saved retains their identifier and targets that are SavedAs, receive a new GUID. This way, the caching system can use the GUID as the key to isolation and pretty much ignore the association of Targets to profiles. Since GUIDs are defined to always be unique, using GUIDs eliminates the complication of supporting two different versions of the same named profile with the same named set of targets.
What the Streaming Client needed
1) Target name must be unique and
2) Target name must never change
GUIDs fit perfectly.
Once the GUIDs were selected as the names of the execution targets, they also serve as the basis of the directory names of the system shared cache and the per-user execution spaces that back up the layers of isolation. The GUIDs then also support unique identification of a specific Target associated with a specific profile.
It is worth noting that we describe the GUIDs that identify a execution target. Profiles also have a unique GUID and two profiles with the same name, but different GUIDs are … different profiles.
This is why we did it. Feel free to throw some rocks.
Product Architect – Application Streaming