@@ -325,68 +325,76 @@ class SecurityServiceImpl implements SecurityService {
325325 @override
326326 Future <void > disableDefender () async {
327327 try {
328- await WinPackageService .downloadPackage (WinPackageType .defenderRemoval);
329-
330- await Future .wait ([
331- WinRegistryService .writeRegistryValue (
332- Registry .localMachine,
333- r'SOFTWARE\Policies\Microsoft\Windows Defender' ,
334- 'DisableAntiSpyware' ,
335- 1 ,
336- ),
337- WinRegistryService .writeRegistryValue (
338- Registry .localMachine,
339- r'SOFTWARE\Policies\Microsoft\Windows Defender' ,
340- 'DisableAntiVirus' ,
341- 1 ,
342- ),
343- WinRegistryService .writeRegistryValue (
344- Registry .localMachine,
345- r'SOFTWARE\Policies\Microsoft\Windows Defender\Real-Time Protection' ,
346- 'DisableRealtimeMonitoring' ,
347- 1 ,
348- ),
349- ]);
350-
351- await runPSCommand (
352- r'& $env:SystemRoot\System32\gpupdate.exe /Target:Computer /Force' ,
328+ final String packagePath = await WinPackageService .downloadPackage (
329+ WinPackageType .defenderRemoval,
353330 );
354331
355- if (File (_mpCmdRunString).existsSync ()) {
332+ /// Internal helper
333+ Future <void > applyPolicyWrites () async {
334+ await Future .wait ([
335+ WinRegistryService .writeRegistryValue (
336+ Registry .localMachine,
337+ r'SOFTWARE\Policies\Microsoft\Windows Defender' ,
338+ 'DisableAntiSpyware' ,
339+ 1 ,
340+ ),
341+ WinRegistryService .writeRegistryValue (
342+ Registry .localMachine,
343+ r'SOFTWARE\Policies\Microsoft\Windows Defender' ,
344+ 'DisableAntiVirus' ,
345+ 1 ,
346+ ),
347+ WinRegistryService .writeRegistryValue (
348+ Registry .localMachine,
349+ r'SOFTWARE\Policies\Microsoft\Windows Defender\Real-Time Protection' ,
350+ 'DisableRealtimeMonitoring' ,
351+ 1 ,
352+ ),
353+ ]);
356354 await runPSCommand (
357- 'Start-Process -FilePath "$ _mpCmdRunString " -ArgumentList "-RemoveDefinitions -All" -NoNewWindow -Wait ' ,
355+ r'& $env:SystemRoot\System32\gpupdate.exe /Target:Computer /Force ' ,
358356 );
357+ if (File (_mpCmdRunString).existsSync ()) {
358+ await runPSCommand (
359+ 'Start-Process -FilePath "$_mpCmdRunString " -ArgumentList "-RemoveDefinitions -All" -NoNewWindow -Wait' ,
360+ );
361+ }
359362 }
360363
361- await Future .wait ([
362- WinRegistryService .writeRegistryValue (
363- Registry .localMachine,
364- r'SOFTWARE\Microsoft\Windows Defender' ,
365- 'DisableAntiSpyware' ,
366- 1 ,
367- ),
368- WinRegistryService .writeRegistryValue (
369- Registry .localMachine,
370- r'SOFTWARE\Microsoft\Windows Defender' ,
371- 'DisableAntiVirus' ,
372- 1 ,
373- ),
374- WinRegistryService .writeRegistryValue (
375- Registry .localMachine,
376- r'System\ControlSet001\Services\MDCoreSvc' ,
377- 'Start' ,
378- 4 ,
379- ),
380- WinRegistryService .deleteValue (
381- Registry .localMachine,
382- r'SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce' ,
383- 'RevisionEnableDefenderCMD' ,
384- ),
385- ]);
364+ await applyPolicyWrites ();
386365
387- final String packagePath = await WinPackageService .downloadPackage (
388- WinPackageType .defenderRemoval,
366+ await WinRegistryService .writeRegistryValue (
367+ Registry .localMachine,
368+ r'SOFTWARE\Microsoft\Windows Defender' ,
369+ 'DisableAntiSpyware' ,
370+ 1 ,
371+ useTrustedInstaller: true ,
389372 );
373+ await WinRegistryService .writeRegistryValue (
374+ Registry .localMachine,
375+ r'SOFTWARE\Microsoft\Windows Defender' ,
376+ 'DisableAntiVirus' ,
377+ 1 ,
378+ useTrustedInstaller: true ,
379+ );
380+
381+ // WORKAROUND: Force a second policy update after modifying the core Defender registry keys. After the January 2026 security updates, 'gpupdate' automatically removes 'DisableAntiSpyware' in the Policies path, when security intelligence updates is installed. Re-applying policies after modifying the core Defender registries ensures both locations are synchronized, resolving permission errors that occur when trying to disable Defender services directly.
382+ await applyPolicyWrites ();
383+
384+ await WinRegistryService .writeRegistryValue (
385+ Registry .localMachine,
386+ r'System\ControlSet001\Services\MDCoreSvc' ,
387+ 'Start' ,
388+ 4 ,
389+ useTrustedInstaller: true ,
390+ );
391+
392+ await WinRegistryService .deleteValue (
393+ Registry .localMachine,
394+ r'SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce' ,
395+ 'RevisionEnableDefenderCMD' ,
396+ );
397+
390398 await WinPackageService .installPackage (packagePath);
391399 } on Exception catch (e) {
392400 throw DefenderOperationException ('Failed to disable Windows Defender' , e);
0 commit comments