diff --git a/src/vs/platform/update/common/update.ts b/src/vs/platform/update/common/update.ts
index 0f79e17..97ea778 100644
--- a/src/vs/platform/update/common/update.ts
+++ b/src/vs/platform/update/common/update.ts
@@ -48,3 +48,4 @@ export const enum UpdateType {
 	Archive,
-	Snap
+	Snap,
+	WindowsInstaller,
 }
diff --git a/src/vs/platform/update/electron-main/updateService.win32.ts b/src/vs/platform/update/electron-main/updateService.win32.ts
index 99bf807..27e77f0 100644
--- a/src/vs/platform/update/electron-main/updateService.win32.ts
+++ b/src/vs/platform/update/electron-main/updateService.win32.ts
@@ -41,5 +41,9 @@ function getUpdateType(): UpdateType {
 	if (typeof _updateType === 'undefined') {
-		_updateType = fs.existsSync(path.join(path.dirname(process.execPath), 'unins000.exe'))
-			? UpdateType.Setup
-			: UpdateType.Archive;
+		if (fs.existsSync(path.join(path.dirname(process.execPath), 'unins000.exe'))) {
+			_updateType = UpdateType.Setup;
+		} else if (path.basename(path.normalize(path.join(process.execPath, '..', '..'))) === 'Program Files') {
+			_updateType = UpdateType.WindowsInstaller;
+		} else {
+			_updateType = UpdateType.Archive;
+		}
 	}
@@ -103,6 +107,16 @@ export class Win32UpdateService extends AbstractUpdateService implements IRelaun
 
-		if (getUpdateType() === UpdateType.Archive) {
-			platform += '-archive';
-		} else if (this.productService.target === 'user') {
-			platform += '-user';
+		switch (getUpdateType()) {
+			case UpdateType.Archive:
+				platform += '-archive';
+				break;
+			case UpdateType.WindowsInstaller:
+				platform += '-msi';
+				break;
+			default:
+				if (this.productService.target === 'user') {
+					platform += '-user';
+				}
+				else {
+					platform += '-system';
+				}
 		}
@@ -257,6 +271,14 @@ export class Win32UpdateService extends AbstractUpdateService implements IRelaun
 		} else {
-			spawn(this.availableUpdate.packagePath, ['/silent', '/log', '/mergetasks=runcode,!desktopicon,!quicklaunchicon'], {
-				detached: true,
-				stdio: ['ignore', 'ignore', 'ignore']
-			});
+			const type = getUpdateType();
+			if (type == UpdateType.WindowsInstaller) {
+				spawn('msiexec.exe', ['/i', this.availableUpdate.packagePath], {
+					detached: true,
+					stdio: ['ignore', 'ignore', 'ignore']
+				});
+			} else {
+				spawn(this.availableUpdate.packagePath, ['/silent', '/log', '/mergetasks=runcode,!desktopicon,!quicklaunchicon'], {
+					detached: true,
+					stdio: ['ignore', 'ignore', 'ignore']
+				});
+			}
 		}
