Repository: Fmstrat/winapps Branch: main Commit: 5431f94596ba Files: 64 Total size: 86.5 KB Directory structure: gitextract_bxio7kfp/ ├── README.md ├── apps/ │ ├── access/ │ │ └── info │ ├── access-o365/ │ │ └── info │ ├── access-o365-x86/ │ │ └── info │ ├── access-x86/ │ │ └── info │ ├── acrobat-reader-dc/ │ │ └── info │ ├── acrobat-x-pro/ │ │ └── info │ ├── adobe-cc/ │ │ └── info │ ├── aftereffects-cc/ │ │ └── info │ ├── audition-cc/ │ │ └── info │ ├── bridge-cc/ │ │ └── info │ ├── bridge-cs6/ │ │ └── info │ ├── bridge-cs6-x86/ │ │ └── info │ ├── cmd/ │ │ └── info │ ├── excel/ │ │ └── info │ ├── excel-o365/ │ │ └── info │ ├── excel-o365-x86/ │ │ └── info │ ├── excel-x86/ │ │ └── info │ ├── explorer/ │ │ └── info │ ├── iexplorer/ │ │ └── info │ ├── illustrator-cc/ │ │ └── info │ ├── indesign-cc/ │ │ └── info │ ├── lightroom-cc/ │ │ └── info │ ├── onenote/ │ │ └── info │ ├── onenote-o365/ │ │ └── info │ ├── onenote-o365-x86/ │ │ └── info │ ├── onenote-x86/ │ │ └── info │ ├── outlook/ │ │ └── info │ ├── outlook-o365/ │ │ └── info │ ├── outlook-o365-x86/ │ │ └── info │ ├── outlook-x86/ │ │ └── info │ ├── photoshop-cc/ │ │ └── info │ ├── photoshop-cs6/ │ │ └── info │ ├── photoshop-cs6-x86/ │ │ └── info │ ├── powerpoint/ │ │ └── info │ ├── powerpoint-o365/ │ │ └── info │ ├── powerpoint-o365-x86/ │ │ └── info │ ├── powerpoint-x86/ │ │ └── info │ ├── powershell/ │ │ └── info │ ├── powershell-core/ │ │ └── info │ ├── premiere-pro-cc/ │ │ └── info │ ├── project/ │ │ └── info │ ├── project-o365/ │ │ └── info │ ├── project-o365-x86/ │ │ └── info │ ├── project-x86/ │ │ └── info │ ├── publisher/ │ │ └── info │ ├── publisher-o365/ │ │ └── info │ ├── publisher-o365-x86/ │ │ └── info │ ├── publisher-x86/ │ │ └── info │ ├── vs-community-2019/ │ │ └── info │ ├── vs-enterprise-2019/ │ │ └── info │ ├── vs-professional-2019/ │ │ └── info │ ├── word/ │ │ └── info │ ├── word-o365/ │ │ └── info │ ├── word-o365-x86/ │ │ └── info │ └── word-x86/ │ └── info ├── bin/ │ └── winapps ├── docs/ │ └── KVM.md ├── install/ │ ├── ExtractPrograms.ps1 │ ├── RDPApps.reg │ └── inquirer.sh ├── installer.sh └── kvm/ ├── RDPWindows.qcow2 └── RDPWindows.xml ================================================ FILE CONTENTS ================================================ ================================================ FILE: README.md ================================================ # WinApps for Linux Run Windows apps such as Microsoft Office/Adobe in Linux (Ubuntu/Fedora) and GNOME/KDE as if they were a part of the native OS, including Nautilus integration for right clicking on files of specific mime types to open them. ***Proud to have made the top spot on [r/linux](https://www.reddit.com/r/linux) on launch day.*** ## How it works WinApps was created as an easy, one command way to include apps running inside a VM (or on any RDP server) directly into GNOME as if they were native applications. WinApps works by: - Running a Windows RDP server in a background VM container - Checking the RDP server for installed applications such as Microsoft Office - If those programs are installed, it creates shortcuts leveraging FreeRDP for both the CLI and the GNOME tray - Files in your home directory are accessible via the `\\tsclient\home` mount inside the VM - You can right click on any files in your home directory to open with an application, too ## Currently supported applications ### WinApps supports ***ANY*** installed application on your system. It does this by: 1. Scanning your system for offically configured applications (below) 2. Scanning your system for any other EXE files with install records in the Windows Registry Any officially configured applications will have support for high-resolution icons and mime types for automatically detecting what files can be opened by each application. Any other detected executable files will leverage the icons pulled from the EXE. Note: The officially configured application list below is fueled by the community, and therefore some apps may be untested by the WinApps team.
Adobe Acrobat Pro
(X)
Adobe Acrobat Reader
(DC)
Adobe After Effects
(CC)
Adobe Audition
(CC)
Adobe Bridge
(CS6, CC)
Adobe Creative Cloud
(CC)
Adobe Illustrator
(CC)
Adobe InDesign
(CC)
Adobe Lightroom
(CC)
Adobe Photoshop
(CS6, CC)
Adobe Premiere Pro
(CC)
Command Prompt
(cmd.exe)
Explorer
(File Manager)
Internet Explorer
(11)
Microsoft Access
(2016, 2019, o365)
Microsoft Excel
(2016, 2019, o365)
Microsoft Word
(2016, 2019, o365)
Microsoft OneNote
(2016, 2019, o365)
Microsoft Outlook
(2016, 2019, o365)
Microsoft PowerPoint
(2016, 2019, o365)
Microsoft Project
(2016, 2019, o365)
Microsoft Publisher
(2016, 2019, o365)
Powershell
(Standard, Core)
Visual Studio
(2019 - Ent|Pro|Com)
Windows
(Full RDP session)
  
