diff --git a/scripts/Windows/Software/VisualStudio/Manage.ps1 b/scripts/Windows/Software/VisualStudio/Manage.ps1
new file mode 100644
index 00000000..ff74edaf
--- /dev/null
+++ b/scripts/Windows/Software/VisualStudio/Manage.ps1
@@ -0,0 +1,27 @@
+Import-Module "KnownFolders";
+. "$PSScriptRoot/../../Scripts/Context.ps1";
+$programs32Path = $(Get-KnownFolder "ProgramFilesX86").Path;
+$vsInstaller = "$programs32Path/Microsoft Visual Studio/Installer/vs_installer.exe";
+
+[System.Tuple[string, string, string][]]$versions = @(
+    [System.Tuple]::Create("visualstudio2019enterprise", "VisualStudio.16.Release", "Microsoft.VisualStudio.Product.Enterprise"));
+
+function Get-ConfigPath([Context] $context, [string] $packageName) {
+    return Join-Path $($context.BackupRoot()) $packageName ".vsconfig";
+}
+
+function Invoke-BackupVisualStudio([Context] $context) {
+    foreach ($version in $versions) {
+        $configPath = Get-ConfigPath $context $version[0];
+        $null = New-Item -Force -ItemType Directory "$(Split-Path -Parent $configPath)";
+
+        Start-Process -FilePath "$vsInstaller" `
+            -Wait `
+            -ArgumentList @(
+                "export",
+                "--channelId", "$($version[1])",
+                "--productId", "$($version[2])",
+                "--config", "$configPath",
+                "--quiet");
+    }
+}