Skip to content

Commit bedc191

Browse files
committed
winpackage: add ai-removal
1 parent a745a53 commit bedc191

7 files changed

Lines changed: 197 additions & 130 deletions

File tree

src/additionals/cab-installer.ps1

Lines changed: 0 additions & 29 deletions
This file was deleted.

src/lib/core/ms_store/ms_store_command.dart

Lines changed: 61 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -64,62 +64,76 @@ class MSStoreCommand extends Command<String> {
6464
final bool downloadOnly = argResults?["download-only"] ?? false;
6565

6666
for (final id in ids) {
67-
stdout.writeln('$tag Starting process - $id ($ring)');
68-
try {
69-
await _msStoreService.startProcess(id, ring);
70-
} catch (e) {
71-
stderr.writeln(e.toString());
72-
stderr.writeln('$tag Failed to get any information for $id');
73-
exit(1);
74-
}
67+
await installPackage(
68+
id: id,
69+
ring: ring,
70+
arch: arch,
71+
downloadOnly: downloadOnly,
72+
);
73+
}
74+
exit(0);
75+
}
7576

76-
if (_msStoreService.packages.isEmpty) {
77-
stderr.writeln('$tag Failed to get any information for $id');
78-
exit(1);
79-
}
77+
Future<void> installPackage({
78+
required String id,
79+
required String ring,
80+
required String arch,
81+
required bool downloadOnly,
82+
}) async {
83+
stdout.writeln('$tag Starting process - $id ($ring)');
84+
try {
85+
await _msStoreService.startProcess(id, ring);
86+
} catch (e) {
87+
stderr.writeln(e.toString());
88+
stderr.writeln('$tag Failed to get any information for $id');
89+
exit(1);
90+
}
8091

81-
stdout.writeln('$tag Downloading $id...');
82-
final downloadResult = await _msStoreService.downloadPackages(
83-
id,
84-
ring,
85-
arch,
86-
);
92+
if (_msStoreService.packages.isEmpty) {
93+
stderr.writeln('$tag Failed to get any information for $id');
94+
exit(1);
95+
}
8796

88-
if (downloadResult.isEmpty || downloadResult.first.statusCode != 200) {
89-
stderr.writeln('$tag Failed to download $id');
90-
exit(1);
91-
}
97+
stdout.writeln('$tag Downloading $id...');
98+
final downloadResult = await _msStoreService.downloadPackages(
99+
id,
100+
ring,
101+
arch,
102+
);
92103

93-
if (downloadOnly) {
94-
final downloadPath = "${_msStoreService.storeFolder}\\$id\\$ring";
95-
stdout.writeln('$tag Downloaded $id successfully');
96-
stdout.writeln(downloadPath);
97-
continue;
98-
}
104+
if (downloadResult.isEmpty || downloadResult.first.statusCode != 200) {
105+
stderr.writeln('$tag Failed to download $id');
106+
exit(1);
107+
}
99108

100-
stdout.writeln('$tag Installing $id...');
101-
final installResult = await _msStoreService.installPackages(id, ring);
109+
if (downloadOnly) {
110+
final downloadPath = "${_msStoreService.storeFolder}\\$id\\$ring";
111+
stdout.writeln('$tag Downloaded $id successfully');
112+
stdout.writeln(downloadPath);
113+
return;
114+
}
102115

103-
bool areResultsZero = true;
104-
for (final e in installResult) {
105-
if (e.exitCode != 0) {
106-
stderr.writeln(e.errText);
107-
stdout.writeln(e.outText);
108-
areResultsZero = false;
109-
break;
110-
}
111-
}
116+
stdout.writeln('$tag Installing $id...');
117+
final installResult = await _msStoreService.installPackages(id, ring);
112118

113-
if (installResult.isEmpty || !areResultsZero) {
114-
stderr.writeln('$tag Failed to install $id');
115-
exit(1);
119+
bool areResultsZero = true;
120+
for (final e in installResult) {
121+
if (e.exitCode != 0) {
122+
stderr.writeln(e.errText);
123+
stdout.writeln(e.outText);
124+
areResultsZero = false;
125+
break;
116126
}
117-
stdout.writeln('$tag Successfully installed $id');
127+
}
118128

119-
if (!downloadOnly) {
120-
await _msStoreService.cleanUpDownloads();
121-
}
129+
if (installResult.isEmpty || !areResultsZero) {
130+
stderr.writeln('$tag Failed to install $id');
131+
exit(1);
132+
}
133+
stdout.writeln('$tag Successfully installed $id');
134+
135+
if (!downloadOnly) {
136+
await _msStoreService.cleanUpDownloads();
122137
}
123-
exit(0);
124138
}
125139
}

src/lib/core/security/security_service.dart

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -346,7 +346,10 @@ class SecurityService {
346346
'RevisionEnableDefenderCMD',
347347
);
348348

349-
await _winPackageService.installPackage(WinPackageType.defenderRemoval);
349+
final packagePath = await _winPackageService.downloadPackage(
350+
WinPackageType.defenderRemoval,
351+
);
352+
await _winPackageService.installPackage(packagePath);
350353
} on Exception catch (e) {
351354
throw ('Failed to disable Windows Defender:\n\n$e');
352355
}