## Documentation Latest documentation available at: [https://nowsci.com/winapps/](https://nowsci.com/winapps/) ================================================ FILE: apps/access/info ================================================ # GNOME shortcut name NAME="Access" # Used for descriptions and window class FULL_NAME="Microsoft Access" # The executable inside windows WIN_EXECUTABLE="C:\Program Files\Microsoft Office\root\Office16\MSACCESS.EXE" # GNOME categories CATEGORIES="WinApps;Office" # GNOME mimetypes MIME_TYPES="application/x-msaccess;" ================================================ FILE: apps/access-o365/info ================================================ # GNOME shortcut name NAME="Access" # Used for descriptions and window class FULL_NAME="Microsoft Access" # The executable inside windows WIN_EXECUTABLE="C:\Program Files\Microsoft Office\Office16\MSACCESS.EXE" # GNOME categories CATEGORIES="WinApps;Office" # GNOME mimetypes MIME_TYPES="application/x-msaccess;" ================================================ FILE: apps/access-o365-x86/info ================================================ # GNOME shortcut name NAME="Access" # Used for descriptions and window class FULL_NAME="Microsoft Access" # The executable inside windows WIN_EXECUTABLE="C:\Program Files (x86)\Microsoft Office\Office16\MSACCESS.EXE" # GNOME categories CATEGORIES="WinApps;Office" # GNOME mimetypes MIME_TYPES="application/x-msaccess;" ================================================ FILE: apps/access-x86/info ================================================ # GNOME shortcut name NAME="Access" # Used for descriptions and window class FULL_NAME="Microsoft Access" # The executable inside windows WIN_EXECUTABLE="C:\Program Files (x86)\Microsoft Office\root\Office16\MSACCESS.EXE" # GNOME categories CATEGORIES="WinApps;Office" # GNOME mimetypes MIME_TYPES="application/x-msaccess;" ================================================ FILE: apps/acrobat-reader-dc/info ================================================ # GNOME shortcut name NAME="Acrobat Reader DC" # Used for descriptions and window class FULL_NAME="Acrobat Reader DC" # The executable inside windows WIN_EXECUTABLE="C:\Program Files (x86)\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe" # GNOME categories CATEGORIES="WinApps;Documents" # GNOME mimetypes MIME_TYPES="application/pdf;" ================================================ FILE: apps/acrobat-x-pro/info ================================================ # GNOME shortcut name NAME="Acrobat X Pro" # Used for descriptions and window class FULL_NAME="Acrobat X Pro" # The executable inside windows WIN_EXECUTABLE="C:\Program Files (x86)\Adobe\Acrobat 10.0\Acrobat\Acrobat.exe" # GNOME categories CATEGORIES="WinApps;Documents" # GNOME mimetypes MIME_TYPES="application/pdf;" ================================================ FILE: apps/adobe-cc/info ================================================ # GNOME shortcut name NAME="Creative Cloud" # Used for descriptions and window class FULL_NAME="Adobe Creative Cloud" # The executable inside windows WIN_EXECUTABLE="C:\Program Files\Adobe\Adobe Creative Cloud\ACC\Creative Cloud.exe" # GNOME categories CATEGORIES="WinApps;Adobe" # GNOME mimetypes MIME_TYPES="" ================================================ FILE: apps/aftereffects-cc/info ================================================ # GNOME shortcut name NAME="After Effects CC" # Used for descriptions and window class FULL_NAME="Adobe After Effects CC" # The executable inside windows WIN_EXECUTABLE="C:\Program Files\Adobe\Adobe After Effects 2020\Support Files\AfterFX.exe" # GNOME categories CATEGORIES="WinApps;Adobe" # GNOME mimetypes MIME_TYPES="application/vnd.adobe.aftereffects.project;application/vnd.adobe.aftereffects.template;" ================================================ FILE: apps/audition-cc/info ================================================ # GNOME shortcut name NAME="Audition CC" # Used for descriptions and window class FULL_NAME="Adobe Audition CC" # The executable inside windows WIN_EXECUTABLE="C:\Program Files\Adobe\Adobe Audition 2020\Adobe Audition.exe" # GNOME categories CATEGORIES="WinApps;Adobe" # GNOME mimetypes MIME_TYPES="" ================================================ FILE: apps/bridge-cc/info ================================================ # GNOME shortcut name NAME="Bridge CS6" # Used for descriptions and window class FULL_NAME="Adobe Bridge CS6" # The executable inside windows WIN_EXECUTABLE="C:\Program Files\Adobe\Adobe Bridge CS6 (64 Bit)\Bridge.exe" # GNOME categories CATEGORIES="WinApps;Adobe" # GNOME mimetypes MIME_TYPES="image/vnd.adobe.photoshop;" ================================================ FILE: apps/bridge-cs6/info ================================================ # GNOME shortcut name NAME="Bridge CS6" # Used for descriptions and window class FULL_NAME="Adobe Bridge CS6" # The executable inside windows WIN_EXECUTABLE="C:\Program Files\Adobe\Adobe Bridge 2020\Bridge.exe" # GNOME categories CATEGORIES="WinApps;Adobe" # GNOME mimetypes MIME_TYPES="image/vnd.adobe.photoshop;" ================================================ FILE: apps/bridge-cs6-x86/info ================================================ # GNOME shortcut name NAME="Bridge CS6" # Used for descriptions and window class FULL_NAME="Adobe Bridge CS6" # The executable inside windows WIN_EXECUTABLE="C:\Program Files (x86)\Adobe\Adobe Bridge CS6\Bridge.exe" # GNOME categories CATEGORIES="WinApps;Adobe" # GNOME mimetypes MIME_TYPES="image/vnd.adobe.photoshop;" ================================================ FILE: apps/cmd/info ================================================ # GNOME shortcut name NAME="Cmd" # Used for descriptions and window class FULL_NAME="Command Prompt" # The executable inside windows WIN_EXECUTABLE="C:\Windows\System32\cmd.exe" # GNOME categories CATEGORIES="WinApps;Windows" # GNOME mimetypes MIME_TYPES="" ================================================ FILE: apps/excel/info ================================================ # GNOME shortcut name NAME="Excel" # Used for descriptions and window class FULL_NAME="Microsoft Excel" # The executable inside windows WIN_EXECUTABLE="C:\Program Files\Microsoft Office\Office16\EXCEL.EXE" # GNOME categories CATEGORIES="WinApps;Office" # GNOME mimetypes MIME_TYPES="application/vnd.ms-excel;application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;application/vnd.openxmlformats-officedocument.spreadsheetml.template;application/vnd.ms-excel.sheet.macroEnabled.12;application/vnd.ms-excel.template.macroEnabled.12;application/vnd.ms-excel.addin.macroEnabled.12;application/vnd.ms-excel.sheet.binary.macroEnabled.12;" ================================================ FILE: apps/excel-o365/info ================================================ # GNOME shortcut name NAME="Excel" # Used for descriptions and window class FULL_NAME="Microsoft Excel" # The executable inside windows WIN_EXECUTABLE="C:\Program Files\Microsoft Office\root\Office16\EXCEL.EXE" # GNOME categories CATEGORIES="WinApps;Office" # GNOME mimetypes MIME_TYPES="application/vnd.ms-excel;application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;application/vnd.openxmlformats-officedocument.spreadsheetml.template;application/vnd.ms-excel.sheet.macroEnabled.12;application/vnd.ms-excel.template.macroEnabled.12;application/vnd.ms-excel.addin.macroEnabled.12;application/vnd.ms-excel.sheet.binary.macroEnabled.12;" ================================================ FILE: apps/excel-o365-x86/info ================================================ # GNOME shortcut name NAME="Excel" # Used for descriptions and window class FULL_NAME="Microsoft Excel" # The executable inside windows WIN_EXECUTABLE="C:\Program Files (x86)\Microsoft Office\root\Office16\EXCEL.EXE" # GNOME categories CATEGORIES="WinApps;Office" # GNOME mimetypes MIME_TYPES="application/vnd.ms-excel;application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;application/vnd.openxmlformats-officedocument.spreadsheetml.template;application/vnd.ms-excel.sheet.macroEnabled.12;application/vnd.ms-excel.template.macroEnabled.12;application/vnd.ms-excel.addin.macroEnabled.12;application/vnd.ms-excel.sheet.binary.macroEnabled.12;" ================================================ FILE: apps/excel-x86/info ================================================ # GNOME shortcut name NAME="Excel" # Used for descriptions and window class FULL_NAME="Microsoft Excel" # The executable inside windows WIN_EXECUTABLE="C:\Program Files (x86)\Microsoft Office\Office16\EXCEL.EXE" # GNOME categories CATEGORIES="WinApps;Office" # GNOME mimetypes MIME_TYPES="application/vnd.ms-excel;application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;application/vnd.openxmlformats-officedocument.spreadsheetml.template;application/vnd.ms-excel.sheet.macroEnabled.12;application/vnd.ms-excel.template.macroEnabled.12;application/vnd.ms-excel.addin.macroEnabled.12;application/vnd.ms-excel.sheet.binary.macroEnabled.12;" ================================================ FILE: apps/explorer/info ================================================ # GNOME shortcut name NAME="Explorer" # Used for descriptions and window class FULL_NAME="Microsoft Explorer" # The executable inside windows WIN_EXECUTABLE="C:\Windows\explorer.exe" # GNOME categories CATEGORIES="WinApps;Windows" # GNOME mimetypes MIME_TYPES="" ================================================ FILE: apps/iexplorer/info ================================================ # GNOME shortcut name NAME="Internet Explorer" # Used for descriptions and window class FULL_NAME="Internet Explorer" # The executable inside windows WIN_EXECUTABLE="C:\Program Files\Internet Explorer\iexplore.exe" # GNOME categories CATEGORIES="WinApps;Office" # GNOME mimetypes MIME_TYPES="text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;image/gif;image/jpeg;image/png;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;x-scheme-handler/chrome;video/webm;application/x-xpinstall;" ================================================ FILE: apps/illustrator-cc/info ================================================ # GNOME shortcut name NAME="Illustrator CC" # Used for descriptions and window class FULL_NAME="Adobe Illustrator CC" # The executable inside windows WIN_EXECUTABLE="C:\Program Files\Adobe\Adobe Illustrator 2021\Support Files\Contents\Windows\Illustrator.exe" # GNOME categories CATEGORIES="WinApps;Adobe" # GNOME mimetypes MIME_TYPES="application/illustrator;" ================================================ FILE: apps/indesign-cc/info ================================================ # GNOME shortcut name NAME="InDesign CC" # Used for descriptions and window class FULL_NAME="Adobe InDesign CC" # The executable inside windows WIN_EXECUTABLE="C:\Program Files\Adobe\Adobe InDesign 2021\InDesign.exe" # GNOME categories CATEGORIES="WinApps;Adobe" # GNOME mimetypes MIME_TYPES="application/x-adobe-indesign-interchange;application/x-adobe-indesign;" ================================================ FILE: apps/lightroom-cc/info ================================================ # GNOME shortcut name NAME="Lightroom CC" # Used for descriptions and window class FULL_NAME="Adobe Lightroom CC" # The executable inside windows WIN_EXECUTABLE="C:\Program Files\Adobe\Adobe Lightroom CC\lightroom.exe" # GNOME categories CATEGORIES="WinApps;Adobe" # GNOME mimetypes MIME_TYPES="" ================================================ FILE: apps/onenote/info ================================================ # GNOME shortcut name NAME="OneNote" # Used for descriptions and window class FULL_NAME="Microsoft OneNote" # The executable inside windows WIN_EXECUTABLE="C:\Program Files\Microsoft Office\Office16\ONENOTE.EXE" # GNOME categories CATEGORIES="WinApps;Office" # GNOME mimetypes MIME_TYPES="application/msonenote;" ================================================ FILE: apps/onenote-o365/info ================================================ # GNOME shortcut name NAME="OneNote" # Used for descriptions and window class FULL_NAME="Microsoft OneNote" # The executable inside windows WIN_EXECUTABLE="C:\Program Files\Microsoft Office\root\Office16\ONENOTE.EXE" # GNOME categories CATEGORIES="WinApps;Office" # GNOME mimetypes MIME_TYPES="application/msonenote;" ================================================ FILE: apps/onenote-o365-x86/info ================================================ # GNOME shortcut name NAME="OneNote" # Used for descriptions and window class FULL_NAME="Microsoft OneNote" # The executable inside windows WIN_EXECUTABLE="C:\Program Files (x86)\Microsoft Office\root\Office16\ONENOTE.EXE" # GNOME categories CATEGORIES="WinApps;Office" # GNOME mimetypes MIME_TYPES="application/msonenote;" ================================================ FILE: apps/onenote-x86/info ================================================ # GNOME shortcut name NAME="OneNote" # Used for descriptions and window class FULL_NAME="Microsoft OneNote" # The executable inside windows WIN_EXECUTABLE="C:\Program Files (x86)\Microsoft Office\Office16\ONENOTE.EXE" # GNOME categories CATEGORIES="WinApps;Office" # GNOME mimetypes MIME_TYPES="application/msonenote;" ================================================ FILE: apps/outlook/info ================================================ # GNOME shortcut name NAME="Outlook" # Used for descriptions and window class FULL_NAME="Microsoft Outlook" # The executable inside windows WIN_EXECUTABLE="C:\Program Files\Microsoft Office\Office16\OUTLOOK.EXE" # GNOME categories CATEGORIES="WinApps;Office" # GNOME mimetypes MIME_TYPES="application/vnd.ms-outlook;application/octet-stream;" ================================================ FILE: apps/outlook-o365/info ================================================ # GNOME shortcut name NAME="Outlook" # Used for descriptions and window class FULL_NAME="Microsoft Outlook" # The executable inside windows WIN_EXECUTABLE="C:\Program Files\Microsoft Office\root\Office16\OUTLOOK.EXE" # GNOME categories CATEGORIES="WinApps;Office" # GNOME mimetypes MIME_TYPES="application/vnd.ms-outlook;application/octet-stream;" ================================================ FILE: apps/outlook-o365-x86/info ================================================ # GNOME shortcut name NAME="Outlook" # Used for descriptions and window class FULL_NAME="Microsoft Outlook" # The executable inside windows WIN_EXECUTABLE="C:\Program Files (x86)\Microsoft Office\root\Office16\OUTLOOK.EXE" # GNOME categories CATEGORIES="WinApps;Office" # GNOME mimetypes MIME_TYPES="application/vnd.ms-outlook;application/octet-stream;" ================================================ FILE: apps/outlook-x86/info ================================================ # GNOME shortcut name NAME="Outlook" # Used for descriptions and window class FULL_NAME="Microsoft Outlook" # The executable inside windows WIN_EXECUTABLE="C:\Program Files (x86)\Microsoft Office\Office16\OUTLOOK.EXE" # GNOME categories CATEGORIES="WinApps;Office" # GNOME mimetypes MIME_TYPES="application/vnd.ms-outlook;application/octet-stream;" ================================================ FILE: apps/photoshop-cc/info ================================================ # GNOME shortcut name NAME="Photoshop CC" # Used for descriptions and window class FULL_NAME="Adobe Photoshop CC" # The executable inside windows WIN_EXECUTABLE="C:\Program Files\Adobe\Adobe Photoshop 2020\Photoshop.exe" # GNOME categories CATEGORIES="WinApps;Adobe" # GNOME mimetypes MIME_TYPES="image/vnd.adobe.photoshop;" ================================================ FILE: apps/photoshop-cs6/info ================================================ # GNOME shortcut name NAME="Photoshop CS6" # Used for descriptions and window class FULL_NAME="Adobe Photoshop CS6" # The executable inside windows WIN_EXECUTABLE="C:\Program Files\Adobe\Adobe Photoshop CS6 (64 Bit)\Photoshop.exe" # GNOME categories CATEGORIES="WinApps;Adobe" # GNOME mimetypes MIME_TYPES="image/vnd.adobe.photoshop;" ================================================ FILE: apps/photoshop-cs6-x86/info ================================================ # GNOME shortcut name NAME="Photoshop CS6" # Used for descriptions and window class FULL_NAME="Adobe Photoshop CS6" # The executable inside windows WIN_EXECUTABLE="C:\Program Files (x86)\Adobe\Adobe Photoshop CS6\Photoshop.exe" # GNOME categories CATEGORIES="WinApps;Adobe" # GNOME mimetypes MIME_TYPES="image/vnd.adobe.photoshop;" ================================================ FILE: apps/powerpoint/info ================================================ # GNOME shortcut name NAME="PowerPoint" # Used for descriptions and window class FULL_NAME="Microsoft PowerPoint" # The executable inside windows WIN_EXECUTABLE="C:\Program Files\Microsoft Office\Office16\POWERPNT.EXE" # GNOME categories CATEGORIES="WinApps;Office" # GNOME mimetypes MIME_TYPES="application/vnd.ms-powerpoint;application/vnd.openxmlformats-officedocument.presentationml.presentation;application/vnd.openxmlformats-officedocument.presentationml.template;application/vnd.openxmlformats-officedocument.presentationml.slideshow;application/vnd.ms-powerpoint.addin.macroEnabled.12;application/vnd.ms-powerpoint.presentation.macroEnabled.12;application/vnd.ms-powerpoint.template.macroEnabled.12;application/vnd.ms-powerpoint.slideshow.macroEnabled.12;" ================================================ FILE: apps/powerpoint-o365/info ================================================ # GNOME shortcut name NAME="PowerPoint" # Used for descriptions and window class FULL_NAME="Microsoft PowerPoint" # The executable inside windows WIN_EXECUTABLE="C:\Program Files\Microsoft Office\root\Office16\POWERPNT.EXE" # GNOME categories CATEGORIES="WinApps;Office" # GNOME mimetypes MIME_TYPES="application/vnd.ms-powerpoint;application/vnd.openxmlformats-officedocument.presentationml.presentation;application/vnd.openxmlformats-officedocument.presentationml.template;application/vnd.openxmlformats-officedocument.presentationml.slideshow;application/vnd.ms-powerpoint.addin.macroEnabled.12;application/vnd.ms-powerpoint.presentation.macroEnabled.12;application/vnd.ms-powerpoint.template.macroEnabled.12;application/vnd.ms-powerpoint.slideshow.macroEnabled.12;" ================================================ FILE: apps/powerpoint-o365-x86/info ================================================ # GNOME shortcut name NAME="PowerPoint" # Used for descriptions and window class FULL_NAME="Microsoft PowerPoint" # The executable inside windows WIN_EXECUTABLE="C:\Program Files (x86)\Microsoft Office\root\Office16\POWERPNT.EXE" # GNOME categories CATEGORIES="WinApps;Office" # GNOME mimetypes MIME_TYPES="application/vnd.ms-powerpoint;application/vnd.openxmlformats-officedocument.presentationml.presentation;application/vnd.openxmlformats-officedocument.presentationml.template;application/vnd.openxmlformats-officedocument.presentationml.slideshow;application/vnd.ms-powerpoint.addin.macroEnabled.12;application/vnd.ms-powerpoint.presentation.macroEnabled.12;application/vnd.ms-powerpoint.template.macroEnabled.12;application/vnd.ms-powerpoint.slideshow.macroEnabled.12;" ================================================ FILE: apps/powerpoint-x86/info ================================================ # GNOME shortcut name NAME="PowerPoint" # Used for descriptions and window class FULL_NAME="Microsoft PowerPoint" # The executable inside windows WIN_EXECUTABLE="C:\Program Files (x86)\Microsoft Office\Office16\POWERPNT.EXE" # GNOME categories CATEGORIES="WinApps;Office" # GNOME mimetypes MIME_TYPES="application/vnd.ms-powerpoint;application/vnd.openxmlformats-officedocument.presentationml.presentation;application/vnd.openxmlformats-officedocument.presentationml.template;application/vnd.openxmlformats-officedocument.presentationml.slideshow;application/vnd.ms-powerpoint.addin.macroEnabled.12;application/vnd.ms-powerpoint.presentation.macroEnabled.12;application/vnd.ms-powerpoint.template.macroEnabled.12;application/vnd.ms-powerpoint.slideshow.macroEnabled.12;" ================================================ FILE: apps/powershell/info ================================================ # GNOME shortcut name NAME="Powershell" # Used for descriptions and window class FULL_NAME="Microsoft Powershell" # The executable inside windows WIN_EXECUTABLE="C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe" # GNOME categories CATEGORIES="WinApps;Windows" # GNOME mimetypes MIME_TYPES="" ================================================ FILE: apps/powershell-core/info ================================================ # GNOME shortcut name NAME="Powershell Core" # Used for descriptions and window class FULL_NAME="Microsoft Powershell Core" # The executable inside windows WIN_EXECUTABLE="C:\Program Files\PowerShell\7\pwsh.exe" # GNOME categories CATEGORIES="WinApps;Windows" # GNOME mimetypes MIME_TYPES="" ================================================ FILE: apps/premiere-pro-cc/info ================================================ # GNOME shortcut name NAME="Premiere Pro CC" # Used for descriptions and window class FULL_NAME="Adobe Premiere Pro CC" # The executable inside windows WIN_EXECUTABLE="C:\Program Files\Adobe\Adobe Premiere Pro 2020\Adobe Premiere Pro.exe" # GNOME categories CATEGORIES="WinApps;Adobe" # GNOME mimetypes MIME_TYPES="image/vnd.adobe.premiere;" ================================================ FILE: apps/project/info ================================================ # GNOME shortcut name NAME="Project" # Used for descriptions and window class FULL_NAME="Microsoft Project" # The executable inside windows WIN_EXECUTABLE="C:\Program Files\Microsoft Office\Office16\WINPROJ.EXE" # GNOME categories CATEGORIES="WinApps;Office" # GNOME mimetypes MIME_TYPES="application/msproj;application/msproject;application/x-msproject;application/x-ms-project;application/vnd.ms-project;" ================================================ FILE: apps/project-o365/info ================================================ # GNOME shortcut name NAME="Project" # Used for descriptions and window class FULL_NAME="Microsoft Project" # The executable inside windows WIN_EXECUTABLE="C:\Program Files\Microsoft Office\root\Office16\WINPROJ.EXE" # GNOME categories CATEGORIES="WinApps;Office" # GNOME mimetypes MIME_TYPES="application/msproj;application/msproject;application/x-msproject;application/x-ms-project;application/vnd.ms-project;" ================================================ FILE: apps/project-o365-x86/info ================================================ # GNOME shortcut name NAME="Project" # Used for descriptions and window class FULL_NAME="Microsoft Project" # The executable inside windows WIN_EXECUTABLE="C:\Program Files (x86)\Microsoft Office\root\Office16\WINPROJ.EXE" # GNOME categories CATEGORIES="WinApps;Office" # GNOME mimetypes MIME_TYPES="application/msproj;application/msproject;application/x-msproject;application/x-ms-project;application/vnd.ms-project;" ================================================ FILE: apps/project-x86/info ================================================ # GNOME shortcut name NAME="Project" # Used for descriptions and window class FULL_NAME="Microsoft Project" # The executable inside windows WIN_EXECUTABLE="C:\Program Files (x86)\Microsoft Office\Office16\WINPROJ.EXE" # GNOME categories CATEGORIES="WinApps;Office" # GNOME mimetypes MIME_TYPES="application/msproj;application/msproject;application/x-msproject;application/x-ms-project;application/vnd.ms-project;" ================================================ FILE: apps/publisher/info ================================================ # GNOME shortcut name NAME="Publisher" # Used for descriptions and window class FULL_NAME="Microsoft Publisher" # The executable inside windows WIN_EXECUTABLE="C:\Program Files\Microsoft Office\Office16\MSPUB.EXE" # GNOME categories CATEGORIES="WinApps;Office" # GNOME mimetypes MIME_TYPES="application/vnd.ms-publisher;" ================================================ FILE: apps/publisher-o365/info ================================================ # GNOME shortcut name NAME="Publisher" # Used for descriptions and window class FULL_NAME="Microsoft Publisher" # The executable inside windows WIN_EXECUTABLE="C:\Program Files\Microsoft Office\root\Office16\MSPUB.EXE" # GNOME categories CATEGORIES="WinApps;Office" # GNOME mimetypes MIME_TYPES="application/vnd.ms-publisher;" ================================================ FILE: apps/publisher-o365-x86/info ================================================ # GNOME shortcut name NAME="Publisher" # Used for descriptions and window class FULL_NAME="Microsoft Publisher" # The executable inside windows WIN_EXECUTABLE="C:\Program Files (x86)\Microsoft Office\root\Office16\MSPUB.EXE" # GNOME categories CATEGORIES="WinApps;Office" # GNOME mimetypes MIME_TYPES="application/vnd.ms-publisher;" ================================================ FILE: apps/publisher-x86/info ================================================ # GNOME shortcut name NAME="Publisher" # Used for descriptions and window class FULL_NAME="Microsoft Publisher" # The executable inside windows WIN_EXECUTABLE="C:\Program Files (x86)\Microsoft Office\Office16\MSPUB.EXE" # GNOME categories CATEGORIES="WinApps;Office" # GNOME mimetypes MIME_TYPES="application/vnd.ms-publisher;" ================================================ FILE: apps/vs-community-2019/info ================================================ # GNOME shortcut name NAME="Visual Studio 2019 Community" # Used for descriptions and window class FULL_NAME="Visual Studio 2019 Community" # The executable inside windows WIN_EXECUTABLE="C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\devenv.exe" # GNOME categories CATEGORIES="WinApps;Code" # GNOME mimetypes # See: https://stackoverflow.com/questions/208056/what-are-the-mime-types-for-net-project-source-code-files MIME_TYPES="text/xml;text/plain;text/x-csharp" ================================================ FILE: apps/vs-enterprise-2019/info ================================================ # GNOME shortcut name NAME="Visual Studio 2019 Enterprise" # Used for descriptions and window class FULL_NAME="Visual Studio 2019 Enterprise" # The executable inside windows WIN_EXECUTABLE="C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\IDE\devenv.exe" # GNOME categories CATEGORIES="WinApps;Code" # GNOME mimetypes # See: https://stackoverflow.com/questions/208056/what-are-the-mime-types-for-net-project-source-code-files MIME_TYPES="text/xml;text/plain;text/x-csharp" ================================================ FILE: apps/vs-professional-2019/info ================================================ # GNOME shortcut name NAME="Visual Studio 2019 Professional" # Used for descriptions and window class FULL_NAME="Visual Studio 2019 Professional" # The executable inside windows WIN_EXECUTABLE="C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\Common7\IDE\devenv.exe" # GNOME categories CATEGORIES="WinApps;Code" # GNOME mimetypes # See: https://stackoverflow.com/questions/208056/what-are-the-mime-types-for-net-project-source-code-files MIME_TYPES="text/xml;text/plain;text/x-csharp" ================================================ FILE: apps/word/info ================================================ # GNOME shortcut name NAME="Word" # Used for descriptions and window class FULL_NAME="Microsoft Word" # The executable inside windows WIN_EXECUTABLE="C:\Program Files\Microsoft Office\Office16\WINWORD.EXE" # GNOME categories CATEGORIES="WinApps;Office" # GNOME mimetypes MIME_TYPES="application/msword;application/vnd.openxmlformats-officedocument.wordprocessingml.document;application/vnd.openxmlformats-officedocument.wordprocessingml.template;application/vnd.ms-word.document.macroEnabled.12;application/vnd.ms-word.template.macroEnabled.12;" ================================================ FILE: apps/word-o365/info ================================================ # GNOME shortcut name NAME="Word" # Used for descriptions and window class FULL_NAME="Microsoft Word" # The executable inside windows WIN_EXECUTABLE="C:\Program Files\Microsoft Office\root\Office16\WINWORD.EXE" # GNOME categories CATEGORIES="WinApps;Office" # GNOME mimetypes MIME_TYPES="application/msword;application/vnd.openxmlformats-officedocument.wordprocessingml.document;application/vnd.openxmlformats-officedocument.wordprocessingml.template;application/vnd.ms-word.document.macroEnabled.12;application/vnd.ms-word.template.macroEnabled.12;" ================================================ FILE: apps/word-o365-x86/info ================================================ # GNOME shortcut name NAME="Word" # Used for descriptions and window class FULL_NAME="Microsoft Word" # The executable inside windows WIN_EXECUTABLE="C:\Program Files (x86)\Microsoft Office\root\Office16\WINWORD.EXE" # GNOME categories CATEGORIES="WinApps;Office" # GNOME mimetypes MIME_TYPES="application/msword;application/vnd.openxmlformats-officedocument.wordprocessingml.document;application/vnd.openxmlformats-officedocument.wordprocessingml.template;application/vnd.ms-word.document.macroEnabled.12;application/vnd.ms-word.template.macroEnabled.12;" ================================================ FILE: apps/word-x86/info ================================================ # GNOME shortcut name NAME="Word" # Used for descriptions and window class FULL_NAME="Microsoft Word" # The executable inside windows WIN_EXECUTABLE="C:\Program Files (x86)\Microsoft Office\Office16\WINWORD.EXE" # GNOME categories CATEGORIES="WinApps;Office" # GNOME mimetypes MIME_TYPES="application/msword;application/vnd.openxmlformats-officedocument.wordprocessingml.document;application/vnd.openxmlformats-officedocument.wordprocessingml.template;application/vnd.ms-word.document.macroEnabled.12;application/vnd.ms-word.template.macroEnabled.12;" ================================================ FILE: bin/winapps ================================================ #!/usr/bin/env bash if [ ! -f "${HOME}/.config/winapps/winapps.conf" ] && [ ! -f "${HOME}/.winapps" ]; then echo "You need to create a ~/.config/winapps/winapps.conf configuration. Exiting..." exit fi DIR="$(dirname "$(readlink -f "$0")")" RUN="$(date)-${RANDOM}" if [ ! -d "${HOME}/.local/share/winapps" ]; then mkdir -p "${HOME}/.local/share/winapps" fi RDP_SCALE=100 if [ -f "${HOME}/.config/winapps/winapps.conf" ]; then . "${HOME}/.config/winapps/winapps.conf" else . "${HOME}/.winapps" fi function dprint() { if [ "${DEBUG}" = "true" ]; then echo "[${RUN}] ${1}" >> "${HOME}/.local/share/winapps/winapps.log" fi } dprint "START" if [ -f "${HOME}/.local/share/winapps/run" ]; then LAST_RAN=$(stat -t -c %Y "${HOME}/.local/share/winapps/run") dprint "LAST_RAN:${LAST_RAN}" touch "${HOME}/.local/share/winapps/run" THIS_RUN=$(stat -t -c %Y "${HOME}/.local/share/winapps/run") dprint "THIS_RUN:${THIS_RUN}" if (( $THIS_RUN - $LAST_RAN < 2 )); then exit fi else touch "${HOME}/.local/share/winapps/run" fi if [ -z "$(which xfreerdp)" ]; then echo "You need xfreerdp!" echo " sudo apt-get install -y freerdp2-x11" exit fi if [ -z "${RDP_IP}" ]; then if [ -z "$(groups |grep libvirt)" ]; then echo "You are not a member of the libvirt group. Run the below then reboot." echo ' sudo usermod -a -G libvirt $(whoami)' echo ' sudo usermod -a -G kvm $(whoami)' exit fi if [ -z "$(virsh list |grep RDPWindows)" ]; then echo "RDPWindows is not running, run:" echo " virsh start RDPWindows" exit fi RDP_IP=$(virsh net-dhcp-leases default |grep RDPWindows |awk '{print $5}') RDP_IP=${RDP_IP%%\/*} fi dprint "1:${1}" dprint "2:${2}" dprint "@:${@}" MULTI_FLAG="span" if [ "${MULTIMON}" = "true" ]; then MULTI_FLAG="multimon" fi if [ "${1}" = "windows" ]; then xfreerdp ${RDP_FLAGS} /d:"${RDP_DOMAIN}" /u:"${RDP_USER}" /p:"${RDP_PASS}" /v:${RDP_IP} /scale:${RDP_SCALE} /dynamic-resolution +clipboard +auto-reconnect +home-drive /wm-class:"Microsoft Windows" 1> /dev/null 2>&1 & elif [ "${1}" = "check" ]; then dprint "CHECK" xfreerdp ${RDP_FLAGS} /d:"${RDP_DOMAIN}" /u:"${RDP_USER}" /p:"${RDP_PASS}" /v:${RDP_IP} +auto-reconnect +clipboard +home-drive -wallpaper /scale:${RDP_SCALE} /dynamic-resolution /${MULTI_FLAG} /app:"explorer.exe" elif [ "${1}" = "manual" ]; then dprint "MANUAL:${2}" xfreerdp ${RDP_FLAGS} /d:"${RDP_DOMAIN}" /u:"${RDP_USER}" /p:"${RDP_PASS}" /v:${RDP_IP} +auto-reconnect +home-drive +clipboard -wallpaper /scale:${RDP_SCALE} /dynamic-resolution /${MULTI_FLAG} /app:"${2}" 1> /dev/null 2>&1 & elif [ "${1}" != "install" ]; then dprint "DIR:${DIR}" if [ -e "${DIR}/../apps/${1}/info" ]; then . "${DIR}/../apps/${1}/info" ICON="${DIR}/../apps/${1}/icon.svg" elif [ -e "${HOME}/.local/share/winapps/apps/${1}/info" ]; then . "${HOME}/.local/share/winapps/apps/${1}/info" ICON="${HOME}/.local/share/winapps/apps/${1}/icon.svg" elif [ -e "/usr/local/share/winapps/apps/${1}/info" ]; then . "/usr/local/share/winapps/apps/${1}/info" ICON="/usr/local/share/winapps/apps/${1}/icon.svg" else echo "You need to run 'install.sh' first." exit 1 fi if [ -n "${2}" ]; then dprint "HOME:${HOME}" FILE=$(echo "${2}" | sed 's|'"${HOME}"'|\\\\tsclient\\home|;s|/|\\|g;s|\\|\\\\|g') dprint "FILE:${FILE}" xfreerdp ${RDP_FLAGS} /d:"${RDP_DOMAIN}" /u:"${RDP_USER}" /p:"${RDP_PASS}" /v:${RDP_IP} +auto-reconnect +clipboard +home-drive -wallpaper /scale:${RDP_SCALE} /dynamic-resolution /${MULTI_FLAG} /wm-class:"${FULL_NAME}" /app:"${WIN_EXECUTABLE}" /app-icon:"${ICON}" /app-cmd:"\"${FILE}\"" 1> /dev/null 2>&1 & else xfreerdp ${RDP_FLAGS} /d:"${RDP_DOMAIN}" /u:"${RDP_USER}" /p:"${RDP_PASS}" /v:${RDP_IP} +auto-reconnect +clipboard +home-drive -wallpaper /scale:${RDP_SCALE} /dynamic-resolution /${MULTI_FLAG} /wm-class:"${FULL_NAME}" /app:"${WIN_EXECUTABLE}" /app-icon:"${ICON}" 1> /dev/null 2>&1 & fi fi dprint "END" ================================================ FILE: docs/KVM.md ================================================ # Creating a Virtual Machine in KVM Latest documentation available at: https://nowsci.com/#/winapps/kvm/?id=creating-a-virtual-machine-in-kvm This step-by-step guide will take you through setting up a CPU and memory efficient virtual machine to use with WinApps leveraging KVM, an open-source virtualization software contained in most linux distributions. ## Install KVM First up, you must install KVM and the Virtual Machine Manager. By installing `virt-manager`, you will get everything you need for your distribution: ```bash sudo apt-get install -y virt-manager ``` ## Download the Windows Professional and KVM VirtIO drivers You will need Windows 10 Professional (or Enterprise or Server) to run RDP apps, Windows 10 Home will not suffice. You will also need drivers for VirtIO to ensure the best performance and lowest overhead for your system. You can download these at the following links. Windows 10 ISO: https://www.microsoft.com/en-us/software-download/windows10ISO KVM VirtIO drivers (for all distros): https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/virtio-win.iso ## Create your virtual machine The following guide will take you through the setup. If you are an expert user, you may wish to: - [Define a VM from XML (may not work on all systems)](#define-a-vm-from-xml) - [Run KVM in user mode](#run-kvm-in-user-mode) Otherwise, to set up the standard way, open `virt-manager` (Virtual Machines). ![](kvm/00.png) Next, go to `Edit`->`Preferences`, and check `Enable XML editing`, then click the `Close` button. ![](kvm/01.png) Now it is time to add a new VM by clicking the `+` button. ![](kvm/02.png) Choose `Local install media` and click `Forward`. ![](kvm/03.png) Now select the location of your Windows 10 ISO, and `Automatically detect` the installation. ![](kvm/04.png) Set your memory and CPUs. We recommend `2` CPUs and `4096MB` for memory. We will be using a Memory Ballooning service, meaning 4096 is the maximum amount of memory the VM will ever use, but will not use this amount except when it is needed. ![](kvm/05.png) Choose your virtual disk size, keep in mind this is the maximum size the disk will grow to, but it will not take up this space until it needs it. ![](kvm/06.png) Next, name your machine `RDPWindows` so that WinApps can detect it, and choose to `Customize configuration before install`. ![](kvm/07.png) After clicking `Finish`, ensure under CPU that `Copy host CPU configuration` is selected, and `Apply`. **NOTE:** Sometimes this gets turned off after Windows is installed. You should check this option after install as well. ![](kvm/08.png) Next, go to the `XML` tab, and edit the `` section to contain: ```xml ``` Then `Apply`. This will drastically reduce idle CPU usage (from ~25% to ~3%). ![](kvm/09.png) Next, under Memory, lower the `Current allocation` to the minimum memory the VM should use. We recommend `1024MB`. ![](kvm/10.png) Under `Boot options`, check `Start virtual machine on host boot up`. ![](kvm/11.png) For SATA Disk 1, set the `Disk bus` to `VirtIO`. ![](kvm/12.png) For the NIC, set the `Device model` to `virtio`. ![](kvm/13.png) Click the `Add Hardware` button in the lower right, and choose `Storage`. For `Device type`, select `CDROM device` and choose the VirtIO driver ISO you downloaded earlier. This will give the Windows 10 Installer access to drivers during the install process. Now click `Finish` to add the new CDROM device. ![](kvm/14.png) You are now ready to click `Begin Installation` ![](kvm/15.png) Now move on to installing the virtual machine. ## Install the virtual machine From here out you will install Windows 10 Professional as you would on any other machine. ![](kvm/16.png) Once you get to the point of selecting the location for installation, you will see there are no disks available. This is because we need to load the VirtIO driver. Select `Load driver`. ![](kvm/17.png) The installer will then ask you to specify where the driver is located. Select the `E:\` drive or whichever drive the VirtIO driver ISO is located on. ![](kvm/18.png) Choose the appropriate driver for the OS you have selected, which is most likely the `w10` driver for Windows 10. ![](kvm/19.png) You will now see a disk you can select for the installation. ![](kvm/20.png) Windows will begin to install, and you will likely need to reboot the VM a number times during this process. ![](kvm/21.png) At some point, you will come to a network screen. This is because the VirtIO drivers for the network have not yet been loaded. Simply click `I don't have internet`. ![](kvm/22.png) It will confirm your choice, so just choose `Continue with limited setup`. ![](kvm/23.png) After you get into Windows and login with the user you created during the install. Open up `Explorer` and navigate the `E:\` drive or wherever the VirtIO driver ISO is mounted. Double click the `virt-win-gt-64.exe` file to launch the VirtIO driver installer. ![](kvm/24.png) Leave everything as default and click `Next` through the installer. This will install device drivers as well as the Memory Ballooning service. ![](kvm/25.png) Once you finish the driver install, you will need to make some registry changes to enable RDP Applications to run on the system. Start by downloading the `RDPApps.reg` file from the WinApps repo by visiting https://github.com/Fmstrat/winapps/blob/main/install/RDPApps.reg, right clicking on the `Raw` button, and clicking on `Save target as`. ![](kvm/26.png) Once you have downloaded the registry file, right click on it, and choose `Merge`, then accept any confirmations along the way. ![](kvm/27.png) Next up, we need to rename the VM so that WinApps can locate it. Go to the start menu and type `About` to bring up the `About your PC` settings. ![](kvm/28.png) Scroll down and click on `Rename this PC` ![](kvm/29.png) Rename to `RDPWindows`, and then `Next`, but **do not** restart. ![](kvm/30.png) Lastly, scroll down to `Remote Desktop`, and toggle `Enable Remote Desktop` on, and `Confirm`. ![](kvm/31.png) At this point you will need to restart and you have completed your setup. Rather than restart you can go right ahead and install other applications like Microsoft Office or Adobe CC that could be used through WinApps. You may also wish to install the [Spice Guest Tools](https://www.spice-space.org/download/windows/spice-guest-tools/spice-guest-tools-latest.exe) inside the VM which enables features like auto-desktop resize and cut-and-paste when using `virt-manager`. As WinApps uses RDP, this is not necessary if you do not plan to access the machine via `virt-manager`. Once you are finished, restart the VM, but do not log in. Simply close the VM viewer, and close the Virtual Machine Manager. ## Expert installs ### Define a VM from XML This expert guide for XML imports is specific to Ubuntu 20.04 and may not work on all hardware platforms. You can refer to the [KVM](https://www.linux-kvm.org) documentation for specifics, but the first thing you need to do is set up a Virtual Machine running Windows 10 Professional (or any version that supports RDP). First, install KVM: ``` bash sudo apt-get install -y virt-manager ``` Now, copy your Windows ISO and VirtIO iso (links to download in the main guide) into the folder and update the `kvm/RDPWindows.xml` appropriately. Next, define a VM called RDPWindows from the sample XML file with: ``` bash virsh define kvm/RDPWindows.xml virsh autostart RDPWindows ``` You should then open the VMs properties in `virt-manager` and ensure that under CPU `Copy host CPU configuration` is selected. Boot it up, install windows, and then [Install the virtual machine](#install-the-virtual-machine). ### Run KVM in user mode Now set up KVM to run as your user instead of root and allow it through AppArmor (for Ubuntu 20.04 and above): ``` bash sudo sed -i "s/#user = "root"/user = "$(id -un)"/g" /etc/libvirt/qemu.conf sudo sed -i "s/#group = "root"/group = "$(id -gn)"/g" /etc/libvirt/qemu.conf sudo usermod -a -G kvm $(id -un) sudo usermod -a -G libvirt $(id -un) sudo systemctl restart libvirtd sudo ln -s /etc/apparmor.d/usr.sbin.libvirtd /etc/apparmor.d/disable/ ``` You will likely need to reboot to ensure your current shell is added to the group. ================================================ FILE: install/ExtractPrograms.ps1 ================================================ Function Get-Icon { <# Get-Icon License: License The MIT License (MIT) Copyright (c) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #> <# .SYNOPSIS Gets the icon from a file .DESCRIPTION Gets the icon from a file and displays it in a variety formats. .PARAMETER Path The path to a file to get the icon .PARAMETER ToBytes Displays outputs as a byte array .PARAMETER ToBitmap Display the icon as a bitmap object .PARAMETER ToBase64 Displays the icon in Base64 encoded format .NOTES Name: Get-Icon Author: Boe Prox Version History: 1.0 //Boe Prox - 11JAN2016 - Initial version .OUTPUT System.Drawing.Icon System.Drawing.Bitmap System.String System.Byte[] .EXAMPLE Get-Icon -Path 'C:\windows\system32\WindowsPowerShell\v1.0\PowerShell.exe' FullName : C:\windows\system32\WindowsPowerShell\v1.0\PowerShell.exe Handle : 164169893 Height : 32 Size : {Width=32, Height=32} Width : 32 Description ----------- Returns the System.Drawing.Icon representation of the icon .EXAMPLE Get-Icon -Path 'C:\windows\system32\WindowsPowerShell\v1.0\PowerShell.exe' -ToBitmap Tag : PhysicalDimension : {Width=32, Height=32} Size : {Width=32, Height=32} Width : 32 Height : 32 HorizontalResolution : 96 VerticalResolution : 96 Flags : 2 RawFormat : [ImageFormat: b96b3caa-0728-11d3-9d7b-0000f81ef32e] PixelFormat : Format32bppArgb Palette : System.Drawing.Imaging.ColorPalette FrameDimensionsList : {7462dc86-6180-4c7e-8e3f-ee7333a7a483} PropertyIdList : {} PropertyItems : {} Description ----------- Returns the System.Drawing.Bitmap representation of the icon .EXAMPLE $FileName = 'C:\Temp\PowerShellIcon.png' $Format = [System.Drawing.Imaging.ImageFormat]::Png (Get-Icon -Path 'C:\windows\system32\WindowsPowerShell\v1.0\PowerShell.exe' -ToBitmap).Save($FileName,$Format) Description ----------- Saves the icon as a file. .EXAMPLE Get-Icon -Path 'C:\windows\system32\WindowsPowerShell\v1.0\PowerShell.exe' -ToBase64 AAABAAEAICAQHQAAAADoAgAAFgAAACgAAAAgAAAAQAAAAAEABAAAAAAAgAIAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAgICAAMDAwAAAAP8AAP8AAAD//wD/AAAA/wD/AP //AAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABmZmZmZmZmZmZmZgAAAAAAaId3d3d3d4iIiIdgAA AHdmhmZmZmZmZmZmZoZAAAB2ZnZmZmZmZmZmZmZ3YAAAdmZ3ZmiHZniIiHZmaGAAAHZmd2Zv/4eIiIi GZmhgAAB2ZmdmZ4/4eIh3ZmZnYAAAd2ZnZmZo//h2ZmZmZ3YAAHZmaGZmZo//h2ZmZmd2AAB3Zmd2Zm Znj/h2ZmZmhgAAd3dndmZmZuj/+GZmZoYAAHd3dod3dmZuj/9mZmZ2AACHd3aHd3eIiP/4ZmZmd2AAi Hd2iIiIiI//iId2ZndgAIiIhoiIiIj//4iIiIiIYACIiId4iIiP//iIiIiIiGAAiIiIaIiI//+IiIiI iIhkAIiIiGiIiP/4iIiIiIiIdgCIiIhoiIj/iIiIiIiIiIYAiIiIeIiIiIiIiIiIiIiGAAiIiIaP/// ////////4hgAAAAAGZmZmZmZmZmZmZmYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD////////////////gA AAf4AAAD+AAAAfgAAAHAAAABwAAAAcAAAAHAAAAAwAAAAMAAAADAAAAAwAAAAMAAAABAAAAAQAAAAEA AAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAP4AAAH//////////////////////////w== Description ----------- Returns the Base64 encoded representation of the icon .EXAMPLE Get-Icon -Path 'C:\windows\system32\WindowsPowerShell\v1.0\PowerShell.exe' -ToBase64 | Clip Description ----------- Returns the Base64 encoded representation of the icon and saves it to the clipboard. .EXAMPLE (Get-Icon -Path 'C:\windows\system32\WindowsPowerShell\v1.0\PowerShell.exe' -ToBytes) -Join '' 0010103232162900002322002200040000320006400010400000128200000000000000000000000 0128001280001281280128000128012801281280012812812801921921920002550025500025525 5025500025502550255255002552552550000000000000000000000000000000000000000000000 0000000000000000000000000000000000006102102102102102102102102102102960000613611 9119119119119120136136136118000119102134102102102102102102102102102134640011810 2118102102102102102102102102102119960011810211910210413510212013613611810210496 0011810211910211125513513613613613410210496001181021031021031432481201361191021 0210396001191021031021021042552481181021021021031180011810210410210210214325513 5102102102103118001191021031181021021031432481181021021021340011911910311810210 2102232255248102102102134001191191181351191181021101432551021021021180013511911 8135119119136136255248102102102119960136119118136136136136143255136135118102119 9601361361341361361361362552551361361361361369601361361351201361361432552481361 3613613613696013613613610413613625525513613613613613613610001361361361041361362 5524813613613613613613611801361361361041361362551361361361361361361361340136136 1361201361361361361361361361361361361340813613613414325525525525525525525525524 8134000061021021021021021021021021021021020000000000000000000000000000000000000 0000000000000000000000000000000000000000000025525525525525525525525525525525525 5224003122400152240072240070007000700070003000300030003000300010001000100010000 0000000000000000000012800025400125525525525525525525525525525525525525525525525 5255255255255 Description ----------- Returns the bytes representation of the icon. -Join was used in this for the sake of displaying all of the data. #> [cmdletbinding( DefaultParameterSetName = '__DefaultParameterSetName' )] Param ( [parameter(ValueFromPipelineByPropertyName=$True)] [ValidateNotNullorEmpty()] [string]$Path, [parameter(ParameterSetName = 'Bytes')] [switch]$ToBytes, [parameter(ParameterSetName = 'Bitmap')] [switch]$ToBitmap, [parameter(ParameterSetName = 'Base64')] [switch]$ToBase64 ) Begin { If ($PSBoundParameters.ContainsKey('Debug')) { $DebugPreference = 'Continue' } Add-Type -AssemblyName System.Drawing } Process { $Path = Convert-Path -Path $Path Write-Debug $Path If (Test-Path -Path $Path) { #$Icon = [System.Drawing.Icon]::ExtractAssociatedIcon($Path)| $Icon = [System.Drawing.Icon]::ExtractAssociatedIcon($Path)| Add-Member -MemberType NoteProperty -Name FullName -Value $Path -PassThru If ($PSBoundParameters.ContainsKey('ToBytes')) { Write-Verbose "Retrieving bytes" $MemoryStream = New-Object System.IO.MemoryStream $Icon.save($MemoryStream) Write-Debug ($MemoryStream | Out-String) $MemoryStream.ToArray() $MemoryStream.Flush() $MemoryStream.Dispose() } ElseIf ($PSBoundParameters.ContainsKey('ToBitmap')) { $Icon.ToBitMap() } ElseIf ($PSBoundParameters.ContainsKey('ToBase64')) { $MemoryStream = New-Object System.IO.MemoryStream $Icon.save($MemoryStream) Write-Debug ($MemoryStream | Out-String) $Bytes = $MemoryStream.ToArray() $MemoryStream.Flush() $MemoryStream.Dispose() [convert]::ToBase64String($Bytes) } Else { $Icon } } Else { Write-Warning "$Path does not exist!" Continue } } } "NAMES=()" "ICONS=()" "EXES=()" Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\*" | Select-Object -Property "(default)" -Unique | Where-Object {$_."(default)" -ne $null} | ForEach-Object { $Exe = $_."(default)".Trim('"') $Name = (Get-Item $Exe).VersionInfo.FileDescription.Trim() -replace " "," " $Icon = Get-Icon -Path $Exe -ToBase64 #Get-ItemProperty $Exe -Name VersionInfo "NAMES+=(""$Name"")" "EXES+=(""$Exe"")" "ICONS+=(""$Icon"")" } ================================================ FILE: install/RDPApps.reg ================================================ Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Terminal Server\TSAppAllowList] "fDisabledAllowList"=dword:00000001 [HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services] "fAllowUnlistedRemotePrograms"=dword:00000001 ================================================ FILE: install/inquirer.sh ================================================ #!/usr/bin/env bash #======== Based on (then updated) https://raw.githubusercontent.com/tanhauhau/Inquirer.sh/master/dist/inquirer.sh ======== # License from: https://github.com/kahkhang/Inquirer.sh/blob/master/LICENSE # The MIT License (MIT) # Copyright (c) 2017 # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. # store the current set options OLD_SET=$- set -e arrow="$(echo -e '\xe2\x9d\xaf')" checked="$(echo -e '\xe2\x97\x89')" unchecked="$(echo -e '\xe2\x97\xaf')" down_arrow=$(echo -e '\u23f7') up_arrow=$(echo -e '\u23f6') black="$(tput setaf 0)" red="$(tput setaf 1)" green="$(tput setaf 2)" yellow="$(tput setaf 3)" blue="$(tput setaf 4)" magenta="$(tput setaf 5)" cyan="$(tput setaf 6)" white="$(tput setaf 7)" bold="$(tput bold)" normal="$(tput sgr0)" dim=$'\e[2m' print() { echo "$1" tput el } join() { local IFS=$'\n' local _join_list eval _join_list=( '"${'${1}'[@]}"' ) local first=true for item in ${_join_list[@]}; do if [ "$first" = true ]; then printf "%s" "$item" first=false else printf "${2-, }%s" "$item" fi done } function gen_env_from_options() { local IFS=$'\n' local _indices local _env_names local _checkbox_selected eval _indices=( '"${'${1}'[@]}"' ) eval _env_names=( '"${'${2}'[@]}"' ) for i in $(gen_index ${#_env_names[@]}); do _checkbox_selected[$i]=false done for i in ${_indices[@]}; do _checkbox_selected[$i]=true done for i in $(gen_index ${#_env_names[@]}); do printf "%s=%s\n" "${_env_names[$i]}" "${_checkbox_selected[$i]}" done } on_default() { true; } on_keypress() { local OLD_IFS local IFS local key OLD_IFS=$IFS local on_up=${1:-on_default} local on_down=${2:-on_default} local on_space=${3:-on_default} local on_enter=${4:-on_default} local on_left=${5:-on_default} local on_right=${6:-on_default} local on_ascii=${7:-on_default} local on_backspace=${8:-on_default} _break_keypress=false while IFS="" read -rsn1 key; do case "$key" in $'\x1b') read -rsn1 key if [[ "$key" == "[" ]]; then read -rsn1 key case "$key" in 'A') eval $on_up;; 'B') eval $on_down;; 'D') eval $on_left;; 'C') eval $on_right;; esac fi ;; ' ') eval $on_space ' ';; [a-z0-9A-Z\!\#\$\&\+\,\-\.\/\;\=\?\@\[\]\^\_\{\}\~]) eval $on_ascii $key;; $'\x7f') eval $on_backspace $key;; '') eval $on_enter $key;; esac if [ $_break_keypress = true ]; then break fi done IFS=$OLD_IFS } gen_index() { local k=$1 local l=0 if [ $k -gt 0 ]; then for l in $(seq $k) do echo "$l-1" | bc done fi } cleanup() { # Reset character attributes, make cursor visible, and restore # previous screen contents (if possible). tput sgr0 tput cnorm stty echo # Restore `set e` option to its orignal value if [[ $OLD_SET =~ e ]] then set -e else set +e fi } control_c() { cleanup exit $? } select_indices() { local _select_list local _select_indices local _select_selected=() eval _select_list=( '"${'${1}'[@]}"' ) eval _select_indices=( '"${'${2}'[@]}"' ) local _select_var_name=$3 eval $_select_var_name\=\(\) for i in $(gen_index ${#_select_indices[@]}); do eval $_select_var_name\+\=\(\""${_select_list[${_select_indices[$i]}]}"\"\) done } print_checkbox_line_arrow() { if [ "${_checkbox_selected[$1]}" = true ]; then printf "${cyan}${arrow}${green}${checked}${normal} ${_checkbox_list[$1]} ${normal}" else printf "${cyan}${arrow}${normal}${unchecked} ${_checkbox_list[$1]} ${normal}" fi } print_checkbox_line() { if [ "${_checkbox_selected[$1]}" = true ]; then printf " ${green}${checked}${normal} ${_checkbox_list[$1]} ${normal}" else printf " ${normal}${unchecked} ${_checkbox_list[$1]} ${normal}" fi } # https://www.gnu.org/software/termutils/manual/termutils-2.0/html_chapter/tput_1.html # http://linuxcommand.org/lc3_adv_tput.php on_checkbox_input_up2() { #remove_checkbox_instructions tput cub "$(tput cols)" if [ "${_checkbox_selected[$_current_index]}" = true ]; then printf " ${green}${checked}${normal} ${_checkbox_list[$_current_index]} ${normal}" else printf " ${unchecked} ${_checkbox_list[$_current_index]} ${normal}" fi tput el if [ $_current_index = 0 ]; then _current_index=$((${#_checkbox_list[@]}-1)) tput cud $((${#_checkbox_list[@]}-1)) tput cub "$(tput cols)" else _current_index=$((_current_index-1)) tput cuu1 # Up one line tput cub "$(tput cols)" # Back to beginning (does this work?) tput el # Clear to end of line fi if [ "${_checkbox_selected[$_current_index]}" = true ]; then printf "${cyan}${arrow}${green}${checked}${normal} ${_checkbox_list[$_current_index]} ${normal}" else printf "${cyan}${arrow}${normal}${unchecked} ${_checkbox_list[$_current_index]} ${normal}" fi } on_checkbox_input_up() { #remove_checkbox_instructions tput cub "$(tput cols)" if (( ${_current_row} > 0 )) || (( ${#_checkbox_list[@]} <= 5 )); then print_checkbox_line $_current_index tput el if [ $_current_index = 0 ]; then _current_index=$((${#_checkbox_list[@]}-1)) _current_row=4 tput cud $((${#_checkbox_list[@]}-1)) tput cub "$(tput cols)" else _current_index=$((_current_index-1)) _current_row=$((_current_row-1)) tput cuu1 tput cub "$(tput cols)" tput el fi print_checkbox_line_arrow $_current_index else if [ $_current_index = 0 ]; then _current_index=$((${#_checkbox_list[@]}-1)) _current_row=4 tput cuu 1 tput cub "$(tput cols)" tput el printf " ${cyan}${up_arrow}${normal}" for I in 4 3 2 1; do tput cud1 tput cub "$(tput cols)" tput el print_checkbox_line $((_current_index-I)) done tput cud1 tput cub "$(tput cols)" tput el print_checkbox_line_arrow $((_current_index)) tput cud1 tput cub "$(tput cols)" tput el printf " ${dim}${down_arrow}${normal}" tput cuu 1 else _current_index=$((_current_index-1)) tput cud 5 tput cub "$(tput cols)" tput el printf " ${cyan}${down_arrow}${normal}" for I in 4 3 2 1; do tput cuu1 tput cub "$(tput cols)" tput el print_checkbox_line $((_current_index+I)) done tput cuu1 tput cub "$(tput cols)" tput el print_checkbox_line_arrow $((_current_index)) if [ $_current_index = 0 ]; then tput cuu1 tput cub "$(tput cols)" tput el printf " ${dim}${up_arrow}${normal}" tput cud1 fi fi fi } on_checkbox_input_down() { #remove_checkbox_instructions tput cub "$(tput cols)" if (( ${_current_row} < 4 )) || (( ${#_checkbox_list[@]} <= 5 )); then print_checkbox_line $_current_index tput el if [ $_current_index = $((${#_checkbox_list[@]}-1)) ]; then _current_index=0 _current_row=0 tput cuu $((${#_checkbox_list[@]}-1)) tput cub "$(tput cols)" else _current_index=$((_current_index+1)) _current_row=$((_current_row+1)) tput cud1 tput cub "$(tput cols)" tput el fi print_checkbox_line_arrow $_current_index else if [ $_current_index = $((${#_checkbox_list[@]}-1)) ]; then _current_index=0 _current_row=0 tput cuu 5 tput cub "$(tput cols)" tput el printf " ${dim}${up_arrow}${normal}" tput cud1 tput cub "$(tput cols)" tput el print_checkbox_line_arrow $((_current_index)) for I in 1 2 3 4; do tput cud1 tput cub "$(tput cols)" tput el print_checkbox_line $((_current_index+I)) done tput cud1 tput cub "$(tput cols)" tput el printf " ${cyan}${down_arrow}${normal}" tput cuu 5 else _current_index=$((_current_index+1)) tput cuu 5 tput cub "$(tput cols)" tput el printf " ${cyan}${up_arrow}${normal}" for I in 4 3 2 1; do tput cud1 tput cub "$(tput cols)" tput el print_checkbox_line $((_current_index-I)) done tput cud1 tput cub "$(tput cols)" tput el print_checkbox_line_arrow $((_current_index)) if [ $_current_index = $((${#_checkbox_list[@]}-1)) ]; then tput cud1 tput cub "$(tput cols)" tput el printf " ${dim}${down_arrow}${normal}" tput cuu1 fi fi fi } on_checkbox_input_enter() { remove_checkbox_instructions local OLD_IFS OLD_IFS=$IFS _checkbox_selected_indices=() _checkbox_selected_options=() IFS=$'\n' for i in $(gen_index ${#_checkbox_list[@]}); do if [ "${_checkbox_selected[$i]}" = true ]; then _checkbox_selected_indices+=($i) _checkbox_selected_options+=("${_checkbox_list[$i]}") fi done if (( ${#_checkbox_list[@]} <= 5 )); then tput cud $((${#_checkbox_list[@]}-${_current_index})) tput cub "$(tput cols)" for i in $(seq $((${#_checkbox_list[@]}+1))); do tput el1 tput el tput cuu1 done else tput cud $((6-${_current_row})) tput cub "$(tput cols)" for i in $(seq 8); do tput el1 tput el tput cuu1 done fi tput cub "$(tput cols)" tput cuf $((${#prompt}+3)) printf "${cyan}$(join _checkbox_selected_options)${normal}" tput el tput cud1 tput cub "$(tput cols)" tput el _break_keypress=true IFS=$OLD_IFS } on_checkbox_input_space() { #remove_checkbox_instructions tput cub "$(tput cols)" tput el if [ "${_checkbox_selected[$_current_index]}" = true ]; then _checkbox_selected[$_current_index]=false else _checkbox_selected[$_current_index]=true fi print_checkbox_line_arrow $_current_index } remove_checkbox_instructions() { if [ $_first_keystroke = true ]; then tput cuu $((${_current_index}+1)) tput cub "$(tput cols)" tput cuf $((${#prompt}+3)) tput el tput cud $((${_current_index}+1)) _first_keystroke=false fi } # for vim movements on_checkbox_input_ascii() { local key=$1 case $key in "j" ) on_checkbox_input_down;; "k" ) on_checkbox_input_up;; esac } _checkbox_input() { local i local j prompt=$1 eval _checkbox_list=( '"${'${2}'[@]}"' ) _current_index=0 _current_row=0 _first_keystroke=true trap control_c SIGINT EXIT stty -echo tput civis print "${normal}${green}?${normal} ${bold}${prompt}${normal} ${dim}(Press to select, to finalize)${normal}" for i in $(gen_index ${#_checkbox_list[@]}); do _checkbox_selected[$i]=false done if [ -n "$3" ]; then eval _selected_indices=( '"${'${3}'[@]}"' ) for i in ${_selected_indices[@]}; do _checkbox_selected[$i]=true done fi if (( ${#_checkbox_list[@]} > 5 )); then tput cub "$(tput cols)" print " ${dim}${up_arrow}${normal}" fi for i in $(gen_index ${#_checkbox_list[@]}); do tput cub "$(tput cols)" if [ $i = 0 ]; then print_checkbox_line_arrow $i else print_checkbox_line $i fi print "" tput el if (( $i > 3 )) && (( ${#_checkbox_list[@]} > 5 )); then print " ${cyan}${down_arrow}${normal}" break fi done for j in $(gen_index ${#_checkbox_list[@]}); do tput cuu1 if (( $j > 4 )); then break fi done on_keypress on_checkbox_input_up on_checkbox_input_down on_checkbox_input_space on_checkbox_input_enter on_default on_default on_checkbox_input_ascii } checkbox_input() { _checkbox_input "$1" "$2" _checkbox_input_output_var_name=$3 select_indices _checkbox_list _checkbox_selected_indices $_checkbox_input_output_var_name unset _checkbox_list unset _break_keypress unset _first_keystroke unset _current_index unset _checkbox_input_output_var_name unset _checkbox_selected_indices unset _checkbox_selected_options cleanup } checkbox_input_indices() { _checkbox_input "$1" "$2" "$3" _checkbox_input_output_var_name=$3 eval $_checkbox_input_output_var_name\=\(\) for i in $(gen_index ${#_checkbox_selected_indices[@]}); do eval $_checkbox_input_output_var_name\+\=\(${_checkbox_selected_indices[$i]}\) done unset _checkbox_list unset _break_keypress unset _first_keystroke unset _current_index unset _checkbox_input_output_var_name unset _checkbox_selected_indices unset _checkbox_selected_options cleanup } on_list_input_up() { remove_list_instructions tput cub "$(tput cols)" printf " ${_list_options[$_list_selected_index]}" tput el if [ $_list_selected_index = 0 ]; then _list_selected_index=$((${#_list_options[@]}-1)) tput cud $((${#_list_options[@]}-1)) tput cub "$(tput cols)" else _list_selected_index=$((_list_selected_index-1)) tput cuu1 tput cub "$(tput cols)" tput el fi printf "${cyan}${arrow} %s ${normal}" "${_list_options[$_list_selected_index]}" } on_list_input_down() { remove_list_instructions tput cub "$(tput cols)" printf " ${_list_options[$_list_selected_index]}" tput el if [ $_list_selected_index = $((${#_list_options[@]}-1)) ]; then _list_selected_index=0 tput cuu $((${#_list_options[@]}-1)) tput cub "$(tput cols)" else _list_selected_index=$((_list_selected_index+1)) tput cud1 tput cub "$(tput cols)" tput el fi printf "${cyan}${arrow} %s ${normal}" "${_list_options[$_list_selected_index]}" } on_list_input_enter_space() { local OLD_IFS OLD_IFS=$IFS IFS=$'\n' tput cud $((${#_list_options[@]}-${_list_selected_index})) tput cub "$(tput cols)" for i in $(seq $((${#_list_options[@]}+1))); do tput el1 tput el tput cuu1 done tput cub "$(tput cols)" tput cuf $((${#prompt}+3)) printf "${cyan}${_list_options[$_list_selected_index]}${normal}" tput el tput cud1 tput cub "$(tput cols)" tput el _break_keypress=true IFS=$OLD_IFS } remove_list_instructions() { if [ $_first_keystroke = true ]; then tput cuu $((${_list_selected_index}+1)) tput cub "$(tput cols)" tput cuf $((${#prompt}+3)) tput el tput cud $((${_list_selected_index}+1)) _first_keystroke=false fi } _list_input() { local i local j prompt=$1 eval _list_options=( '"${'${2}'[@]}"' ) _list_selected_index=0 _first_keystroke=true trap control_c SIGINT EXIT stty -echo tput civis print "${normal}${green}?${normal} ${bold}${prompt}${normal} ${dim}(Use arrow keys)${normal}" for i in $(gen_index ${#_list_options[@]}); do tput cub "$(tput cols)" if [ $i = 0 ]; then print "${cyan}${arrow} ${_list_options[$i]} ${normal}" else print " ${_list_options[$i]}" fi tput el done for j in $(gen_index ${#_list_options[@]}); do tput cuu1 done on_keypress on_list_input_up on_list_input_down on_list_input_enter_space on_list_input_enter_space } list_input() { _list_input "$1" "$2" local var_name=$3 eval $var_name=\'"${_list_options[$_list_selected_index]}"\' unset _list_selected_index unset _list_options unset _break_keypress unset _first_keystroke cleanup } list_input_index() { _list_input "$1" "$2" local var_name=$3 eval $var_name=\'"$_list_selected_index"\' unset _list_selected_index unset _list_options unset _break_keypress unset _first_keystroke cleanup } on_text_input_left() { remove_regex_failed if [ $_current_pos -gt 0 ]; then tput cub1 _current_pos=$(($_current_pos-1)) fi } on_text_input_right() { remove_regex_failed if [ $_current_pos -lt ${#_text_input} ]; then tput cuf1 _current_pos=$(($_current_pos+1)) fi } on_text_input_enter() { remove_regex_failed if [[ "$_text_input" =~ $_text_input_regex && "$(eval $_text_input_validator "$_text_input")" = true ]]; then tput cub "$(tput cols)" tput cuf $((${#_read_prompt}-19)) printf "${cyan}${_text_input}${normal}" tput el tput cud1 tput cub "$(tput cols)" tput el eval $var_name=\'"${_text_input}"\' _break_keypress=true else _text_input_regex_failed=true tput civis tput cud1 tput cub "$(tput cols)" tput el printf "${red}>>${normal} $_text_input_regex_failed_msg" tput cuu1 tput cub "$(tput cols)" tput cuf $((${#_read_prompt}-19)) tput el _text_input="" _current_pos=0 tput cnorm fi } on_text_input_ascii() { remove_regex_failed local c=$1 if [ "$c" = '' ]; then c=' ' fi local rest="${_text_input:$_current_pos}" _text_input="${_text_input:0:$_current_pos}$c$rest" _current_pos=$(($_current_pos+1)) tput civis printf "$c$rest" tput el if [ ${#rest} -gt 0 ]; then tput cub ${#rest} fi tput cnorm } on_text_input_backspace() { remove_regex_failed if [ $_current_pos -gt 0 ]; then local start="${_text_input:0:$(($_current_pos-1))}" local rest="${_text_input:$_current_pos}" _current_pos=$(($_current_pos-1)) tput cub 1 tput el tput sc printf "$rest" tput rc _text_input="$start$rest" fi } remove_regex_failed() { if [ $_text_input_regex_failed = true ]; then _text_input_regex_failed=false tput sc tput cud1 tput el1 tput el tput rc fi } text_input_default_validator() { echo true; } text_input() { local prompt=$1 local var_name=$2 local _text_input_regex="${3:-"\.+"}" local _text_input_regex_failed_msg=${4:-"Input validation failed"} local _text_input_validator=${5:-text_input_default_validator} local _read_prompt_start=$'\e[32m?\e[39m\e[1m' local _read_prompt_end=$'\e[22m' local _read_prompt="$( echo "$_read_prompt_start ${prompt} $_read_prompt_end")" local _current_pos=0 local _text_input_regex_failed=false local _text_input="" printf "$_read_prompt" trap control_c SIGINT EXIT stty -echo tput cnorm on_keypress on_default on_default on_text_input_ascii on_text_input_enter on_text_input_left on_text_input_right on_text_input_ascii on_text_input_backspace eval $var_name=\'"${_text_input}"\' cleanup } # ============================================================= function menuFromCmd() { local mLOCALRESULT=$1 local mRESULT='' read -r -a ARRAY <<< $3 list_input "$2" ARRAY mRESULT eval $mLOCALRESULT="'$mRESULT'" } function menuFromArr() { local mLOCALRESULT=$1 shift local PROMPT=$1 shift local ARRAY=("$@") list_input "$PROMPT" ARRAY mRESULT eval $mLOCALRESULT="'$mRESULT'" } function multiFromArr() { local mLOCALRESULT=$1 shift local PROMPT=$1 shift local ARRAY=("$@") checkbox_input "$PROMPT" ARRAY mRESULT eval $mLOCALRESULT="'$mRESULT'" } ================================================ FILE: installer.sh ================================================ #!/usr/bin/env bash DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" MAKEDEMO=0 USEDEMO=0 . "${DIR}/install/inquirer.sh" INSTALLED_EXES=() function waUsage() { echo 'Usage: ./installer.sh --user # Install everything in ${HOME} ./installer.sh --system # Install everything in /usr' exit } function waNoSudo() { echo 'You are attempting to switch from a --system install to a --user install. Please run "./installer.sh --system --uninstall" first.' exit } function waInstall() { ${SUDO} mkdir -p "${SYS_PATH}/apps" . "${DIR}/bin/winapps" install } function waFindInstalled() { echo -n " Checking for installed apps in RDP machine (this may take a while)..." if [ $USEDEMO != 1 ]; then rm -f ${HOME}/.local/share/winapps/installed.bat rm -f ${HOME}/.local/share/winapps/installed.tmp rm -f ${HOME}/.local/share/winapps/installed rm -f ${HOME}/.local/share/winapps/detected cp "${DIR}/install/ExtractPrograms.ps1" ${HOME}/.local/share/winapps/ExtractPrograms.ps1 for F in $(ls "${DIR}/apps"); do . "${DIR}/apps/${F}/info" echo "IF EXIST \"${WIN_EXECUTABLE}\" ECHO ${F} >> \\\\tsclient\\home\\.local\\share\\winapps\\installed.tmp" >> ${HOME}/.local/share/winapps/installed.bat done; echo "powershell.exe -ExecutionPolicy Bypass -File \\\\tsclient\\home\\.local\\share\\winapps\\ExtractPrograms.ps1 > \\\\tsclient\home\\.local\\share\\winapps\\detected" >> ${HOME}/.local/share/winapps/installed.bat echo "RENAME \\\\tsclient\\home\\.local\\share\\winapps\\installed.tmp installed" >> ${HOME}/.local/share/winapps/installed.bat xfreerdp /d:"${RDP_DOMAIN}" /u:"${RDP_USER}" /p:"${RDP_PASS}" /v:${RDP_IP} +auto-reconnect +home-drive -wallpaper /span /wm-class:"RDPInstaller" /app:"C:\Windows\System32\cmd.exe" /app-icon:"${DIR}/../icons/windows.svg" /app-cmd:"/C \\\\tsclient\\home\\.local\\share\\winapps\\installed.bat" 1> /dev/null 2>&1 & COUNT=0 while [ ! -f "${HOME}/.local/share/winapps/installed" ]; do sleep 5 COUNT=$((COUNT + 1)) if (( COUNT == 15 )); then echo " Finished." echo "" echo "The RDP connection failed to connect or run. Please confirm FreeRDP can connect with:" echo " bin/winapps check" echo "" echo "If it cannot connect, this is most likely due to:" echo " - You need to accept the security cert the first time you connect (with 'check')" echo " - Not enabling RDP in the Windows VM" echo " - Not being able to connect to the IP of the VM" echo " - Incorrect user credentials in winapps.conf" echo " - Not merging install/RDPApps.reg into the VM" exit fi done if [ $MAKEDEMO = 1 ]; then rm -rf /tmp/winapps_demo cp -a ${HOME}/.local/share/winapps /tmp/winapps_demo exit fi else rm -rf ${HOME}/.local/share/winapps cp -a /tmp/winapps_demo ${HOME}/.local/share/winapps #sleep 3 fi echo " Finished." } function waConfigureApp() { . "${SYS_PATH}/apps/${1}/info" echo -n " Configuring ${NAME}..." if [ ${USEDEMO} != 1 ]; then ${SUDO} rm -f "${APP_PATH}/${1}.desktop" echo "[Desktop Entry] Name=${NAME} Exec=${BIN_PATH}/winapps ${1} %F Terminal=false Type=Application Icon=${SYS_PATH}/apps/${1}/icon.${2} StartupWMClass=${FULL_NAME} Comment=${FULL_NAME} Categories=${CATEGORIES} MimeType=${MIME_TYPES} " |${SUDO} tee "${APP_PATH}/${1}.desktop" > /dev/null ${SUDO} rm -f "${BIN_PATH}/${1}" echo "#!/usr/bin/env bash ${BIN_PATH}/winapps ${1} $@ " |${SUDO} tee "${BIN_PATH}/${1}" > /dev/null ${SUDO} chmod a+x "${BIN_PATH}/${1}" fi echo " Finished." } function waConfigureApps() { APPS=() for F in $(cat "${HOME}/.local/share/winapps/installed" |sed 's/\r/\n/g'); do . "${DIR}/apps/${F}/info" APPS+=("${FULL_NAME} (${F})") INSTALLED_EXES+=("$(echo "${WIN_EXECUTABLE##*\\}" |tr '[:upper:]' '[:lower:]')") done IFS=$'\n' APPS=($(sort <<<"${APPS[*]}")) unset IFS OPTIONS=("Set up all detected pre-configured applications" "Select which pre-configured applications to set up" "Do not set up any pre-configured applications") menuFromArr APP_INSTALL "How would you like to handle WinApps pre-configured applications?" "${OPTIONS[@]}" if [ "${APP_INSTALL}" = "Select which pre-configured applications to set up" ]; then checkbox_input "Which pre-configured apps would you like to set up?" APPS SELECTED_APPS echo "" > "${HOME}/.local/share/winapps/installed" for F in "${SELECTED_APPS[@]}"; do APP="${F##*(}" APP="${APP%%)}" echo "${APP}" >> "${HOME}/.local/share/winapps/installed" done fi ${SUDO} cp "${DIR}/bin/winapps" "${BIN_PATH}/winapps" COUNT=0 if [ "${APP_INSTALL}" != "Do not set up any pre-configured applications" ]; then for F in $(cat "${HOME}/.local/share/winapps/installed" |sed 's/\r/\n/g'); do COUNT=$((COUNT + 1)) ${SUDO} cp -r "apps/${F}" "${SYS_PATH}/apps" waConfigureApp "${F}" svg done fi rm -f "${HOME}/.local/share/winapps/installed" rm -f "${HOME}/.local/share/winapps/installed.bat" if (( $COUNT == 0 )); then echo " No configured applications." fi } function waConfigureDetectedApps() { if [ -f "${HOME}/.local/share/winapps/detected" ]; then sed -i 's/\r//g' "${HOME}/.local/share/winapps/detected" . "${HOME}/.local/share/winapps/detected" APPS=() for I in "${!NAMES[@]}"; do EXE=${EXES[$I]##*\\} EXE_LOWER=$(echo "${EXE}" |tr '[:upper:]' '[:lower:]') if ( dlm=$'\x1F' ; IFS="$dlm" ; [[ "$dlm${INSTALLED_EXES[*]}$dlm" != *"$dlm${EXE_LOWER}$dlm"* ]] ) ; then APPS+=("${NAMES[$I]} (${EXE})") fi done IFS=$'\n' APPS=($(sort <<<"${APPS[*]}")) unset IFS OPTIONS=("Set up all detected applications" "Select which applications to set up" "Do not set up any applications") menuFromArr APP_INSTALL "How would you like to handle other detected applications?" "${OPTIONS[@]}" if [ "${APP_INSTALL}" = "Select which applications to set up" ]; then checkbox_input "Which other apps would you like to set up?" APPS SELECTED_APPS echo "" > "${HOME}/.local/share/winapps/installed" for F in "${SELECTED_APPS[@]}"; do EXE="${F##*(}" EXE="${EXE%%)}" APP="${F% (*}" echo "${EXE}|${APP}" >> "${HOME}/.local/share/winapps/installed" done elif [ "${APP_INSTALL}" = "Set up all detected applications" ]; then for I in "${!EXES[@]}"; do EXE=${EXES[$I]##*\\} echo "${EXE}|${NAMES[$I]}" >> "${HOME}/.local/share/winapps/installed" done fi COUNT=0 if [ -f "${HOME}/.local/share/winapps/installed" ]; then while read LINE; do EXE="${LINE%|*}" NAME="${LINE#*|}" for I in "${!NAMES[@]}"; do if [ "${NAME}" = "${NAMES[$I]}" ] && [[ "${EXES[$I]}" == *"\\${EXE}" ]]; then EXE=$(echo "${EXE}" |tr '[:upper:]' '[:lower:]') ${SUDO} mkdir -p "${SYS_PATH}/apps/${EXE}" echo "# GNOME shortcut name NAME=\"${NAME}\" # Used for descriptions and window class FULL_NAME=\"${NAME}\" # The executable inside windows WIN_EXECUTABLE=\"${EXES[$I]}\" # GNOME categories CATEGORIES=\"WinApps\" # GNOME mimetypes MIME_TYPES=\"\" " > "${SYS_PATH}/apps/${EXE}/info" echo "${ICONS[$I]}" | base64 -d > "${SYS_PATH}/apps/${EXE}/icon.ico" waConfigureApp "${EXE}" ico COUNT=$((COUNT + 1)) fi done done < "${HOME}/.local/share/winapps/installed" rm -f "${HOME}/.local/share/winapps/installed" fi rm -f "${HOME}/.local/share/winapps/installed.bat" if (( $COUNT == 0 )); then echo " No configured applications." fi fi } function waConfigureWindows() { echo -n " Configuring Windows..." if [ ${USEDEMO} != 1 ]; then ${SUDO} rm -f "${APP_PATH}/windows.desktop" ${SUDO} mkdir -p "${SYS_PATH}/icons" ${SUDO} cp "${DIR}/icons/windows.svg" "${SYS_PATH}/icons/windows.svg" echo "[Desktop Entry] Name=Windows Exec=${BIN_PATH}/winapps windows %F Terminal=false Type=Application Icon=${SYS_PATH}/icons/windows.svg StartupWMClass=Micorosoft Windows Comment=Micorosoft Windows Categories=Windows " |${SUDO} tee "${APP_PATH}/windows.desktop" > /dev/null ${SUDO} rm -f "${BIN_PATH}/windows" echo "#!/usr/bin/env bash ${BIN_PATH}/winapps windows " |${SUDO} tee "/${BIN_PATH}/windows" > /dev/null ${SUDO} chmod a+x "${BIN_PATH}/windows" fi echo " Finished." } function waUninstallUser() { rm -f "${HOME}/.local/bin/winapps" rm -rf "${HOME}/.local/share/winapps" for F in $(grep -l -d skip "bin/winapps" "${HOME}/.local/share/applications/"*); do echo -n " Removing ${F}..." ${SUDO} rm ${F} echo " Finished." done for F in $(grep -l -d skip "bin/winapps" "${HOME}/.local/bin/"*); do echo -n " Removing ${F}..." ${SUDO} rm ${F} echo " Finished." done } function waUninstallSystem() { ${SUDO} rm -f "/usr/local/bin/winapps" ${SUDO} rm -rf "/usr/local/share/winapps" for F in $(grep -l -d skip "bin/winapps" "/usr/share/applications/"*); do if [ -z "${SUDO}" ]; then waNoSudo fi echo -n " Removing ${F}..." ${SUDO} rm ${F} echo " Finished." done for F in $(grep -l -d skip "bin/winapps" "/usr/local/bin/"*); do if [ -z "${SUDO}" ]; then waNoSudo fi echo -n " Removing ${F}..." ${SUDO} rm ${F} echo " Finished." done } if [ -z "${1}" ]; then OPTIONS=(User System) menuFromArr INSTALL_TYPE "Would you like to install for the current user or the whole system?" "${OPTIONS[@]}" elif [ "${1}" = '--user' ]; then INSTALL_TYPE='User' elif [ "${1}" = '--system' ]; then INSTALL_TYPE='System' else waUsage fi if [ "${INSTALL_TYPE}" = 'User' ]; then SUDO="" BIN_PATH="${HOME}/.local/bin" APP_PATH="${HOME}/.local/share/applications" SYS_PATH="${HOME}/.local/share/winapps" if [ -n "${2}" ]; then if [ "${2}" = '--uninstall' ]; then # Uninstall echo "Uninstalling..." waUninstallUser exit else usage fi fi elif [ "${INSTALL_TYPE}" = 'System' ]; then SUDO="sudo" sudo ls > /dev/null BIN_PATH="/usr/local/bin" APP_PATH="/usr/share/applications" SYS_PATH="/usr/local/share/winapps" if [ -n "${2}" ]; then if [ "${2}" = '--uninstall' ]; then # Uninstall echo "Uninstalling..." waUninstallSystem exit else usage fi fi fi echo "Removing any old configurations..." waUninstallUser waUninstallSystem echo "Installing..." # Inititialize waInstall # Check for installed apps waFindInstalled # Install windows waConfigureWindows # Configure apps waConfigureApps waConfigureDetectedApps echo "Installation complete." ================================================ FILE: kvm/RDPWindows.xml ================================================ RDPWindows 50f121b4-93e7-46b5-b302-902d022dfa9c 4194304 1298432 2 /machine hvm Haswell-noTSX-IBRS Intel destroy restart destroy /usr/bin/qemu-system-x86_64