A macOS background service that automatically monitors and exposes Windows applications from a Parallels Desktop VM to the macOS Dock.
This solution solves the problem of making user aware of new non default Windows applications in users posession (e.g. when setup of apps is conducted by device management solutions). It continuously monitors the Parallels VM application folder and mirrors eligible apps to a Windows Apps folder visible in the macOS Dock.
- Automated Discovery: Detects new
.appbundles added by Windows managment solution (e.g. SCCM, Intune, etc.) or installed manually in the VM. - Immediate Exposure: Creates symbolic links in
~/Applications (Parallels)/Windows Appsinstantly. - Cleanup: Removes broken links if the source app is uninstalled.
- Dock Integration: Automatically adds the
Windows Appsfolder to the Dock (next to Downloads). It is smart enough to handle user removals and avoid duplicates. - Zero Config: Works out of the box for standard Parallels setups.
- Enterprise Ready: Deploys as a standard macOS Package (
.pkg) via Jamf/MDM.
- Run the installer package
ParallelsAppsExposeService.pkg. - The service will start automatically (or upon next login).
Upload ParallelsAppsExposeService.pkg to Jamf Pro and deploy to target computers. The package includes a postinstall script that will attempt to load the agent for the current user immediately.
To build the package:
./package.shArtifact will be created at build/ParallelsAppsExposeService.pkg.
When the service is installed, macOS will show a "Background Items Added" notification. To suppress this notification in a managed environment, you must deploy a Configuration Profile.
Create a Configuration Profile with the Service Management payload (Managed Login Items).
- Payload Scope: System
- Payload Type: Service Management (
com.apple.servicemanagement)
Add a new Rule with the following settings:
- Rule Type:
LabelPrefix - Rule Value:
com.company.parallels-apps-expose-service - Comment: Parallels Apps Expose Service
Note
We use LabelPrefix because it targets the LaunchAgent's label in the plist. This effectively manages the service and suppresses notifications even if the underlying script is unsigned.
This tells macOS that the background service with this label prefix is managed, suppressing the user notification.
The agent is configured via environment variables at the top of /usr/local/bin/parallels_apps_expose_service.sh.
The service supports two filter modes, controlled by the FILTER_MODE variable:
| Mode | Variable Value | Behaviour |
|---|---|---|
| Exclude (default) | FILTER_MODE=exclude |
Every app is exposed except those listed in EXCLUDED_APPS. |
| Include (allowlist) | FILTER_MODE=include |
Only apps listed in INCLUDED_APPS are exposed. Everything else is hidden. |
Leave FILTER_MODE at its default value (exclude) and list the apps you want to hide in the EXCLUDED_APPS array:
FILTER_MODE=exclude # default, can be omitted
EXCLUDED_APPS=(
"Calculator"
"Camera"
"Notepad"
# … add more apps to hide
)Set FILTER_MODE=include and list only the apps you want to expose in the INCLUDED_APPS array. All other apps will be ignored:
FILTER_MODE=include
INCLUDED_APPS=(
"Power BI Desktop"
"Excel"
# … only these apps will appear in the Windows Apps folder
)Warning
If FILTER_MODE=include is set but INCLUDED_APPS is empty, no apps will be exposed. The service will log a warning at startup to help catch this misconfiguration.
Note
Both EXCLUDED_APPS and INCLUDED_APPS entries are treated as regular expression patterns anchored to the full app name (without the .app extension). Special characters such as (, ), and . must be escaped with a backslash — for example "Microsoft 365 \(Office\)".
The following apps are excluded by default when using FILTER_MODE=exclude:
- Calculator
- Camera
- Character Map
- Click to Do (preview)
- Clock
- Command Prompt
- Copilot
- Defragment and Optimize Drives
- Dev Home
- Disk Cleanup
- Feedback Hub
- File Explorer
- Game Bar
- Get Help
- Get Started
- Live captions
- Magnifier
- Media Player
- Microsoft 365 (Office)
- Microsoft Clipchamp
- Microsoft Edge
- Microsoft News
- Microsoft Store
- Microsoft Teams
- Microsoft To Do
- Narrator
- Notepad
- ODBC Data Sources (32-bit)
- On-Screen Keyboard
- Outlook
- Paint
- Phone Link
- Photos
- Quick Assist
- Recovery Drive
- Registry Editor
- Remote Desktop Connection
- Resource Monitor
- Settings
- Snipping Tool
- Solitaire & Casual Games
- Sound Recorder
- Steps Recorder
- Sticky Notes
- System Configuration
- System Information
- Task Manager
- Terminal
- Voice access
- Weather
- Windows Backup
- Windows Media Player Legacy
- Windows PowerShell
- Windows Security
To modify the filter mode or exclusion/inclusion lists, edit the corresponding variables in the script.
Run the provided uninstall script:
sudo ./uninstall.shOr manually:
launchctl bootout gui/$(id -u) /Library/LaunchAgents/com.company.parallels-apps-expose-service.plistrm /usr/local/bin/parallels_apps_expose_service.shrm /Library/LaunchAgents/com.company.parallels-apps-expose-service.plist
Logs are written to:
~/Library/Logs/ParallelsAppsExposeService/service.log
Non classic applications (e.g., packaged as MSIX) are not detected and exposed right away. The VM restart, App start or resetting the setting "Share Windows Applications with Mac" can enforce their detection. This might be addressed in Parallels Desktop updates.