src/lib/core/win_updates/updates_service.dart

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -123,20 +123,7 @@ class WinUpdatesService {
123123
}
124124

125125
void enableVisibilityWU() {
126-
final currentValue = WinRegistryService.readString(
127-
RegistryHive.localMachine,
128-
r'SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer',
129-
'SettingsPageVisibility',
130-
);
131-
132-
WinRegistryService.writeRegistryValue(
133-
Registry.localMachine,
134-
r'SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer',
135-
'SettingsPageVisibility',
136-
currentValue!.endsWith(";")
137-
? currentValue.replaceAll("windowsupdate;", "")
138-
: currentValue.replaceAll("windowsupdate", ""),
139-
);
126+
WinRegistryService.unhidePageVisibilitySettings("windowsupdate");
140127
}
141128

142129
void disableVisibilityWU() {

src/lib/core/winsxs/win_package_command.dart

Lines changed: 43 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,17 @@ import 'dart:async';
22
import 'dart:io';
33

44
import 'package:args/command_runner.dart';
5+
import 'package:process_run/shell_run.dart';
6+
import 'package:revitool/core/ms_store/ms_store_command.dart';
57
import 'package:revitool/core/security/security_service.dart';
68
import 'package:revitool/core/winsxs/win_package_service.dart';
9+
import 'package:revitool/shared/win_registry_service.dart';
710

811
class WindowsPackageCommand extends Command<String> {
912
static final _winPackageService = WinPackageService();
13+
static final _msStoreCommand = MSStoreCommand();
1014
static final _securityService = SecurityService();
15+
static final _shell = Shell();
1116

1217
static const tag = "[Windows Package]";
1318

@@ -21,12 +26,20 @@ class WindowsPackageCommand extends Command<String> {
2126
argParser.addOption(
2227
'install',
2328
help: 'Install a package',
24-
allowed: const ['system-components-removal', 'defender-removal'],
29+
allowed: const [
30+
'system-components-removal',
31+
'defender-removal',
32+
'ai-removal',
33+
],
2534
);
2635
argParser.addOption(
2736
'uninstall',
2837
help: 'Uninstall a package',
29-
allowed: const ['system-components-removal', 'defender-removal'],
38+
allowed: const [
39+
'system-components-removal',
40+
'defender-removal',
41+
'ai-removal',
42+
],
3043
);
3144
}
3245

@@ -51,6 +64,8 @@ class WindowsPackageCommand extends Command<String> {
5164
return WinPackageType.systemComponentsRemoval;
5265
case 'defender-removal':
5366
return WinPackageType.defenderRemoval;
67+
case 'ai-removal':
68+
return WinPackageType.aiRemoval;
5469
default:
5570
throw Exception('Invalid package: $package');
5671
}
@@ -66,19 +81,41 @@ class WindowsPackageCommand extends Command<String> {
6681
}
6782

6883
stdout.writeln('$tag Downloading package: ${mode.packageName}');
69-
await _winPackageService.downloadPackage(mode);
84+
final packagePath = await _winPackageService.downloadPackage(mode);
7085

7186
stdout.writeln('$tag Installing package: ${mode.packageName}');
72-
await _winPackageService.installPackage(mode);
87+
await _winPackageService.installPackage(packagePath);
88+
89+
if (mode == WinPackageType.aiRemoval) {
90+
WinRegistryService.hidePageVisibilitySettings("aicomponents");
91+
WinRegistryService.hidePageVisibilitySettings("privacy-systemaimodels");
92+
await _shell.run(
93+
'PowerShell -EP Unrestricted -NonInteractive -NoLogo -NoP -C "Disable-WindowsOptionalFeature -Online -FeatureName Recall -NoRestart"',
94+
);
95+
await _shell.run(
96+
'PowerShell -EP Unrestricted -NonInteractive -NoLogo -NoP -C "Get-AppxPackage -AllUsers Microsoft.Copilot* | Remove-AppxPackage"',
97+
);
98+
}
7399
} catch (e) {
74100
stderr.writeln('$tag $e');
75101
}
76102
}
77103

78104
Future<void> _uninstallPackage(final WinPackageType packageType) async {
79105
stdout.writeln('$tag Uninstalling package: ${packageType.packageName}');
80-
if (packageType == WinPackageType.defenderRemoval) {
81-
await _securityService.enableDefender();
106+
107+
if (packageType == WinPackageType.aiRemoval) {
108+
WinRegistryService.unhidePageVisibilitySettings("aicomponents");
109+
WinRegistryService.unhidePageVisibilitySettings("privacy-systemaimodels");
110+
await _shell.run(
111+
'PowerShell -EP Unrestricted -NonInteractive -NoLogo -NoP -C "Enable-WindowsOptionalFeature -Online -FeatureName Recall -NoRestart"',
112+
);
113+
await _msStoreCommand.installPackage(
114+
id: "9nht9rb2f4hd",
115+
ring: "Retail",
116+
arch: "auto",
117+
downloadOnly: false,
118+
);
82119
}
83120
await _winPackageService.uninstallPackage(packageType);
84121
}

0 commit comments

Comments
 (0)