├── .gitignore ├── LICENSE ├── PluginClipilot ├── PluginClipilot.Designer.cs ├── PluginClipilot.cs ├── PluginClipilot.csproj ├── PluginClipilot.resx ├── Properties │ └── AssemblyInfo.cs └── packages.config ├── PluginInterface ├── IPlugin.cs ├── PluginInterface.csproj └── Properties │ └── AssemblyInfo.cs ├── PluginMSCC ├── MSCCPluginControl.Designer.cs ├── MSCCPluginControl.cs ├── MSCCPluginControl.resx ├── PluginMSCC.csproj ├── Properties │ └── AssemblyInfo.cs └── packages.config ├── PluginMSNavigator ├── MSNavigatorPluginControl.Designer.cs ├── MSNavigatorPluginControl.cs ├── MSNavigatorPluginControl.resx ├── PluginMSNavigator.csproj └── Properties │ └── AssemblyInfo.cs ├── README.md ├── SuperMSConfig.sln └── SuperMSConfig ├── AboutForm.Designer.cs ├── AboutForm.cs ├── AboutForm.resx ├── App.config ├── AppIcon.ico ├── AppIcon.png ├── BaseHabit.cs ├── BaseHabitCategory.cs ├── Config ├── AppsHabit.cs ├── RegistryHabit.cs ├── ServiceHabit.cs └── StartupHabit.cs ├── GetStartedPage.Designer.cs ├── GetStartedPage.cs ├── GetStartedPage.resx ├── HabitChecker.cs ├── Habits ├── AIHabits.cs ├── AdsHabits.cs ├── AppsHabits.cs ├── GamingHabits.cs ├── MSEdgeHabits.cs ├── PrivacyHabits.cs ├── SecurityHabits.cs ├── ServiceHabits.cs ├── StartupHabits.cs └── SystemHabits.cs ├── Helpers ├── Logger.cs └── Utils.cs ├── MainForm.Designer.cs ├── MainForm.cs ├── MainForm.resx ├── PluginLoader.cs ├── PluginsForm.Designer.cs ├── PluginsForm.cs ├── PluginsForm.resx ├── Program.cs ├── Properties ├── AssemblyInfo.cs ├── Resources.Designer.cs ├── Resources.resx ├── Settings.Designer.cs └── Settings.settings ├── SuperMSConfig.csproj ├── Templates ├── HabitFactory.cs ├── HabitTemplate.cs └── TemplateLoader.cs ├── app.manifest ├── assetCopilot.png ├── assetCopilotBW.png └── packages.config /.gitignore: -------------------------------------------------------------------------------- 1 | ## Ignore Visual Studio temporary files, build results, and 2 | ## files generated by popular Visual Studio add-ons. 3 | ## 4 | ## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore 5 | 6 | # User-specific files 7 | *.rsuser 8 | *.suo 9 | *.user 10 | *.userosscache 11 | *.sln.docstates 12 | 13 | # User-specific files (MonoDevelop/Xamarin Studio) 14 | *.userprefs 15 | 16 | # Mono auto generated files 17 | mono_crash.* 18 | 19 | # Build results 20 | [Dd]ebug/ 21 | [Dd]ebugPublic/ 22 | [Rr]elease/ 23 | [Rr]eleases/ 24 | x64/ 25 | x86/ 26 | [Ww][Ii][Nn]32/ 27 | [Aa][Rr][Mm]/ 28 | [Aa][Rr][Mm]64/ 29 | bld/ 30 | [Bb]in/ 31 | [Oo]bj/ 32 | [Ll]og/ 33 | [Ll]ogs/ 34 | 35 | # Visual Studio 2015/2017 cache/options directory 36 | .vs/ 37 | # Uncomment if you have tasks that create the project's static files in wwwroot 38 | #wwwroot/ 39 | 40 | # Visual Studio 2017 auto generated files 41 | Generated\ Files/ 42 | 43 | # MSTest test Results 44 | [Tt]est[Rr]esult*/ 45 | [Bb]uild[Ll]og.* 46 | 47 | # NUnit 48 | *.VisualState.xml 49 | TestResult.xml 50 | nunit-*.xml 51 | 52 | # Build Results of an ATL Project 53 | [Dd]ebugPS/ 54 | [Rr]eleasePS/ 55 | dlldata.c 56 | 57 | # Benchmark Results 58 | BenchmarkDotNet.Artifacts/ 59 | 60 | # .NET Core 61 | project.lock.json 62 | project.fragment.lock.json 63 | artifacts/ 64 | 65 | # ASP.NET Scaffolding 66 | ScaffoldingReadMe.txt 67 | 68 | # StyleCop 69 | StyleCopReport.xml 70 | 71 | # Files built by Visual Studio 72 | *_i.c 73 | *_p.c 74 | *_h.h 75 | *.ilk 76 | *.meta 77 | *.obj 78 | *.iobj 79 | *.pch 80 | *.pdb 81 | *.ipdb 82 | *.pgc 83 | *.pgd 84 | *.rsp 85 | *.sbr 86 | *.tlb 87 | *.tli 88 | *.tlh 89 | *.tmp 90 | *.tmp_proj 91 | *_wpftmp.csproj 92 | *.log 93 | *.tlog 94 | *.vspscc 95 | *.vssscc 96 | .builds 97 | *.pidb 98 | *.svclog 99 | *.scc 100 | 101 | # Chutzpah Test files 102 | _Chutzpah* 103 | 104 | # Visual C++ cache files 105 | ipch/ 106 | *.aps 107 | *.ncb 108 | *.opendb 109 | *.opensdf 110 | *.sdf 111 | *.cachefile 112 | *.VC.db 113 | *.VC.VC.opendb 114 | 115 | # Visual Studio profiler 116 | *.psess 117 | *.vsp 118 | *.vspx 119 | *.sap 120 | 121 | # Visual Studio Trace Files 122 | *.e2e 123 | 124 | # TFS 2012 Local Workspace 125 | $tf/ 126 | 127 | # Guidance Automation Toolkit 128 | *.gpState 129 | 130 | # ReSharper is a .NET coding add-in 131 | _ReSharper*/ 132 | *.[Rr]e[Ss]harper 133 | *.DotSettings.user 134 | 135 | # TeamCity is a build add-in 136 | _TeamCity* 137 | 138 | # DotCover is a Code Coverage Tool 139 | *.dotCover 140 | 141 | # AxoCover is a Code Coverage Tool 142 | .axoCover/* 143 | !.axoCover/settings.json 144 | 145 | # Coverlet is a free, cross platform Code Coverage Tool 146 | coverage*.json 147 | coverage*.xml 148 | coverage*.info 149 | 150 | # Visual Studio code coverage results 151 | *.coverage 152 | *.coveragexml 153 | 154 | # NCrunch 155 | _NCrunch_* 156 | .*crunch*.local.xml 157 | nCrunchTemp_* 158 | 159 | # MightyMoose 160 | *.mm.* 161 | AutoTest.Net/ 162 | 163 | # Web workbench (sass) 164 | .sass-cache/ 165 | 166 | # Installshield output folder 167 | [Ee]xpress/ 168 | 169 | # DocProject is a documentation generator add-in 170 | DocProject/buildhelp/ 171 | DocProject/Help/*.HxT 172 | DocProject/Help/*.HxC 173 | DocProject/Help/*.hhc 174 | DocProject/Help/*.hhk 175 | DocProject/Help/*.hhp 176 | DocProject/Help/Html2 177 | DocProject/Help/html 178 | 179 | # Click-Once directory 180 | publish/ 181 | 182 | # Publish Web Output 183 | *.[Pp]ublish.xml 184 | *.azurePubxml 185 | # Note: Comment the next line if you want to checkin your web deploy settings, 186 | # but database connection strings (with potential passwords) will be unencrypted 187 | *.pubxml 188 | *.publishproj 189 | 190 | # Microsoft Azure Web App publish settings. Comment the next line if you want to 191 | # checkin your Azure Web App publish settings, but sensitive information contained 192 | # in these scripts will be unencrypted 193 | PublishScripts/ 194 | 195 | # NuGet Packages 196 | *.nupkg 197 | # NuGet Symbol Packages 198 | *.snupkg 199 | # The packages folder can be ignored because of Package Restore 200 | **/[Pp]ackages/* 201 | # except build/, which is used as an MSBuild target. 202 | !**/[Pp]ackages/build/ 203 | # Uncomment if necessary however generally it will be regenerated when needed 204 | #!**/[Pp]ackages/repositories.config 205 | # NuGet v3's project.json files produces more ignorable files 206 | *.nuget.props 207 | *.nuget.targets 208 | 209 | # Microsoft Azure Build Output 210 | csx/ 211 | *.build.csdef 212 | 213 | # Microsoft Azure Emulator 214 | ecf/ 215 | rcf/ 216 | 217 | # Windows Store app package directories and files 218 | AppPackages/ 219 | BundleArtifacts/ 220 | Package.StoreAssociation.xml 221 | _pkginfo.txt 222 | *.appx 223 | *.appxbundle 224 | *.appxupload 225 | 226 | # Visual Studio cache files 227 | # files ending in .cache can be ignored 228 | *.[Cc]ache 229 | # but keep track of directories ending in .cache 230 | !?*.[Cc]ache/ 231 | 232 | # Others 233 | ClientBin/ 234 | ~$* 235 | *~ 236 | *.dbmdl 237 | *.dbproj.schemaview 238 | *.jfm 239 | *.pfx 240 | *.publishsettings 241 | orleans.codegen.cs 242 | 243 | # Including strong name files can present a security risk 244 | # (https://github.com/github/gitignore/pull/2483#issue-259490424) 245 | #*.snk 246 | 247 | # Since there are multiple workflows, uncomment next line to ignore bower_components 248 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) 249 | #bower_components/ 250 | 251 | # RIA/Silverlight projects 252 | Generated_Code/ 253 | 254 | # Backup & report files from converting an old project file 255 | # to a newer Visual Studio version. Backup files are not needed, 256 | # because we have git ;-) 257 | _UpgradeReport_Files/ 258 | Backup*/ 259 | UpgradeLog*.XML 260 | UpgradeLog*.htm 261 | ServiceFabricBackup/ 262 | *.rptproj.bak 263 | 264 | # SQL Server files 265 | *.mdf 266 | *.ldf 267 | *.ndf 268 | 269 | # Business Intelligence projects 270 | *.rdl.data 271 | *.bim.layout 272 | *.bim_*.settings 273 | *.rptproj.rsuser 274 | *- [Bb]ackup.rdl 275 | *- [Bb]ackup ([0-9]).rdl 276 | *- [Bb]ackup ([0-9][0-9]).rdl 277 | 278 | # Microsoft Fakes 279 | FakesAssemblies/ 280 | 281 | # GhostDoc plugin setting file 282 | *.GhostDoc.xml 283 | 284 | # Node.js Tools for Visual Studio 285 | .ntvs_analysis.dat 286 | node_modules/ 287 | 288 | # Visual Studio 6 build log 289 | *.plg 290 | 291 | # Visual Studio 6 workspace options file 292 | *.opt 293 | 294 | # Visual Studio 6 auto-generated workspace file (contains which files were open etc.) 295 | *.vbw 296 | 297 | # Visual Studio 6 auto-generated project file (contains which files were open etc.) 298 | *.vbp 299 | 300 | # Visual Studio 6 workspace and project file (working project files containing files to include in project) 301 | *.dsw 302 | *.dsp 303 | 304 | # Visual Studio 6 technical files 305 | *.ncb 306 | *.aps 307 | 308 | # Visual Studio LightSwitch build output 309 | **/*.HTMLClient/GeneratedArtifacts 310 | **/*.DesktopClient/GeneratedArtifacts 311 | **/*.DesktopClient/ModelManifest.xml 312 | **/*.Server/GeneratedArtifacts 313 | **/*.Server/ModelManifest.xml 314 | _Pvt_Extensions 315 | 316 | # Paket dependency manager 317 | .paket/paket.exe 318 | paket-files/ 319 | 320 | # FAKE - F# Make 321 | .fake/ 322 | 323 | # CodeRush personal settings 324 | .cr/personal 325 | 326 | # Python Tools for Visual Studio (PTVS) 327 | __pycache__/ 328 | *.pyc 329 | 330 | # Cake - Uncomment if you are using it 331 | # tools/** 332 | # !tools/packages.config 333 | 334 | # Tabs Studio 335 | *.tss 336 | 337 | # Telerik's JustMock configuration file 338 | *.jmconfig 339 | 340 | # BizTalk build output 341 | *.btp.cs 342 | *.btm.cs 343 | *.odx.cs 344 | *.xsd.cs 345 | 346 | # OpenCover UI analysis results 347 | OpenCover/ 348 | 349 | # Azure Stream Analytics local run output 350 | ASALocalRun/ 351 | 352 | # MSBuild Binary and Structured Log 353 | *.binlog 354 | 355 | # NVidia Nsight GPU debugger configuration file 356 | *.nvuser 357 | 358 | # MFractors (Xamarin productivity tool) working folder 359 | .mfractor/ 360 | 361 | # Local History for Visual Studio 362 | .localhistory/ 363 | 364 | # Visual Studio History (VSHistory) files 365 | .vshistory/ 366 | 367 | # BeatPulse healthcheck temp database 368 | healthchecksdb 369 | 370 | # Backup folder for Package Reference Convert tool in Visual Studio 2017 371 | MigrationBackup/ 372 | 373 | # Ionide (cross platform F# VS Code tools) working folder 374 | .ionide/ 375 | 376 | # Fody - auto-generated XML schema 377 | FodyWeavers.xsd 378 | 379 | # VS Code files for those working on multiple tools 380 | .vscode/* 381 | !.vscode/settings.json 382 | !.vscode/tasks.json 383 | !.vscode/launch.json 384 | !.vscode/extensions.json 385 | *.code-workspace 386 | 387 | # Local History for Visual Studio Code 388 | .history/ 389 | 390 | # Windows Installer files from build outputs 391 | *.cab 392 | *.msi 393 | *.msix 394 | *.msm 395 | *.msp 396 | 397 | # JetBrains Rider 398 | *.sln.iml 399 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 A Belim app creation (Builtbybel) 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /PluginClipilot/PluginClipilot.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace PluginClipilot 2 | { 3 | partial class PluginClipilotControl 4 | { 5 | /// 6 | /// Erforderliche Designervariable. 7 | /// 8 | private System.ComponentModel.IContainer components = null; 9 | 10 | /// 11 | /// Verwendete Ressourcen bereinigen. 12 | /// 13 | /// True, wenn verwaltete Ressourcen gelöscht werden sollen; andernfalls False. 14 | protected override void Dispose(bool disposing) 15 | { 16 | if (disposing && (components != null)) 17 | { 18 | components.Dispose(); 19 | } 20 | base.Dispose(disposing); 21 | } 22 | 23 | #region Vom Komponenten-Designer generierter Code 24 | 25 | /// 26 | /// Erforderliche Methode für die Designerunterstützung. 27 | /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden. 28 | /// 29 | private void InitializeComponent() 30 | { 31 | this.SuspendLayout(); 32 | // 33 | // PluginClipilot 34 | // 35 | this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); 36 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 37 | this.Name = "PluginClipilot"; 38 | this.Size = new System.Drawing.Size(410, 417); 39 | this.ResumeLayout(false); 40 | 41 | } 42 | 43 | #endregion 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /PluginClipilot/PluginClipilot.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Windows.Forms; 3 | using PluginInterface; 4 | using Microsoft.Web.WebView2.WinForms; 5 | 6 | namespace PluginClipilot 7 | { 8 | public partial class PluginClipilotControl : UserControl, IPlugin 9 | { 10 | private WebView2 webView; 11 | 12 | public UserControl GetControl() 13 | { 14 | return this; 15 | } 16 | 17 | public string PluginName => "Ask Clipilot"; 18 | public string PluginVersion => "1.0"; 19 | public string PluginInfo => "Displays the Microsoft Copilot in a WebView2 control."; 20 | 21 | public PluginClipilotControl() 22 | { 23 | InitializeComponent(); 24 | InitializeWebView(); 25 | } 26 | 27 | private async void InitializeWebView() 28 | { 29 | // Initialize WebView2 control 30 | webView = new WebView2 31 | { 32 | Dock = DockStyle.Fill 33 | }; 34 | 35 | Controls.Add(webView); 36 | 37 | // Wait for WebView2 to be initialized 38 | await webView.EnsureCoreWebView2Async(null); 39 | 40 | // Navigate to the Microsoft Copilot URL 41 | webView.CoreWebView2.Navigate("https://copilot.microsoft.com"); 42 | } 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /PluginClipilot/PluginClipilot.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Debug 6 | AnyCPU 7 | {279ED121-4536-4447-BD14-F67025E0A7DE} 8 | Library 9 | PluginClipilot 10 | PluginClipilot 11 | v4.8 12 | 512 13 | true 14 | 15 | 16 | 17 | 18 | true 19 | full 20 | false 21 | bin\Debug\ 22 | DEBUG;TRACE 23 | prompt 24 | 4 25 | 26 | 27 | pdbonly 28 | true 29 | bin\Release\ 30 | TRACE 31 | prompt 32 | 4 33 | 34 | 35 | 36 | ..\packages\Microsoft.Web.WebView2.1.0.2739.15\lib\net462\Microsoft.Web.WebView2.Core.dll 37 | 38 | 39 | ..\packages\Microsoft.Web.WebView2.1.0.2739.15\lib\net462\Microsoft.Web.WebView2.WinForms.dll 40 | 41 | 42 | ..\packages\Microsoft.Web.WebView2.1.0.2739.15\lib\net462\Microsoft.Web.WebView2.Wpf.dll 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | UserControl 58 | 59 | 60 | PluginClipilot.cs 61 | 62 | 63 | 64 | 65 | 66 | 67 | PluginClipilot.cs 68 | 69 | 70 | 71 | 72 | {11724eb0-bd43-41d3-a4c3-7002f9163b7f} 73 | PluginInterface 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | Dieses Projekt verweist auf mindestens ein NuGet-Paket, das auf diesem Computer fehlt. Verwenden Sie die Wiederherstellung von NuGet-Paketen, um die fehlenden Dateien herunterzuladen. Weitere Informationen finden Sie unter "http://go.microsoft.com/fwlink/?LinkID=322105". Die fehlende Datei ist "{0}". 84 | 85 | 86 | 87 | -------------------------------------------------------------------------------- /PluginClipilot/PluginClipilot.resx: -------------------------------------------------------------------------------- 1 |  2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | -------------------------------------------------------------------------------- /PluginClipilot/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // Allgemeine Informationen über eine Assembly werden über die folgenden 6 | // Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern, 7 | // die einer Assembly zugeordnet sind. 8 | [assembly: AssemblyTitle("PluginClipilot")] 9 | [assembly: AssemblyDescription("Plugin for SuperMSConfig")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("A Belim app creation")] 12 | [assembly: AssemblyProduct("PluginClipilot")] 13 | [assembly: AssemblyCopyright("Copyright © 2024")] 14 | [assembly: AssemblyTrademark("Builtbybel")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Durch Festlegen von ComVisible auf FALSE werden die Typen in dieser Assembly 18 | // für COM-Komponenten unsichtbar. Wenn Sie auf einen Typ in dieser Assembly von 19 | // COM aus zugreifen müssen, sollten Sie das ComVisible-Attribut für diesen Typ auf "True" festlegen. 20 | [assembly: ComVisible(false)] 21 | 22 | // Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird 23 | [assembly: Guid("279ed121-4536-4447-bd14-f67025e0a7de")] 24 | 25 | // Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten: 26 | // 27 | // Hauptversion 28 | // Nebenversion 29 | // Buildnummer 30 | // Revision 31 | // 32 | [assembly: AssemblyVersion("1.0.0.0")] 33 | [assembly: AssemblyFileVersion("1.0.0.0")] 34 | -------------------------------------------------------------------------------- /PluginClipilot/packages.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | -------------------------------------------------------------------------------- /PluginInterface/IPlugin.cs: -------------------------------------------------------------------------------- 1 | using System.Windows.Forms; 2 | 3 | namespace PluginInterface 4 | { 5 | public interface IPlugin 6 | { 7 | UserControl GetControl(); 8 | // Property for Plugin information 9 | string PluginName { get; } 10 | string PluginVersion { get; } 11 | string PluginInfo { get; } 12 | } 13 | } -------------------------------------------------------------------------------- /PluginInterface/PluginInterface.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Debug 6 | AnyCPU 7 | {11724EB0-BD43-41D3-A4C3-7002F9163B7F} 8 | Library 9 | Properties 10 | PluginInterface 11 | PluginInterface 12 | v4.8 13 | 512 14 | true 15 | 16 | 17 | true 18 | full 19 | false 20 | bin\Debug\ 21 | DEBUG;TRACE 22 | prompt 23 | 4 24 | 25 | 26 | pdbonly 27 | true 28 | bin\Release\ 29 | TRACE 30 | prompt 31 | 4 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | -------------------------------------------------------------------------------- /PluginInterface/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // Allgemeine Informationen über eine Assembly werden über die folgenden 6 | // Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern, 7 | // die einer Assembly zugeordnet sind. 8 | [assembly: AssemblyTitle("PluginInterface")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("")] 12 | [assembly: AssemblyProduct("PluginInterface")] 13 | [assembly: AssemblyCopyright("Copyright © 2024")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Durch Festlegen von ComVisible auf FALSE werden die Typen in dieser Assembly 18 | // für COM-Komponenten unsichtbar. Wenn Sie auf einen Typ in dieser Assembly von 19 | // COM aus zugreifen müssen, sollten Sie das ComVisible-Attribut für diesen Typ auf "True" festlegen. 20 | [assembly: ComVisible(false)] 21 | 22 | // Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird 23 | [assembly: Guid("11724eb0-bd43-41d3-a4c3-7002f9163b7f")] 24 | 25 | // Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten: 26 | // 27 | // Hauptversion 28 | // Nebenversion 29 | // Buildnummer 30 | // Revision 31 | // 32 | [assembly: AssemblyVersion("1.0.0.0")] 33 | [assembly: AssemblyFileVersion("1.0.0.0")] 34 | -------------------------------------------------------------------------------- /PluginMSCC/MSCCPluginControl.resx: -------------------------------------------------------------------------------- 1 |  2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | 121 | 17, 17 122 | 123 | -------------------------------------------------------------------------------- /PluginMSCC/PluginMSCC.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Debug 6 | AnyCPU 7 | {46392552-A27B-43BB-886C-64FCD9D9EDEB} 8 | Library 9 | MSCleanupCompanion 10 | MSCleanupCompanion 11 | v4.8 12 | 512 13 | true 14 | 15 | 16 | true 17 | full 18 | false 19 | bin\Debug\ 20 | DEBUG;TRACE 21 | prompt 22 | 4 23 | 24 | 25 | pdbonly 26 | true 27 | bin\Release\ 28 | TRACE 29 | prompt 30 | 4 31 | 32 | 33 | 34 | ..\packages\Newtonsoft.Json.13.0.3\lib\net45\Newtonsoft.Json.dll 35 | 36 | 37 | ..\PluginInterface\bin\Debug\PluginInterface.dll 38 | 39 | 40 | 41 | 42 | False 43 | ..\..\..\..\..\Windows\Microsoft.NET\assembly\GAC_MSIL\System.Management.Automation\v4.0_3.0.0.0__31bf3856ad364e35\System.Management.Automation.dll 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | UserControl 58 | 59 | 60 | MSCCPluginControl.cs 61 | 62 | 63 | 64 | 65 | 66 | MSCCPluginControl.cs 67 | 68 | 69 | 70 | 71 | 72 | 73 | -------------------------------------------------------------------------------- /PluginMSCC/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // Allgemeine Informationen über eine Assembly werden über die folgenden 6 | // Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern, 7 | // die einer Assembly zugeordnet sind. 8 | [assembly: AssemblyTitle("MSCleanupCompanion")] 9 | [assembly: AssemblyDescription("Microsoft Cleanup Companion")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("Builtbybel")] 12 | [assembly: AssemblyProduct("MSCleanupCompanion")] 13 | [assembly: AssemblyCopyright("Copyright © 2024")] 14 | [assembly: AssemblyTrademark("Builtbybel")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Durch Festlegen von ComVisible auf FALSE werden die Typen in dieser Assembly 18 | // für COM-Komponenten unsichtbar. Wenn Sie auf einen Typ in dieser Assembly von 19 | // COM aus zugreifen müssen, sollten Sie das ComVisible-Attribut für diesen Typ auf "True" festlegen. 20 | [assembly: ComVisible(false)] 21 | 22 | // Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird 23 | [assembly: Guid("46392552-a27b-43bb-886c-64fcd9d9edeb")] 24 | 25 | // Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten: 26 | // 27 | // Hauptversion 28 | // Nebenversion 29 | // Buildnummer 30 | // Revision 31 | // 32 | // Sie können alle Werte angeben oder Standardwerte für die Build- und Revisionsnummern verwenden, 33 | // indem Sie "*" wie unten gezeigt eingeben: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.0.0.0")] 36 | [assembly: AssemblyFileVersion("1.0.0.0")] 37 | -------------------------------------------------------------------------------- /PluginMSCC/packages.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | -------------------------------------------------------------------------------- /PluginMSNavigator/MSNavigatorPluginControl.cs: -------------------------------------------------------------------------------- 1 | using Newtonsoft.Json; 2 | using PluginInterface; 3 | using System; 4 | using System.Collections.Generic; 5 | using System.Data; 6 | using System.Diagnostics; 7 | using System.Drawing; 8 | using System.IO; 9 | using System.Linq; 10 | using System.Management.Automation; 11 | using System.Threading.Tasks; 12 | using System.Windows.Forms; 13 | 14 | namespace MSNavigator 15 | { 16 | public partial class MSNavigatorPluginControl : UserControl, IPlugin 17 | { 18 | private List items; 19 | 20 | public UserControl GetControl() 21 | { 22 | return this; 23 | } 24 | 25 | public string PluginName => "Microsoft Navigator"; 26 | public string PluginVersion => "1.0"; 27 | public string PluginInfo => "Windows Navigator is your modern, assistant for Windows. Like Clippy, Butler handles simple requests to manage your system—install apps, tweak settings, and more."; 28 | 29 | private void ShowPluginInfo() 30 | { 31 | string pluginDetails = $"{PluginName}\n" + 32 | $"Version: {PluginVersion}\n\n" + 33 | $"{PluginInfo}"; 34 | 35 | MessageBox.Show(pluginDetails, "Plugin Information", MessageBoxButtons.OK, MessageBoxIcon.Information); 36 | } 37 | 38 | public MSNavigatorPluginControl() 39 | { 40 | InitializeComponent(); 41 | LoadData(); 42 | BackColor = 43 | resultsListBox.BackColor = 44 | resultsTextBox.BackColor = 45 | Color.FromArgb(251, 242, 244); 46 | lblInfo.Text = PluginInfo; 47 | } 48 | 49 | private void LoadData() 50 | { 51 | string jsonFilePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "plugins\\PluginMSNavigator", "MSNavigator.json"); 52 | string json = File.ReadAllText(jsonFilePath); 53 | items = JsonConvert.DeserializeObject>(json); 54 | } 55 | 56 | private void resultsListBox_SelectedIndexChanged(object sender, EventArgs e) 57 | { 58 | if (resultsListBox.SelectedIndex >= 0) 59 | { 60 | var selectedItem = items.FirstOrDefault(item => item.Response == resultsListBox.SelectedItem.ToString()); 61 | if (selectedItem != null) 62 | { 63 | ExecuteAction(selectedItem.Action); 64 | // Scroll to the bottom of the TextBox 65 | resultsTextBox.Focus(); 66 | resultsTextBox.ScrollToCaret(); 67 | } 68 | } 69 | } 70 | 71 | private void searchTextBox_TextChanged(object sender, EventArgs e) 72 | { 73 | string searchTerm = searchTextBox.Text.ToLower(); 74 | resultsListBox.Items.Clear(); 75 | 76 | btnSend.Enabled = !string.IsNullOrWhiteSpace(searchTextBox.Text); 77 | 78 | if (!string.IsNullOrWhiteSpace(searchTerm)) 79 | { 80 | var results = items 81 | .Where(item => item.Question.ToLower().Contains(searchTerm)) 82 | .Select(item => item.Response) 83 | .ToList(); 84 | 85 | resultsListBox.Items.AddRange(results.ToArray()); 86 | } 87 | } 88 | 89 | private void searchTextBox_Click(object sender, EventArgs e) 90 | { 91 | searchTextBox.Clear(); 92 | } 93 | 94 | private async void ExecuteAction(string action) 95 | { 96 | try 97 | { 98 | btnSend.Enabled = false; 99 | // Output the action string to help with debugging 100 | Console.WriteLine($"Executing action: {action}"); 101 | 102 | if (action.StartsWith("ms-settings:")) 103 | { 104 | // Open ms-settings URI 105 | Process.Start(new ProcessStartInfo 106 | { 107 | FileName = action, 108 | UseShellExecute = true 109 | }); 110 | } 111 | else if (action.StartsWith("cmd:")) 112 | { 113 | // Execute CMD command 114 | string command = action.Substring("cmd:".Length); 115 | await ExecuteCmdCommand(command); 116 | } 117 | else if (action.StartsWith("powershell:")) 118 | { 119 | // Execute PowerShell command 120 | string command = action.Substring("powershell:".Length); 121 | await ExecutePowerShellCommand(command); 122 | } 123 | else if (action.StartsWith("install:")) 124 | { 125 | // Install application using winget 126 | string wingetId = action.Substring("install:".Length).Trim(); 127 | await InstallAppWithWinget(wingetId); 128 | } 129 | else 130 | { 131 | // Log unknown action type 132 | MessageBox.Show($"Unknown action type: {action}", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 133 | } 134 | 135 | btnSend.Enabled = true; 136 | } 137 | catch (Exception ex) 138 | { 139 | // Log any exceptions 140 | MessageBox.Show($"Exception: {ex.Message}", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 141 | } 142 | } 143 | 144 | private async Task InstallAppWithWinget(string wingetId) 145 | { 146 | try 147 | { 148 | resultsTextBox.Text = "Installing " + wingetId; 149 | 150 | using (PowerShell powerShell = PowerShell.Create()) 151 | { 152 | // Add script to install application with winget 153 | powerShell.AddScript($"winget install --id {wingetId} --accept-source-agreements --accept-package-agreements"); 154 | 155 | // Execute script asynchronously 156 | var output = await Task.Run(() => powerShell.Invoke()); 157 | 158 | // Capture errors from PowerShell 159 | var errors = powerShell.Streams.Error.ReadAll(); 160 | 161 | // Process output 162 | if (output.Any()) 163 | { 164 | resultsTextBox.Text = "Output: " + string.Join(Environment.NewLine, output.Select(o => o.ToString())); 165 | } 166 | 167 | // Process errors 168 | if (errors.Any()) 169 | { 170 | resultsTextBox.Text += Environment.NewLine + "Error: " + string.Join(Environment.NewLine, errors.Select(e => e.ToString())); 171 | } 172 | } 173 | } 174 | catch (Exception ex) 175 | { 176 | resultsTextBox.Text = "Exception: " + ex.Message; 177 | } 178 | } 179 | 180 | // Execute PS command 181 | public async Task ExecutePowerShellCommand(string command) 182 | { 183 | try 184 | { 185 | ProcessStartInfo processInfo = new ProcessStartInfo 186 | { 187 | FileName = "powershell.exe", 188 | Arguments = $"-NoProfile -ExecutionPolicy Bypass -Command \"{command}\"", 189 | RedirectStandardOutput = true, 190 | RedirectStandardError = true, 191 | UseShellExecute = false, 192 | CreateNoWindow = true 193 | }; 194 | 195 | using (Process process = Process.Start(processInfo)) 196 | { 197 | // Read output and error asynchronously using Task.Run 198 | string output = await Task.Run(() => process.StandardOutput.ReadToEnd()); 199 | string error = await Task.Run(() => process.StandardError.ReadToEnd()); 200 | process.WaitForExit(); // Wait for the process to exit (synchronous) 201 | 202 | // Update UI with results (invoke on UI thread) 203 | Invoke((Action)(() => 204 | { 205 | resultsTextBox.Text = $"Output: {output}\r\nError: {error}"; 206 | })); 207 | } 208 | } 209 | catch (Exception ex) 210 | { 211 | // Update UI with exception (invoke on UI thread) 212 | Invoke((Action)(() => 213 | { 214 | resultsTextBox.Text = $"Exception: {ex.Message}"; 215 | })); 216 | } 217 | } 218 | 219 | // Execute CMD command 220 | public async Task ExecuteCmdCommand(string command) 221 | { 222 | try 223 | { 224 | ProcessStartInfo processInfo = new ProcessStartInfo 225 | { 226 | FileName = "cmd.exe", 227 | Arguments = $"/C \"{command}\"", 228 | RedirectStandardOutput = true, 229 | RedirectStandardError = true, 230 | UseShellExecute = false, 231 | CreateNoWindow = true 232 | }; 233 | 234 | using (Process process = Process.Start(processInfo)) 235 | { 236 | string output = await Task.Run(() => process.StandardOutput.ReadToEnd()); 237 | string error = await Task.Run(() => process.StandardError.ReadToEnd()); 238 | process.WaitForExit(); 239 | 240 | Invoke((Action)(() => 241 | { 242 | resultsTextBox.Text = $"Output: {output}\r\nError: {error}"; 243 | })); 244 | } 245 | } 246 | catch (Exception ex) 247 | { 248 | Invoke((Action)(() => 249 | { 250 | resultsTextBox.Text = $"Exception: {ex.Message}"; 251 | })); 252 | } 253 | } 254 | 255 | private void newChatToolStripMenuItem_Click(object sender, EventArgs e) 256 | { 257 | searchTextBox.Text = "Type your question"; 258 | resultsTextBox.Clear(); 259 | } 260 | } 261 | } 262 | 263 | public class Item 264 | { 265 | public string Question { get; set; } 266 | public string Response { get; set; } 267 | public string Action { get; set; } 268 | } -------------------------------------------------------------------------------- /PluginMSNavigator/MSNavigatorPluginControl.resx: -------------------------------------------------------------------------------- 1 |  2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | 121 | 17, 17 122 | 123 | 124 | 142, 17 125 | 126 | -------------------------------------------------------------------------------- /PluginMSNavigator/PluginMSNavigator.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Debug 6 | AnyCPU 7 | {15A24130-DFAC-4BE3-96EE-EF620EA9181C} 8 | Library 9 | Properties 10 | MSNavigator 11 | MSNavigator 12 | v4.8 13 | 512 14 | true 15 | 16 | 17 | true 18 | full 19 | false 20 | bin\Debug\ 21 | DEBUG;TRACE 22 | prompt 23 | 4 24 | x64 25 | 26 | 27 | pdbonly 28 | true 29 | bin\Release\ 30 | TRACE 31 | prompt 32 | 4 33 | 34 | 35 | 36 | 37 | ..\PluginInterface\bin\Debug\PluginInterface.dll 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | UserControl 55 | 56 | 57 | MSNavigatorPluginControl.cs 58 | 59 | 60 | 61 | 62 | MSNavigatorPluginControl.cs 63 | 64 | 65 | 66 | -------------------------------------------------------------------------------- /PluginMSNavigator/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // Allgemeine Informationen über eine Assembly werden über die folgenden 6 | // Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern, 7 | // die einer Assembly zugeordnet sind. 8 | [assembly: AssemblyTitle("MSNavigator")] 9 | [assembly: AssemblyDescription("Windows Navigator")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("Builtbybel")] 12 | [assembly: AssemblyProduct("MSNavigator")] 13 | [assembly: AssemblyCopyright("Copyright © 2024")] 14 | [assembly: AssemblyTrademark("Builtbybel")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Durch Festlegen von ComVisible auf FALSE werden die Typen in dieser Assembly 18 | // für COM-Komponenten unsichtbar. Wenn Sie auf einen Typ in dieser Assembly von 19 | // COM aus zugreifen müssen, sollten Sie das ComVisible-Attribut für diesen Typ auf "True" festlegen. 20 | [assembly: ComVisible(false)] 21 | 22 | // Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird 23 | [assembly: Guid("15a24130-dfac-4be3-96ee-ef620ea9181c")] 24 | 25 | // Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten: 26 | // 27 | // Hauptversion 28 | // Nebenversion 29 | // Buildnummer 30 | // Revision 31 | // 32 | // Sie können alle Werte angeben oder Standardwerte für die Build- und Revisionsnummern verwenden, 33 | // indem Sie "*" wie unten gezeigt eingeben: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.0.0.0")] 36 | [assembly: AssemblyFileVersion("1.0.0.0")] 37 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # MSConfig Gets Superpowers After 25 Years – Now It's SuperMSConfig 😃 2 | 3 | We all know MSConfig, the tool that helps you manage some system settings. SuperMSConfig takes things a step further by automating many of these tasks 4 | 5 | Built specifically for Windows 11, it not only enhances system configuration but also customizes your system right after installation by revisiting the Out-of-Box Experience (OOBE), ensuring your Windows setup starts off perfectly. 6 | 7 | ![explorer_RXAtme7j3U](https://github.com/user-attachments/assets/aee2a212-2393-4689-b077-c28262ba64f2) 8 | 9 | 10 | ## What Does SuperMSConfig Do? 🎯 11 | While MSConfig traditionally allows you to manage startup settings and system drivers, SuperMSConfig goes much further: 12 | 13 | - Reconfigures Windows 11 OOBE: SuperMSConfig revisits the out-of-box setup, letting you fine-tune the Windows 11 post-installation experience. Whether it’s disabling intrusive features or optimizing services, it provides full control over how your system behaves immediately after setup. 14 | 15 | - Automates MSConfig: It streamlines and automates MSConfig tasks, eliminating the hassle of manual configuration. SuperMSConfig scans your system to detect unnecessary startup apps, services, and system tweaks—cleaning up what slows down your PC. 16 | 17 | - Comprehensive System Checker: It checks for Windows 11’s bad habits—unwanted services, sneaky startup programs, intrusive browser settings, system configurations, unwanted updates, security settings, ads, and much more. 18 | 19 | ## How SuperMSConfig Enhances Windows 11’s OOBE 💻 20 | Unlike the default Windows 11 setup, which can leave unnecessary features enabled by default, SuperMSConfig revisits the Out-of-Box Experience after installation, giving you control over: 21 | 22 | - Disabling annoying ads and unwanted telemetry 23 | - Tweaking system settings for better performance and privacy 24 | - **Optimizing configurations that Windows leaves on by default, improving your user experience right from the start** 25 | 26 | 27 | ## Origins: Born from XD-AntiSpy 🛡️ 28 | SuperMSConfig began as a simple [XD-AntiSpy](https://github.com/builtbybel/xd-AntiSpy) Plugin , an app focused on improving privacy. However, it evolved into its own standalone tool with broader system management features. XD-AntiSpy remains a great companion for privacy tweaks, while SuperMSConfig handles the overall system management, making them the perfect duo. 29 | 30 | **My plan with SuperMSConfig is to create a dynamic tool that lets you turn almost any online guide, tutorial, or configuration into a shareable template, available for everyone to use. This way, anyone can show off their Super Microsoft configuration setup. 😉** 31 | 32 | ## How to Use 33 | 1. **Open** **SuperMSConfig**. 34 | 2. Click **"Check"** to start scanning your system for bad habits. 35 | 3. Review the issues highlighted in red as **"Bad"** habits. 36 | 4. Select the issues you want to fix and click **"Fix"**. 37 | 38 | 39 | -------------------------------------------------------------------------------- /SuperMSConfig.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 17 4 | VisualStudioVersion = 17.11.35208.52 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SuperMSConfig", "SuperMSConfig\SuperMSConfig.csproj", "{6514A6A5-6E23-4B36-AC92-DF96DB8901D3}" 7 | EndProject 8 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PluginInterface", "PluginInterface\PluginInterface.csproj", "{11724EB0-BD43-41D3-A4C3-7002F9163B7F}" 9 | EndProject 10 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PluginMSNavigator", "PluginMSNavigator\PluginMSNavigator.csproj", "{15A24130-DFAC-4BE3-96EE-EF620EA9181C}" 11 | EndProject 12 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PluginMSCC", "PluginMSCC\PluginMSCC.csproj", "{46392552-A27B-43BB-886C-64FCD9D9EDEB}" 13 | EndProject 14 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PluginClipilot", "PluginClipilot\PluginClipilot.csproj", "{279ED121-4536-4447-BD14-F67025E0A7DE}" 15 | EndProject 16 | Global 17 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 18 | Debug|Any CPU = Debug|Any CPU 19 | Release|Any CPU = Release|Any CPU 20 | EndGlobalSection 21 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 22 | {6514A6A5-6E23-4B36-AC92-DF96DB8901D3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 23 | {6514A6A5-6E23-4B36-AC92-DF96DB8901D3}.Debug|Any CPU.Build.0 = Debug|Any CPU 24 | {6514A6A5-6E23-4B36-AC92-DF96DB8901D3}.Release|Any CPU.ActiveCfg = Release|Any CPU 25 | {6514A6A5-6E23-4B36-AC92-DF96DB8901D3}.Release|Any CPU.Build.0 = Release|Any CPU 26 | {11724EB0-BD43-41D3-A4C3-7002F9163B7F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 27 | {11724EB0-BD43-41D3-A4C3-7002F9163B7F}.Debug|Any CPU.Build.0 = Debug|Any CPU 28 | {11724EB0-BD43-41D3-A4C3-7002F9163B7F}.Release|Any CPU.ActiveCfg = Release|Any CPU 29 | {11724EB0-BD43-41D3-A4C3-7002F9163B7F}.Release|Any CPU.Build.0 = Release|Any CPU 30 | {15A24130-DFAC-4BE3-96EE-EF620EA9181C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 31 | {15A24130-DFAC-4BE3-96EE-EF620EA9181C}.Debug|Any CPU.Build.0 = Debug|Any CPU 32 | {15A24130-DFAC-4BE3-96EE-EF620EA9181C}.Release|Any CPU.ActiveCfg = Release|Any CPU 33 | {15A24130-DFAC-4BE3-96EE-EF620EA9181C}.Release|Any CPU.Build.0 = Release|Any CPU 34 | {46392552-A27B-43BB-886C-64FCD9D9EDEB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 35 | {46392552-A27B-43BB-886C-64FCD9D9EDEB}.Debug|Any CPU.Build.0 = Debug|Any CPU 36 | {46392552-A27B-43BB-886C-64FCD9D9EDEB}.Release|Any CPU.ActiveCfg = Release|Any CPU 37 | {46392552-A27B-43BB-886C-64FCD9D9EDEB}.Release|Any CPU.Build.0 = Release|Any CPU 38 | {279ED121-4536-4447-BD14-F67025E0A7DE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 39 | {279ED121-4536-4447-BD14-F67025E0A7DE}.Debug|Any CPU.Build.0 = Debug|Any CPU 40 | {279ED121-4536-4447-BD14-F67025E0A7DE}.Release|Any CPU.ActiveCfg = Release|Any CPU 41 | {279ED121-4536-4447-BD14-F67025E0A7DE}.Release|Any CPU.Build.0 = Release|Any CPU 42 | EndGlobalSection 43 | GlobalSection(SolutionProperties) = preSolution 44 | HideSolutionNode = FALSE 45 | EndGlobalSection 46 | GlobalSection(ExtensibilityGlobals) = postSolution 47 | SolutionGuid = {7F605095-F8EF-4B2E-84E7-79FE694DDEE5} 48 | EndGlobalSection 49 | EndGlobal 50 | -------------------------------------------------------------------------------- /SuperMSConfig/AboutForm.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace SuperMSConfig 2 | { 3 | partial class AboutForm 4 | { 5 | /// 6 | /// Required designer variable. 7 | /// 8 | private System.ComponentModel.IContainer components = null; 9 | 10 | /// 11 | /// Clean up any resources being used. 12 | /// 13 | /// true if managed resources should be disposed; otherwise, false. 14 | protected override void Dispose(bool disposing) 15 | { 16 | if (disposing && (components != null)) 17 | { 18 | components.Dispose(); 19 | } 20 | base.Dispose(disposing); 21 | } 22 | 23 | #region Windows Form Designer generated code 24 | 25 | /// 26 | /// Required method for Designer support - do not modify 27 | /// the contents of this method with the code editor. 28 | /// 29 | private void InitializeComponent() 30 | { 31 | System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AboutForm)); 32 | this.panelBottom = new System.Windows.Forms.Panel(); 33 | this.btnDonate = new System.Windows.Forms.Button(); 34 | this.btnWebsite = new System.Windows.Forms.Button(); 35 | this.lblAbout = new System.Windows.Forms.Label(); 36 | this.lblHeaderInfo = new System.Windows.Forms.Label(); 37 | this.linkVersion = new System.Windows.Forms.LinkLabel(); 38 | this.label2 = new System.Windows.Forms.Label(); 39 | this.label3 = new System.Windows.Forms.Label(); 40 | this.panelBottom.SuspendLayout(); 41 | this.SuspendLayout(); 42 | // 43 | // panelBottom 44 | // 45 | this.panelBottom.BackColor = System.Drawing.Color.Gainsboro; 46 | this.panelBottom.Controls.Add(this.btnDonate); 47 | this.panelBottom.Controls.Add(this.btnWebsite); 48 | this.panelBottom.Dock = System.Windows.Forms.DockStyle.Bottom; 49 | this.panelBottom.Location = new System.Drawing.Point(0, 379); 50 | this.panelBottom.Name = "panelBottom"; 51 | this.panelBottom.Size = new System.Drawing.Size(451, 76); 52 | this.panelBottom.TabIndex = 0; 53 | // 54 | // btnDonate 55 | // 56 | this.btnDonate.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) 57 | | System.Windows.Forms.AnchorStyles.Right))); 58 | this.btnDonate.AutoEllipsis = true; 59 | this.btnDonate.BackColor = System.Drawing.Color.White; 60 | this.btnDonate.FlatAppearance.BorderColor = System.Drawing.Color.Black; 61 | this.btnDonate.FlatAppearance.BorderSize = 0; 62 | this.btnDonate.Font = new System.Drawing.Font("Segoe UI Variable Text Semiligh", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 63 | this.btnDonate.ForeColor = System.Drawing.Color.Black; 64 | this.btnDonate.Location = new System.Drawing.Point(227, 23); 65 | this.btnDonate.Name = "btnDonate"; 66 | this.btnDonate.Size = new System.Drawing.Size(203, 32); 67 | this.btnDonate.TabIndex = 247; 68 | this.btnDonate.TabStop = false; 69 | this.btnDonate.Text = "Donate"; 70 | this.btnDonate.UseVisualStyleBackColor = true; 71 | this.btnDonate.Click += new System.EventHandler(this.btnDonate_Click); 72 | // 73 | // btnWebsite 74 | // 75 | this.btnWebsite.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) 76 | | System.Windows.Forms.AnchorStyles.Right))); 77 | this.btnWebsite.AutoEllipsis = true; 78 | this.btnWebsite.BackColor = System.Drawing.Color.White; 79 | this.btnWebsite.FlatAppearance.BorderColor = System.Drawing.Color.Black; 80 | this.btnWebsite.FlatAppearance.BorderSize = 0; 81 | this.btnWebsite.Font = new System.Drawing.Font("Segoe UI Variable Text Semiligh", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 82 | this.btnWebsite.ForeColor = System.Drawing.Color.Black; 83 | this.btnWebsite.Location = new System.Drawing.Point(19, 23); 84 | this.btnWebsite.Name = "btnWebsite"; 85 | this.btnWebsite.Size = new System.Drawing.Size(203, 32); 86 | this.btnWebsite.TabIndex = 246; 87 | this.btnWebsite.TabStop = false; 88 | this.btnWebsite.Text = "GitHub"; 89 | this.btnWebsite.UseVisualStyleBackColor = true; 90 | this.btnWebsite.Click += new System.EventHandler(this.btnWebsite_Click); 91 | // 92 | // lblAbout 93 | // 94 | this.lblAbout.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 95 | | System.Windows.Forms.AnchorStyles.Right))); 96 | this.lblAbout.AutoEllipsis = true; 97 | this.lblAbout.BackColor = System.Drawing.Color.Transparent; 98 | this.lblAbout.Font = new System.Drawing.Font("Segoe UI Variable Small", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 99 | this.lblAbout.Location = new System.Drawing.Point(14, 88); 100 | this.lblAbout.Name = "lblAbout"; 101 | this.lblAbout.Size = new System.Drawing.Size(425, 91); 102 | this.lblAbout.TabIndex = 233; 103 | this.lblAbout.Text = resources.GetString("lblAbout.Text"); 104 | // 105 | // lblHeaderInfo 106 | // 107 | this.lblHeaderInfo.AutoSize = true; 108 | this.lblHeaderInfo.BackColor = System.Drawing.Color.Transparent; 109 | this.lblHeaderInfo.Font = new System.Drawing.Font("Segoe UI Variable Small Semibol", 18F, System.Drawing.FontStyle.Bold); 110 | this.lblHeaderInfo.Location = new System.Drawing.Point(10, 14); 111 | this.lblHeaderInfo.Name = "lblHeaderInfo"; 112 | this.lblHeaderInfo.Size = new System.Drawing.Size(188, 32); 113 | this.lblHeaderInfo.TabIndex = 235; 114 | this.lblHeaderInfo.Text = "SuperMSConfig"; 115 | // 116 | // linkVersion 117 | // 118 | this.linkVersion.AutoEllipsis = true; 119 | this.linkVersion.BackColor = System.Drawing.Color.Transparent; 120 | this.linkVersion.Font = new System.Drawing.Font("Segoe UI Variable Small", 10.75F); 121 | this.linkVersion.LinkBehavior = System.Windows.Forms.LinkBehavior.HoverUnderline; 122 | this.linkVersion.LinkColor = System.Drawing.Color.Black; 123 | this.linkVersion.Location = new System.Drawing.Point(12, 59); 124 | this.linkVersion.Name = "linkVersion"; 125 | this.linkVersion.Size = new System.Drawing.Size(427, 20); 126 | this.linkVersion.TabIndex = 237; 127 | this.linkVersion.TabStop = true; 128 | this.linkVersion.Text = "Version"; 129 | this.linkVersion.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkAbout_LinkClicked); 130 | // 131 | // label2 132 | // 133 | this.label2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 134 | | System.Windows.Forms.AnchorStyles.Right))); 135 | this.label2.AutoEllipsis = true; 136 | this.label2.BackColor = System.Drawing.Color.Transparent; 137 | this.label2.Font = new System.Drawing.Font("Segoe UI Variable Small Light", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 138 | this.label2.ForeColor = System.Drawing.Color.Black; 139 | this.label2.Location = new System.Drawing.Point(12, 330); 140 | this.label2.Name = "label2"; 141 | this.label2.Size = new System.Drawing.Size(425, 46); 142 | this.label2.TabIndex = 239; 143 | this.label2.Text = "Microsoft 365 Copilot is a registered trademark of Microsoft Corporation. "; 144 | this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; 145 | // 146 | // label3 147 | // 148 | this.label3.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); 149 | this.label3.AutoSize = true; 150 | this.label3.BackColor = System.Drawing.Color.Transparent; 151 | this.label3.ForeColor = System.Drawing.Color.DarkGray; 152 | this.label3.Location = new System.Drawing.Point(314, 1); 153 | this.label3.Name = "label3"; 154 | this.label3.Size = new System.Drawing.Size(137, 13); 155 | this.label3.TabIndex = 240; 156 | this.label3.Text = "A Belim app creation (2024)"; 157 | // 158 | // AboutForm 159 | // 160 | this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); 161 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 162 | this.ClientSize = new System.Drawing.Size(451, 455); 163 | this.Controls.Add(this.label3); 164 | this.Controls.Add(this.label2); 165 | this.Controls.Add(this.linkVersion); 166 | this.Controls.Add(this.lblHeaderInfo); 167 | this.Controls.Add(this.lblAbout); 168 | this.Controls.Add(this.panelBottom); 169 | this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; 170 | this.MaximizeBox = false; 171 | this.MinimizeBox = false; 172 | this.Name = "AboutForm"; 173 | this.Opacity = 0.95D; 174 | this.ShowIcon = false; 175 | this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; 176 | this.panelBottom.ResumeLayout(false); 177 | this.ResumeLayout(false); 178 | this.PerformLayout(); 179 | 180 | } 181 | 182 | #endregion 183 | 184 | private System.Windows.Forms.Panel panelBottom; 185 | private System.Windows.Forms.Button btnWebsite; 186 | private System.Windows.Forms.Button btnDonate; 187 | private System.Windows.Forms.Label lblAbout; 188 | private System.Windows.Forms.Label lblHeaderInfo; 189 | private System.Windows.Forms.LinkLabel linkVersion; 190 | private System.Windows.Forms.Label label2; 191 | private System.Windows.Forms.Label label3; 192 | } 193 | } -------------------------------------------------------------------------------- /SuperMSConfig/AboutForm.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Diagnostics; 3 | using System.Drawing; 4 | using System.Drawing.Drawing2D; 5 | using System.Text.RegularExpressions; 6 | using System.Windows.Forms; 7 | 8 | namespace SuperMSConfig 9 | { 10 | public partial class AboutForm : Form 11 | { 12 | public AboutForm() 13 | { 14 | InitializeComponent(); 15 | linkVersion.Text = "Version " + Program.GetCurrentVersionTostring(); 16 | SetStyle(); 17 | } 18 | 19 | private void SetStyle() 20 | { 21 | // Set default colors 22 | BackColor = Color.FromArgb(243, 243, 243); 23 | panelBottom.BackColor = Color.FromArgb(243, 243, 243); 24 | 25 | this.Paint += new PaintEventHandler(ApplyGradientBackground); 26 | } 27 | 28 | private void btnWebsite_Click(object sender, EventArgs e) 29 | { 30 | Process.Start("https://github.com/builtbybel/SuperMSConfig"); 31 | } 32 | 33 | private void btnDonate_Click(object sender, EventArgs e) 34 | { 35 | string paypalUrl = "https://www.paypal.com/donate?hosted_button_id=MY7HX4QLYR4KG"; 36 | try 37 | { 38 | Process.Start(new ProcessStartInfo 39 | { 40 | FileName = paypalUrl, 41 | UseShellExecute = true 42 | }); 43 | MessageBox.Show("Thank you for your support! 💖", "Thank You!", MessageBoxButtons.OK, MessageBoxIcon.Information); 44 | } 45 | catch (Exception) 46 | { 47 | MessageBox.Show("Unable to open the donation page. Please try again later.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 48 | } 49 | } 50 | 51 | private void linkAbout_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) 52 | { 53 | string pattern = @"\((http[^\)]+)\)"; // Find link within parentheses 54 | string text = linkVersion.Text; 55 | 56 | Match match = Regex.Match(text, pattern); 57 | if (match.Success) 58 | { 59 | string link = match.Groups[1].Value; 60 | Clipboard.SetText(link); 61 | MessageBox.Show("Link copied to clipboard."); 62 | } 63 | } 64 | 65 | // AI generated!! Apply gradient to control 66 | private void ApplyGradientBackground(object sender, PaintEventArgs e) 67 | { 68 | Control control = sender as Control; 69 | 70 | if (control != null) 71 | { 72 | // Create rectangle that matches the control's size 73 | Rectangle controlRect = control.ClientRectangle; 74 | 75 | // Create LinearGradientBrush with multiple colorss 76 | using (LinearGradientBrush brush = new LinearGradientBrush(controlRect, Color.Empty, Color.Empty, 45f)) 77 | { 78 | // Color blend to create a multi-color gradient 79 | ColorBlend colorBlend = new ColorBlend(); 80 | colorBlend.Colors = new Color[] 81 | { 82 | Color.FromArgb(255, 220, 230, 250), // Soft Blue 83 | Color.FromArgb(255, 255, 220, 250), // Soft Pink 84 | Color.FromArgb(255, 200, 220, 240), // Soft Purple 85 | Color.FromArgb(255, 240, 210, 240), // Pastel Pink 86 | Color.FromArgb(255, 250, 230, 240) // Soft Red 87 | }; 88 | 89 | // Positions for each color in the gradient 90 | colorBlend.Positions = new float[] { 0f, 0.25f, 0.5f, 0.75f, 1f }; 91 | brush.InterpolationColors = colorBlend; 92 | 93 | // Fill the control with the gradient brush 94 | e.Graphics.FillRectangle(brush, controlRect); 95 | } 96 | } 97 | } 98 | } 99 | } 100 | -------------------------------------------------------------------------------- /SuperMSConfig/AboutForm.resx: -------------------------------------------------------------------------------- 1 |  2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | 121 | In SuperMSConfig, the Copilot is named Clipilot, honoring Microsoft’s classic Clippy. With a modern touch, Clipilot provides smart support to improve your productivity. It also supports plugins, with several already integrated to enhance your experience. 122 | 123 | -------------------------------------------------------------------------------- /SuperMSConfig/App.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /SuperMSConfig/AppIcon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/builtbybel/SuperMSConfig/262fd6129fb414318bc89ad662ed49e579d28c5f/SuperMSConfig/AppIcon.ico -------------------------------------------------------------------------------- /SuperMSConfig/AppIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/builtbybel/SuperMSConfig/262fd6129fb414318bc89ad662ed49e579d28c5f/SuperMSConfig/AppIcon.png -------------------------------------------------------------------------------- /SuperMSConfig/BaseHabit.cs: -------------------------------------------------------------------------------- 1 | using System.Threading.Tasks; 2 | 3 | public abstract class BaseHabit 4 | { 5 | public abstract string Name { get; } 6 | public abstract string Description { get; } 7 | 8 | public enum HabitStatus 9 | { 10 | Good, 11 | Bad, 12 | NotConfigured 13 | } 14 | 15 | public virtual HabitStatus Status { get; set; } = HabitStatus.NotConfigured; 16 | 17 | public abstract Task Check(); 18 | public abstract Task Fix(); 19 | public abstract Task Revert(); 20 | public abstract string GetDetails(); 21 | } 22 | -------------------------------------------------------------------------------- /SuperMSConfig/BaseHabitCategory.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | 3 | namespace SuperMSConfig 4 | { 5 | public abstract class BaseHabitCategory 6 | { 7 | protected readonly List habits = new List(); 8 | public IReadOnlyList Habits => habits.AsReadOnly(); 9 | 10 | public abstract string CategoryName { get; } 11 | 12 | public IEnumerable GetHabits() 13 | { 14 | foreach (var habit in habits) 15 | { 16 | yield return habit; 17 | } 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /SuperMSConfig/Config/AppsHabit.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Drawing; 3 | using System.Management.Automation; 4 | using System.Threading.Tasks; 5 | using System.Windows.Forms; 6 | 7 | namespace SuperMSConfig 8 | { 9 | public class AppsHabit : BaseHabit 10 | { 11 | public AppsHabit(string appName, string description, Logger logger) 12 | { 13 | Name = appName; 14 | Description = description; 15 | this.logger = logger; 16 | Status = HabitStatus.NotConfigured; // Default status 17 | } 18 | 19 | // Override Name property 20 | public override string Name { get; } 21 | 22 | // Override Description property 23 | public override string Description { get; } 24 | 25 | // Override Status property 26 | public override HabitStatus Status { get; set; } 27 | 28 | private readonly Logger logger; 29 | 30 | // Override Check method 31 | public override async Task Check() 32 | { 33 | try 34 | { 35 | logger.Log($"Checking for {Name}...", Color.Blue); 36 | 37 | Status = await IsAppInstalled(Name) ? HabitStatus.Bad : HabitStatus.Good; 38 | logger.Log(Status == HabitStatus.Bad ? $"{Name} is installed." : $"{Name} is not installed.", Status == HabitStatus.Bad ? Color.Red : Color.Green); 39 | } 40 | catch (Exception ex) 41 | { 42 | logger.Log($"Error during Check: {ex.Message}", Color.Red, ex.StackTrace); 43 | } 44 | } 45 | 46 | // Override Fix method 47 | public override async Task Fix() 48 | { 49 | try 50 | { 51 | if (Status == HabitStatus.Bad) 52 | { 53 | logger.Log($"Uninstalling {Name}...", Color.Blue); 54 | await UninstallApp(Name); 55 | Status = HabitStatus.Good; // Update status after fixing 56 | logger.Log($"{Name} uninstalled successfully.", Color.Green); 57 | } 58 | } 59 | catch (Exception ex) 60 | { 61 | logger.Log($"Error during Fix: {ex.Message}", Color.Red, ex.StackTrace); 62 | } 63 | } 64 | 65 | // Override Revert method 66 | public override async Task Revert() 67 | { 68 | try 69 | { 70 | string message = $"{Name} reinstall not possible. Please use the Microsoft Store"; 71 | 72 | MessageBox.Show(message, "Revert Not Possible", MessageBoxButtons.OK, MessageBoxIcon.Warning); 73 | } 74 | catch (Exception ex) 75 | { 76 | logger.Log($"Error during Revert: {ex.Message}", Color.Red, ex.StackTrace); 77 | } 78 | } 79 | 80 | // Override GetDetails method 81 | public override string GetDetails() 82 | { 83 | return $"Application Name: {Name}, Description: {Description}, Status: {Status}"; 84 | } 85 | 86 | // Check if an app is installed 87 | private async Task IsAppInstalled(string appName) 88 | { 89 | try 90 | { 91 | using (PowerShell powerShell = PowerShell.Create()) 92 | { 93 | powerShell.AddScript($"Get-AppxPackage -Name *{appName}*"); 94 | var results = await Task.Run(() => powerShell.Invoke()); 95 | 96 | // Results?, so its installed! 97 | return results.Count > 0; 98 | } 99 | } 100 | catch (Exception ex) 101 | { 102 | logger.Log($"Error checking app {appName}: {ex.Message}", Color.Red, ex.StackTrace); 103 | } 104 | 105 | // Not installed 106 | return false; 107 | } 108 | 109 | // Uninstall an appx 110 | private async Task UninstallApp(string appName) 111 | { 112 | try 113 | { 114 | string uninstallCommand = $"Get-AppxPackage *{appName}* | Remove-AppxPackage"; 115 | 116 | using (PowerShell powerShell = PowerShell.Create()) 117 | { 118 | powerShell.AddScript(uninstallCommand); 119 | await Task.Run(() => powerShell.Invoke()); 120 | } 121 | } 122 | catch (Exception ex) 123 | { 124 | logger.Log($"Error uninstalling app {appName}: {ex.Message}", Color.Red, ex.StackTrace); 125 | } 126 | } 127 | } 128 | } 129 | -------------------------------------------------------------------------------- /SuperMSConfig/Config/ServiceHabit.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Win32; 2 | using System; 3 | using System.Drawing; 4 | using System.ServiceProcess; 5 | using System.Threading.Tasks; 6 | 7 | namespace SuperMSConfig 8 | { 9 | public class ServiceHabit : BaseHabit 10 | { 11 | private readonly string serviceName; 12 | private readonly string description; 13 | private readonly Logger logger; 14 | private readonly int badValue; 15 | 16 | public ServiceHabit(string serviceName, string description, Logger logger, int badValue) 17 | { 18 | this.serviceName = serviceName; 19 | this.description = description; 20 | this.logger = logger; 21 | this.badValue = badValue; 22 | Status = HabitStatus.NotConfigured; // Initial status 23 | } 24 | 25 | public override string Name => $"Service: {serviceName}"; 26 | public override string Description => description; 27 | 28 | public override HabitStatus Status { get; set; } 29 | 30 | public override async Task Check() 31 | { 32 | try 33 | { 34 | logger.Log($"Checking service '{serviceName}'...", Color.Blue); 35 | 36 | ServiceControllerStatus status = CheckServiceStatus(); 37 | if ((badValue == 1 && status == ServiceControllerStatus.Running) || 38 | (badValue == 0 && status != ServiceControllerStatus.Running)) 39 | { 40 | Status = HabitStatus.Bad; 41 | } 42 | else 43 | { 44 | Status = HabitStatus.Good; 45 | } 46 | 47 | logger.Log($"{serviceName} status: {(Status == HabitStatus.Bad ? "Bad" : "Good")}.", Status == HabitStatus.Bad ? Color.Red : Color.Green); 48 | } 49 | catch (Exception ex) 50 | { 51 | logger.Log($"Error during Check: {ex.Message}", Color.Red, ex.StackTrace); 52 | Status = HabitStatus.NotConfigured; // Set status to NotConfigured in case of error 53 | } 54 | } 55 | 56 | private ServiceControllerStatus CheckServiceStatus() 57 | { 58 | try 59 | { 60 | using (var service = new ServiceController(serviceName)) 61 | { 62 | service.Refresh(); 63 | return service.Status; 64 | } 65 | } 66 | catch (InvalidOperationException ex) 67 | { 68 | logger.Log($"Service '{serviceName}' not found: {ex.Message}", Color.Red); 69 | Status = HabitStatus.NotConfigured; // Set status to NotConfigured if the service is not found 70 | return ServiceControllerStatus.Stopped; 71 | } 72 | catch (Exception ex) 73 | { 74 | logger.Log($"Error checking status of '{serviceName}': {ex.Message}", Color.Red); 75 | Status = HabitStatus.NotConfigured; // Set status to NotConfigured if there is a general error 76 | return ServiceControllerStatus.Stopped; 77 | } 78 | } 79 | 80 | public override async Task Fix() 81 | { 82 | try 83 | { 84 | if (Status == HabitStatus.Bad) 85 | { 86 | logger.Log($"Stopping service '{serviceName}' and setting to manual...", Color.Blue); 87 | await Task.Run(() => 88 | { 89 | using (var service = new ServiceController(serviceName)) 90 | { 91 | if (service.Status != ServiceControllerStatus.Stopped) 92 | { 93 | service.Stop(); 94 | service.WaitForStatus(ServiceControllerStatus.Stopped); 95 | logger.Log($"Service '{serviceName}' stopped successfully.", Color.Green); 96 | } 97 | else 98 | { 99 | logger.Log($"Service '{serviceName}' is already stopped.", Color.Orange); 100 | } 101 | 102 | SetServiceStartType(serviceName, 3); // 3 means Manual 103 | } 104 | }); 105 | } 106 | } 107 | catch (InvalidOperationException ex) 108 | { 109 | logger.Log($"Service '{serviceName}' not found or cannot be stopped: {ex.Message}", Color.Red); 110 | } 111 | catch (Exception ex) 112 | { 113 | logger.Log($"Error stopping service '{serviceName}': {ex.Message}", Color.Red); 114 | } 115 | } 116 | 117 | public override async Task Revert() 118 | { 119 | try 120 | { 121 | if (Status == HabitStatus.Good) 122 | { 123 | logger.Log($"Starting service '{serviceName}' and setting to automatic...", Color.Blue); 124 | await Task.Run(() => 125 | { 126 | using (var service = new ServiceController(serviceName)) 127 | { 128 | if (service.Status != ServiceControllerStatus.Running) 129 | { 130 | service.Start(); 131 | service.WaitForStatus(ServiceControllerStatus.Running); 132 | logger.Log($"Service '{serviceName}' started successfully.", Color.Green); 133 | } 134 | else 135 | { 136 | logger.Log($"Service '{serviceName}' is already running.", Color.Orange); 137 | } 138 | 139 | SetServiceStartType(serviceName, 2); // 2 means Automatic 140 | } 141 | }); 142 | } 143 | } 144 | catch (InvalidOperationException ex) 145 | { 146 | logger.Log($"Service '{serviceName}' not found or cannot be started: {ex.Message}", Color.Red); 147 | } 148 | catch (Exception ex) 149 | { 150 | logger.Log($"Error starting service '{serviceName}': {ex.Message}", Color.Red); 151 | } 152 | } 153 | 154 | private void SetServiceStartType(string serviceName, int startType) 155 | { 156 | try 157 | { 158 | string keyPath = $@"SYSTEM\CurrentControlSet\Services\{serviceName}"; 159 | using (RegistryKey key = Registry.LocalMachine.OpenSubKey(keyPath, writable: true)) 160 | { 161 | if (key != null) 162 | { 163 | key.SetValue("Start", startType, RegistryValueKind.DWord); 164 | logger.Log($"Service '{serviceName}' start type set to {(startType == 2 ? "Automatic" : "Manual")}.", Color.Green); 165 | } 166 | else 167 | { 168 | logger.Log($"Failed to find registry key for service '{serviceName}'.", Color.Red); 169 | } 170 | } 171 | } 172 | catch (Exception ex) 173 | { 174 | logger.Log($"Error setting service start type: {ex.Message}", Color.Red); 175 | } 176 | } 177 | 178 | public override string GetDetails() 179 | { 180 | ServiceControllerStatus status = CheckServiceStatus(); 181 | return $"Service Name: {serviceName}, Description: {description}, Status: {status}"; 182 | } 183 | } 184 | } 185 | -------------------------------------------------------------------------------- /SuperMSConfig/Config/StartupHabit.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Win32; 2 | using System; 3 | using System.Linq; 4 | using System.Threading.Tasks; 5 | using System.Windows.Forms; 6 | using System.Drawing; 7 | 8 | namespace SuperMSConfig 9 | { 10 | public class StartupHabit : BaseHabit 11 | { 12 | private readonly string appName; 13 | private readonly string description; 14 | private readonly Logger logger; 15 | 16 | public StartupHabit(string appName, string description, Logger logger) 17 | { 18 | this.appName = appName; 19 | this.description = description ?? "No description provided"; 20 | this.logger = logger; 21 | } 22 | 23 | public override string Name => appName; 24 | public override string Description => description; 25 | 26 | public override HabitStatus Status { get; set; } = HabitStatus.NotConfigured; 27 | 28 | public override async Task Check() 29 | { 30 | await Task.Run(() => 31 | { 32 | try 33 | { 34 | bool foundInHKCU = CheckRegistry(@"Software\Microsoft\Windows\CurrentVersion\Run", Registry.CurrentUser); 35 | bool foundInHKLM = CheckRegistry(@"Software\Microsoft\Windows\CurrentVersion\Run", Registry.LocalMachine); 36 | 37 | if (foundInHKCU || foundInHKLM) 38 | { 39 | Status = HabitStatus.Bad; 40 | } 41 | else 42 | { 43 | Status = HabitStatus.Good; 44 | } 45 | 46 | logger.Log($"Checked startup for '{appName}': {(Status == HabitStatus.Bad ? "Found" : "Not Found")}", Status == HabitStatus.Bad ? Color.Red : Color.Green); 47 | } 48 | catch (Exception ex) 49 | { 50 | logger.Log($"Error during Check for '{appName}': {ex.Message}", Color.Red); 51 | } 52 | }); 53 | } 54 | 55 | private bool CheckRegistry(string subKey, RegistryKey baseKey) 56 | { 57 | try 58 | { 59 | using (var key = baseKey.OpenSubKey(subKey)) 60 | { 61 | if (key != null) 62 | { 63 | var apps = key.GetValueNames(); 64 | return apps.Contains(appName); 65 | } 66 | } 67 | } 68 | catch (Exception ex) 69 | { 70 | logger.Log($"Error during Check for '{appName}': {ex.Message}", Color.Red); 71 | } 72 | return false; 73 | } 74 | 75 | public override async Task Fix() 76 | { 77 | await Task.Run(() => 78 | { 79 | try 80 | { 81 | bool removedFromHKCU = RemoveFromRegistry(@"Software\Microsoft\Windows\CurrentVersion\Run", Registry.CurrentUser); 82 | bool removedFromHKLM = RemoveFromRegistry(@"Software\Microsoft\Windows\CurrentVersion\Run", Registry.LocalMachine); 83 | 84 | if (removedFromHKCU || removedFromHKLM) 85 | { 86 | Status = HabitStatus.Good; 87 | logger.Log($"Fixed startup for '{appName}': Removed from startup", Color.Green); 88 | } 89 | else 90 | { 91 | logger.Log($"Failed to remove startup entry for '{appName}'", Color.Orange); 92 | } 93 | } 94 | catch (Exception ex) 95 | { 96 | logger.Log($"Error during Fix for '{appName}': {ex.Message}", Color.Red); 97 | } 98 | }); 99 | } 100 | 101 | private bool RemoveFromRegistry(string subKey, RegistryKey baseKey) 102 | { 103 | try 104 | { 105 | using (var key = baseKey.OpenSubKey(subKey, true)) 106 | { 107 | if (key != null && Status == HabitStatus.Bad) 108 | { 109 | var apps = key.GetValueNames(); 110 | if (apps.Contains(appName)) 111 | { 112 | key.DeleteValue(appName, false); 113 | return true; 114 | } 115 | } 116 | } 117 | } 118 | catch (Exception ex) 119 | { 120 | logger.Log($"Error removing from registry '{appName}': {ex.Message}", Color.Red); 121 | } 122 | return false; 123 | } 124 | 125 | public override Task Revert() 126 | { 127 | return Task.Run(() => 128 | { 129 | try 130 | { 131 | string message = "Revert of this action is not possible. Please enable the autostart in the application's settings."; 132 | logger.Log(message, Color.Orange); 133 | MessageBox.Show(message, "Revert Not Possible", MessageBoxButtons.OK, MessageBoxIcon.Warning); 134 | } 135 | catch (Exception ex) 136 | { 137 | logger.Log($"Error during Revert for '{appName}': {ex.Message}", Color.Red); 138 | } 139 | }); 140 | } 141 | 142 | public override string GetDetails() 143 | { 144 | return $"App Name: {appName}, Description: {description}"; 145 | } 146 | } 147 | } -------------------------------------------------------------------------------- /SuperMSConfig/GetStartedPage.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace SuperMSConfig 2 | { 3 | partial class GetStartedPage 4 | { 5 | /// 6 | /// Erforderliche Designervariable. 7 | /// 8 | private System.ComponentModel.IContainer components = null; 9 | 10 | /// 11 | /// Verwendete Ressourcen bereinigen. 12 | /// 13 | /// True, wenn verwaltete Ressourcen gelöscht werden sollen; andernfalls False. 14 | protected override void Dispose(bool disposing) 15 | { 16 | if (disposing && (components != null)) 17 | { 18 | components.Dispose(); 19 | } 20 | base.Dispose(disposing); 21 | } 22 | 23 | #region Vom Komponenten-Designer generierter Code 24 | 25 | /// 26 | /// Erforderliche Methode für die Designerunterstützung. 27 | /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden. 28 | /// 29 | private void InitializeComponent() 30 | { 31 | this.btnBack = new System.Windows.Forms.Button(); 32 | this.btnNext = new System.Windows.Forms.Button(); 33 | this.lblHeader = new System.Windows.Forms.Label(); 34 | this.lblDescription = new System.Windows.Forms.Label(); 35 | this.pictureBox1 = new System.Windows.Forms.PictureBox(); 36 | ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); 37 | this.SuspendLayout(); 38 | // 39 | // btnBack 40 | // 41 | this.btnBack.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); 42 | this.btnBack.AutoEllipsis = true; 43 | this.btnBack.BackColor = System.Drawing.Color.Transparent; 44 | this.btnBack.Cursor = System.Windows.Forms.Cursors.Hand; 45 | this.btnBack.FlatAppearance.BorderSize = 0; 46 | this.btnBack.FlatAppearance.MouseOverBackColor = System.Drawing.Color.Gainsboro; 47 | this.btnBack.FlatStyle = System.Windows.Forms.FlatStyle.Flat; 48 | this.btnBack.Font = new System.Drawing.Font("Segoe MDL2 Assets", 11.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 49 | this.btnBack.ForeColor = System.Drawing.Color.Black; 50 | this.btnBack.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft; 51 | this.btnBack.Location = new System.Drawing.Point(166, 116); 52 | this.btnBack.Name = "btnBack"; 53 | this.btnBack.Size = new System.Drawing.Size(33, 32); 54 | this.btnBack.TabIndex = 286; 55 | this.btnBack.Text = "<"; 56 | this.btnBack.UseVisualStyleBackColor = false; 57 | this.btnBack.Click += new System.EventHandler(this.btnBack_Click); 58 | // 59 | // btnNext 60 | // 61 | this.btnNext.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); 62 | this.btnNext.AutoEllipsis = true; 63 | this.btnNext.BackColor = System.Drawing.Color.Transparent; 64 | this.btnNext.Cursor = System.Windows.Forms.Cursors.Hand; 65 | this.btnNext.FlatAppearance.BorderColor = System.Drawing.Color.WhiteSmoke; 66 | this.btnNext.FlatAppearance.BorderSize = 0; 67 | this.btnNext.FlatAppearance.MouseOverBackColor = System.Drawing.Color.Gainsboro; 68 | this.btnNext.FlatStyle = System.Windows.Forms.FlatStyle.Flat; 69 | this.btnNext.Font = new System.Drawing.Font("Segoe MDL2 Assets", 11.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 70 | this.btnNext.ForeColor = System.Drawing.Color.Black; 71 | this.btnNext.Location = new System.Drawing.Point(205, 116); 72 | this.btnNext.Name = "btnNext"; 73 | this.btnNext.Size = new System.Drawing.Size(33, 32); 74 | this.btnNext.TabIndex = 287; 75 | this.btnNext.Text = ">"; 76 | this.btnNext.UseVisualStyleBackColor = false; 77 | this.btnNext.Click += new System.EventHandler(this.btnNext_Click); 78 | // 79 | // lblHeader 80 | // 81 | this.lblHeader.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 82 | | System.Windows.Forms.AnchorStyles.Right))); 83 | this.lblHeader.AutoEllipsis = true; 84 | this.lblHeader.Font = new System.Drawing.Font("Segoe UI Variable Display", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 85 | this.lblHeader.Location = new System.Drawing.Point(46, 9); 86 | this.lblHeader.Name = "lblHeader"; 87 | this.lblHeader.Size = new System.Drawing.Size(204, 67); 88 | this.lblHeader.TabIndex = 288; 89 | this.lblHeader.Text = "Welcome to the new era of System Configuration"; 90 | // 91 | // lblDescription 92 | // 93 | this.lblDescription.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 94 | | System.Windows.Forms.AnchorStyles.Left) 95 | | System.Windows.Forms.AnchorStyles.Right))); 96 | this.lblDescription.AutoEllipsis = true; 97 | this.lblDescription.Font = new System.Drawing.Font("Segoe UI Variable Small Light", 12F); 98 | this.lblDescription.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); 99 | this.lblDescription.Location = new System.Drawing.Point(12, 165); 100 | this.lblDescription.Name = "lblDescription"; 101 | this.lblDescription.Size = new System.Drawing.Size(226, 342); 102 | this.lblDescription.TabIndex = 289; 103 | this.lblDescription.Text = "..."; 104 | // 105 | // pictureBox1 106 | // 107 | this.pictureBox1.Image = global::SuperMSConfig.Properties.Resources.assetCopilotBW; 108 | this.pictureBox1.Location = new System.Drawing.Point(3, 9); 109 | this.pictureBox1.Name = "pictureBox1"; 110 | this.pictureBox1.Size = new System.Drawing.Size(37, 35); 111 | this.pictureBox1.TabIndex = 290; 112 | this.pictureBox1.TabStop = false; 113 | // 114 | // GetStartedPage 115 | // 116 | this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F); 117 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; 118 | this.BackColor = System.Drawing.Color.White; 119 | this.Controls.Add(this.pictureBox1); 120 | this.Controls.Add(this.lblDescription); 121 | this.Controls.Add(this.lblHeader); 122 | this.Controls.Add(this.btnNext); 123 | this.Controls.Add(this.btnBack); 124 | this.Name = "GetStartedPage"; 125 | this.Size = new System.Drawing.Size(253, 531); 126 | ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); 127 | this.ResumeLayout(false); 128 | 129 | } 130 | 131 | #endregion 132 | private System.Windows.Forms.Button btnBack; 133 | private System.Windows.Forms.Button btnNext; 134 | private System.Windows.Forms.Label lblHeader; 135 | private System.Windows.Forms.Label lblDescription; 136 | private System.Windows.Forms.PictureBox pictureBox1; 137 | } 138 | } 139 | -------------------------------------------------------------------------------- /SuperMSConfig/GetStartedPage.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Drawing; 3 | using System.Windows.Forms; 4 | 5 | namespace SuperMSConfig 6 | { 7 | public partial class GetStartedPage : UserControl 8 | { 9 | private int currentStep = 0; 10 | 11 | private string[] stepsDescriptions = new[] 12 | { 13 | "SuperMSConfig revisits the out-of-box setup, letting you fine-tune the Windows 11 post-installation experience. Whether it’s disabling intrusive features or optimizing services, it provides full control over how your system behaves immediately after setup. " + 14 | "\n\nGot questions? Just click the Copilot icon!", 15 | 16 | "The 'OOBE' scan reviews all default system configuration categories, as well as over 10 additional areas for potential misconfigurations." + 17 | "You can personalize the scan by selecting specific categories using the dropdown. " + 18 | "\n\nClick 'Check' to begin the scan.", 19 | 20 | "After a successful scan, you can view the results directly. Good configurations are grayed out," + 21 | " non-configured settings are highlighted in orange, and bad configurations are marked in red. " + 22 | "Clicking on an entry also updates the status in the three small radio buttons at the bottom left.", 23 | 24 | "Besides the native scan, you can map any other tweaks you want. " + 25 | "Whether it's a recommended config from Neowin or Deskmodder, " + 26 | "or from an app like Bloatynosy, the magic lies in '... Settings > Load config from source'." + 27 | "For more details on how it works and to add more tweaks, check the 'source' folder of the app." 28 | }; 29 | 30 | private string[] stepsHeader = new[] 31 | { 32 | "Welcome", 33 | "Step 1: Let's customize your experience", 34 | "Step 2: Review the results", 35 | "Step 3: Load additional tweaks" 36 | }; 37 | 38 | public GetStartedPage() 39 | { 40 | InitializeComponent(); 41 | SetStyle(); 42 | UpdateStep(); 43 | BackColor = Color.FromArgb(249, 249, 251); 44 | } 45 | 46 | private void SetStyle() 47 | { 48 | // Segoe MDL2 Assets 49 | btnBack.Text = "\uE76B"; 50 | btnNext.Text = "\uE76C"; 51 | } 52 | 53 | private void UpdateStep() 54 | { 55 | lblDescription.Text = stepsDescriptions[currentStep]; 56 | lblHeader.Text = stepsHeader[currentStep]; 57 | btnBack.Enabled = currentStep > 0; 58 | btnNext.Text = currentStep < stepsDescriptions.Length - 1 ? "\uE76C" : "\uE73E"; 59 | } 60 | 61 | private void btnBack_Click(object sender, EventArgs e) 62 | { 63 | if (currentStep > 0) 64 | { 65 | currentStep--; 66 | UpdateStep(); 67 | } 68 | } 69 | 70 | private void btnNext_Click(object sender, EventArgs e) 71 | { 72 | if (currentStep < stepsDescriptions.Length - 1) 73 | { 74 | currentStep++; 75 | UpdateStep(); 76 | } 77 | else 78 | { 79 | MessageBox.Show("Thanks for taking the time to get to know SuperMSConfig! Your system's new configuration awaits."); 80 | } 81 | } 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /SuperMSConfig/GetStartedPage.resx: -------------------------------------------------------------------------------- 1 |  2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | -------------------------------------------------------------------------------- /SuperMSConfig/HabitChecker.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using System.Drawing; 3 | using System.Linq; 4 | using System.Threading.Tasks; 5 | using static BaseHabit; 6 | 7 | namespace SuperMSConfig 8 | { 9 | public class HabitChecker 10 | { 11 | private readonly List habitCategories = new List(); 12 | private readonly Logger logger; 13 | 14 | public HabitChecker(Logger logger) 15 | { 16 | this.logger = logger; 17 | 18 | // Add habit categories 19 | habitCategories.Add(new AdsHabits(logger)); 20 | habitCategories.Add(new AIHabits(logger)); 21 | habitCategories.Add(new PrivacyHabits(logger)); 22 | habitCategories.Add(new SecurityHabits(logger)); 23 | habitCategories.Add(new ServiceHabits(logger)); 24 | habitCategories.Add(new AppsHabits(logger)); 25 | habitCategories.Add(new StartupHabits(logger)); 26 | habitCategories.Add(new SystemHabits(logger)); 27 | habitCategories.Add(new BrowserHabits(logger)); 28 | habitCategories.Add(new GamingHabits(logger)); 29 | } 30 | 31 | public async Task> GetAllHabits() 32 | { 33 | var habits = new List(); 34 | 35 | foreach (var category in habitCategories) 36 | { 37 | habits.AddRange(category.GetHabits()); 38 | } 39 | 40 | return habits; 41 | } 42 | 43 | public async Task CheckHabit(BaseHabit habit) 44 | { 45 | await habit.Check(); 46 | logger.Log($"{habit.Name} - {habit.Description}: {habit.Status}", 47 | GetColorForStatus(habit.Status), 48 | habit.GetDetails()); 49 | } 50 | 51 | // Get color based on HabitStatus 52 | public Color GetColorForStatus(HabitStatus status) 53 | { 54 | switch (status) 55 | { 56 | case HabitStatus.Good: 57 | return Color.DimGray; 58 | 59 | case HabitStatus.Bad: 60 | return Color.Crimson; 61 | 62 | case HabitStatus.NotConfigured: 63 | return Color.DarkOrange; 64 | 65 | default: 66 | return Color.Black; // Fallback color if status is unknown 67 | } 68 | } 69 | 70 | // Get all category names and add to dropdown list in UI 71 | public List GetCategoryNames() 72 | { 73 | return habitCategories 74 | .Select(c => c.CategoryName) 75 | .Distinct() 76 | .ToList(); 77 | } 78 | 79 | public async Task> GetHabitsByCategory(string categoryName) 80 | { 81 | var category = habitCategories.FirstOrDefault(c => c.CategoryName == categoryName); 82 | 83 | if (category != null) 84 | { 85 | return category.GetHabits().ToList(); 86 | } 87 | 88 | return new List(); 89 | } 90 | } 91 | } -------------------------------------------------------------------------------- /SuperMSConfig/Habits/AIHabits.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Win32; 2 | using SuperMSConfig; 3 | using System; 4 | 5 | public class AIHabits : BaseHabitCategory 6 | { 7 | public override string CategoryName => "AI"; 8 | private readonly Logger logger; 9 | 10 | public AIHabits(Logger logger) 11 | { 12 | this.logger = logger; 13 | 14 | // Copilot Taskbar 15 | habits.Add(new SuperMSConfig.RegistryHabit( 16 | RegistryHive.CurrentUser, 17 | @"Software\Policies\Microsoft\Windows\WindowsCopilot", 18 | "TurnOffWindowsCopilot", 19 | 0, 20 | 1, 21 | "Windows AI", 22 | "DWORD", 23 | logger)); 24 | 25 | // Recall Experience 26 | habits.Add(new SuperMSConfig.RegistryHabit( 27 | RegistryHive.CurrentUser, 28 | @"Software\Policies\Microsoft\Windows\WindowsAI", 29 | "DisableAIDataAnalysis", 30 | 0, 31 | 1, 32 | "Windows AI (Recall > Current user)", 33 | "DWORD", logger)); 34 | habits.Add(new SuperMSConfig.RegistryHabit( 35 | RegistryHive.LocalMachine, 36 | @"Software\Policies\Microsoft\Windows\WindowsAI", 37 | "DisableAIDataAnalysis", 38 | 0, 39 | 1, 40 | "Windows AI (Recall > All users)", 41 | "DWORD", 42 | logger)); 43 | } 44 | } -------------------------------------------------------------------------------- /SuperMSConfig/Habits/AdsHabits.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Win32; 2 | using SuperMSConfig; 3 | using System; 4 | using System.Collections.Generic; 5 | 6 | public class AdsHabits : BaseHabitCategory 7 | { 8 | private readonly Logger logger; 9 | 10 | public override string CategoryName => "Ads"; 11 | 12 | public AdsHabits(Logger logger) 13 | { 14 | // this.logger = logger ?? throw new ArgumentNullException(nameof(logger)); 15 | // just assign our logger to the field if it's null 16 | this.logger = logger; 17 | 18 | if (logger == null) 19 | { 20 | Console.WriteLine("Warning: Logger is null. Logging will be disabled."); 21 | } 22 | 23 | habits.Add(new SuperMSConfig.RegistryHabit( 24 | RegistryHive.CurrentUser, 25 | @"Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced", 26 | "ShowSyncProviderNotifications", 27 | 1, 28 | 0, 29 | "Disable Windows 11 File Explorer Ads", 30 | "DWORD", 31 | logger)); 32 | 33 | habits.Add(new SuperMSConfig.RegistryHabit( 34 | RegistryHive.CurrentUser, 35 | @"Software\Microsoft\Windows\CurrentVersion\UserProfileEngagement", 36 | "ScoobeSystemSettingEnabled", 37 | 1, 38 | 0, 39 | "Disable Windows 11 FinishSetup Ads", 40 | "DWORD", 41 | logger)); 42 | 43 | habits.Add(new SuperMSConfig.RegistryHabit( 44 | RegistryHive.CurrentUser, 45 | @"Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager", 46 | "RotatingLockScreenOverlayEnabled", 47 | 1, 48 | 0, 49 | "Disable Windows 11 LockScreen Ads", 50 | "DWORD", 51 | logger)); 52 | 53 | habits.Add(new SuperMSConfig.RegistryHabit( 54 | RegistryHive.CurrentUser, 55 | @"Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager", 56 | "SubscribedContent-338387Enabled", 57 | 1, 58 | 0, 59 | "Disable Windows 11 LockScreen Ads", 60 | "DWORD", 61 | logger)); 62 | 63 | habits.Add(new SuperMSConfig.RegistryHabit( 64 | RegistryHive.CurrentUser, 65 | @"Software\Microsoft\Windows\CurrentVersion\AdvertisingInfo", 66 | "Enabled", 67 | 1, 68 | 0, 69 | "Disable Windows 11 Personalized Ads", 70 | "DWORD", 71 | logger)); 72 | 73 | habits.Add(new SuperMSConfig.RegistryHabit( 74 | RegistryHive.CurrentUser, 75 | @"Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager", 76 | "SubscribedContent-338393Enabled", 77 | 1, 78 | 0, 79 | "Disable Windows 11 Settings Ads", 80 | "DWORD", 81 | logger)); 82 | 83 | habits.Add(new SuperMSConfig.RegistryHabit( 84 | RegistryHive.CurrentUser, 85 | @"Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager", 86 | "SubscribedContent-353694Enabled", 87 | 1, 88 | 0, 89 | "Disable Windows 11 Settings Ads", 90 | "DWORD", 91 | logger)); 92 | 93 | habits.Add(new SuperMSConfig.RegistryHabit( 94 | RegistryHive.CurrentUser, 95 | @"Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager", 96 | "SubscribedContent-353696Enabled", 97 | 1, 98 | 0, 99 | "Disable Windows 11 Settings Ads", 100 | "DWORD", 101 | logger)); 102 | 103 | habits.Add(new SuperMSConfig.RegistryHabit( 104 | RegistryHive.CurrentUser, 105 | @"Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced", 106 | "Start_IrisRecommendations", 107 | 1, 108 | 0, 109 | "Disable Windows 11 Startmenu Ads", 110 | "DWORD", 111 | logger)); 112 | 113 | habits.Add(new SuperMSConfig.RegistryHabit( 114 | RegistryHive.CurrentUser, 115 | @"Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager", 116 | "SubscribedContent-338389Enabled", 117 | 1, 118 | 0, 119 | "Disable Windows Tips and Suggestions", 120 | "DWORD", 121 | logger)); 122 | 123 | habits.Add(new SuperMSConfig.RegistryHabit( 124 | RegistryHive.CurrentUser, 125 | @"Software\Microsoft\Windows\CurrentVersion\Privacy", 126 | "TailoredExperiencesWithDiagnosticDataEnabled", 127 | 1, 128 | 0, 129 | "Disable Tailored Experiences", 130 | "DWORD", 131 | logger)); 132 | 133 | habits.Add(new SuperMSConfig.RegistryHabit( 134 | RegistryHive.CurrentUser, 135 | @"Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager", 136 | "SubscribedContent-310093Enabled", 137 | 1, 138 | 0, 139 | "Disable Windows 11 Welcome Experience Ads", 140 | "DWORD", 141 | logger)); 142 | } 143 | } -------------------------------------------------------------------------------- /SuperMSConfig/Habits/AppsHabits.cs: -------------------------------------------------------------------------------- 1 | using SuperMSConfig; 2 | using System; 3 | 4 | public class AppsHabits : BaseHabitCategory 5 | { 6 | private readonly Logger logger; 7 | 8 | public override string CategoryName => "Apps / Bloatware"; 9 | 10 | public AppsHabits(Logger logger) 11 | { 12 | this.logger = logger; 13 | 14 | // Bloatware entries 15 | habits.Add(new AppsHabit("Microsoft.BingWeather", "Remove Microsoft Bing Weather App", logger)); 16 | habits.Add(new AppsHabit("Microsoft.XboxApp", "Remove Xbox App", logger)); 17 | habits.Add(new AppsHabit("Microsoft.OfficeHub", "Remove Office Hub", logger)); 18 | habits.Add(new AppsHabit("Microsoft.SkypeApp", "Remove Skype", logger)); 19 | habits.Add(new AppsHabit("Microsoft.MixedReality.Portal", "Remove Mixed Reality Portal", logger)); 20 | habits.Add(new AppsHabit("Microsoft.WindowsPhone", "Remove Windows Phone App", logger)); 21 | habits.Add(new AppsHabit("Microsoft.3DBuilder", "Remove 3D Builder", logger)); 22 | habits.Add(new AppsHabit("Microsoft.BingFinance", "Remove Bing Finance", logger)); 23 | habits.Add(new AppsHabit("Microsoft.BingNews", "Remove Bing News", logger)); 24 | habits.Add(new AppsHabit("Microsoft.BingSports", "Remove Bing Sports", logger)); 25 | habits.Add(new AppsHabit("Microsoft.BingTravel", "Remove Bing Travel", logger)); 26 | habits.Add(new AppsHabit("Microsoft.GetHelp", "Remove Get Help App", logger)); 27 | habits.Add(new AppsHabit("Microsoft.GetStarted", "Remove Get Started App", logger)); 28 | // Additional bloatware entries 29 | habits.Add(new AppsHabit("Microsoft.MicrosoftSolitaireCollection", "Remove Microsoft Solitaire Collection", logger)); 30 | habits.Add(new AppsHabit("Microsoft.MicrosoftStickyNotes", "Remove Microsoft Sticky Notes", logger)); 31 | habits.Add(new AppsHabit("Microsoft.MicrosoftToDo", "Remove Microsoft To Do", logger)); 32 | habits.Add(new AppsHabit("Microsoft.MicrosoftPhotos", "Remove Microsoft Photos", logger)); 33 | habits.Add(new AppsHabit("Microsoft.MicrosoftNews", "Remove Microsoft News", logger)); 34 | habits.Add(new AppsHabit("Facebook", "Remove Facebook", logger)); 35 | habits.Add(new AppsHabit("Instagram", "Remove Instagram", logger)); 36 | habits.Add(new AppsHabit("Twitter.Twitter", "Remove Twitter", logger)); 37 | habits.Add(new AppsHabit("King.CandyCrushSaga", "Remove Candy Crush Saga", logger)); 38 | habits.Add(new AppsHabit("King.CandyCrushSodaSaga", "Remove Candy Crush Soda Saga", logger)); 39 | habits.Add(new AppsHabit("King.CandyCrushFriendsSaga", "Remove Candy Crush Friends Saga", logger)); 40 | } 41 | } -------------------------------------------------------------------------------- /SuperMSConfig/Habits/GamingHabits.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Win32; 2 | using SuperMSConfig; 3 | using System; 4 | 5 | public class GamingHabits : BaseHabitCategory 6 | { 7 | private readonly Logger logger; 8 | 9 | public override string CategoryName => "Gaming"; 10 | 11 | public GamingHabits(Logger logger) 12 | { 13 | this.logger = logger; 14 | 15 | // Disable VBS (Virtualization-Based Security) 16 | habits.Add(new SuperMSConfig.RegistryHabit( 17 | RegistryHive.LocalMachine, 18 | @"SYSTEM\CurrentControlSet\Control\DeviceGuard", 19 | "EnableVirtualizationBasedSecurity", 20 | 1, // Bad value (enabled) 21 | 0, // Good value (disabled) 22 | "Disable Virtualization-Based Security " + 23 | "(This feature is known for hogging system resources." + 24 | "Disabling it frees up CPU cycles and ensures your games run smoother, " + 25 | "with less overhead dragging down performance making your gaming experience feel sluggish)", 26 | "DWORD", 27 | logger 28 | )); 29 | 30 | // Disable Core Isolation / Memory Integrity 31 | habits.Add(new SuperMSConfig.RegistryHabit( 32 | RegistryHive.LocalMachine, 33 | @"SYSTEM\CurrentControlSet\Control\DeviceGuard\Scenarios\HypervisorEnforcedCodeIntegrity", 34 | "Enabled", 35 | 1, // Bad value (enabled) 36 | 0, // Good value (disabled) 37 | "Disable Memory Integrity for better gaming FPS (Core Isolation)", 38 | "DWORD", logger 39 | )); 40 | } 41 | } -------------------------------------------------------------------------------- /SuperMSConfig/Habits/MSEdgeHabits.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Win32; 2 | using SuperMSConfig; 3 | using System; 4 | 5 | public class BrowserHabits : BaseHabitCategory 6 | { 7 | private readonly Logger logger; 8 | 9 | public override string CategoryName => "MS Edge "; 10 | 11 | public BrowserHabits(Logger logger) 12 | { 13 | this.logger = logger; 14 | 15 | // Disable Password Saving 16 | habits.Add(new SuperMSConfig.RegistryHabit( 17 | RegistryHive.LocalMachine, 18 | @"Software\Policies\Microsoft\Edge", 19 | "PasswordManagerEnabled", 20 | 1, // Bad value (password saving enabled) 21 | 0, // Good value (password saving disabled) 22 | CategoryName + "Disable password saving for better security", 23 | "DWORD", 24 | logger)); 25 | 26 | // Disable Auto-Complete 27 | habits.Add(new SuperMSConfig.RegistryHabit( 28 | RegistryHive.LocalMachine, 29 | @"Software\Policies\Microsoft\Edge", 30 | "AutofillAddressEnabled", 31 | 1, // Bad value (auto-fill enabled) 32 | 0, // Good value (auto-fill disabled) 33 | CategoryName + "Disable auto-fill for better privacy", 34 | "DWORD", 35 | logger)); 36 | 37 | // Enable Safe Browsing 38 | habits.Add(new SuperMSConfig.RegistryHabit( 39 | RegistryHive.LocalMachine, 40 | @"Software\Policies\Microsoft\Edge", 41 | "SafeBrowsingEnabled", 42 | 0, // Bad value (safe browsing disabled) 43 | 1, // Good value (safe browsing enabled) 44 | CategoryName + "Enable Safe Browsing to protect against harmful sites", 45 | "DWORD", 46 | logger)); 47 | 48 | // Block Pop-ups 49 | habits.Add(new SuperMSConfig.RegistryHabit( 50 | RegistryHive.LocalMachine, 51 | @"Software\Policies\Microsoft\Edge", 52 | "PopupsAllowed", 53 | 1, // Bad value (pop-ups allowed) 54 | 0, // Good value (pop-ups blocked) 55 | CategoryName + "Block pop-ups to avoid unwanted interruptions", 56 | "DWORD", 57 | logger)); 58 | 59 | // Enable Do Not Track 60 | habits.Add(new SuperMSConfig.RegistryHabit( 61 | RegistryHive.LocalMachine, 62 | @"Software\Policies\Microsoft\Edge", 63 | "DoNotTrackEnabled", 64 | 0, // Bad value (Do Not Track disabled) 65 | 1, // Good value (Do Not Track enabled) 66 | CategoryName + "Enable Do Not Track to enhance privacy", 67 | "DWORD", 68 | logger)); 69 | 70 | // Disable Autofill Credit Card 71 | habits.Add(new SuperMSConfig.RegistryHabit( 72 | RegistryHive.LocalMachine, 73 | @"Software\Policies\Microsoft\Edge", 74 | "AutofillCreditCardEnabled", 75 | 1, // Bad value (credit card autofill enabled) 76 | 0, // Good value (credit card autofill disabled) 77 | CategoryName + "Disable autofill for credit cards for better security", 78 | "DWORD", 79 | logger)); 80 | 81 | // Disable Browser Sign-in 82 | habits.Add(new SuperMSConfig.RegistryHabit( 83 | RegistryHive.LocalMachine, 84 | @"Software\Policies\Microsoft\Edge", 85 | "BrowserSignin", 86 | 1, // Bad value (sign-in enabled) 87 | 0, // Good value (sign-in disabled) 88 | CategoryName + "Disable browser sign-in to prevent account syncing", 89 | "DWORD", 90 | logger)); 91 | 92 | // Disable Default Browser Setting 93 | habits.Add(new SuperMSConfig.RegistryHabit( 94 | RegistryHive.LocalMachine, 95 | @"Software\Policies\Microsoft\Edge", 96 | "DefaultBrowserSettingEnabled", 97 | 1, // Bad value (default browser setting enabled) 98 | 0, // Good value (default browser setting disabled) 99 | CategoryName + "Disable default browser setting", 100 | "DWORD", 101 | logger)); 102 | 103 | // Disable Edge Collections 104 | habits.Add(new SuperMSConfig.RegistryHabit( 105 | RegistryHive.LocalMachine, 106 | @"Software\Policies\Microsoft\Edge", 107 | "EdgeCollectionsEnabled", 108 | 1, // Bad value (collections enabled) 109 | 0, // Good value (collections disabled) 110 | CategoryName + "Disable Edge Collections", 111 | "DWORD", 112 | logger)); 113 | 114 | // Disable Edge Shopping Assistant 115 | habits.Add(new SuperMSConfig.RegistryHabit( 116 | RegistryHive.LocalMachine, 117 | @"Software\Policies\Microsoft\Edge", 118 | "EdgeShoppingAssistantEnabled", 119 | 1, // Bad value (shopping assistant enabled) 120 | 0, // Good value (shopping assistant disabled) 121 | CategoryName + "Disable Edge Shopping Assistant", 122 | "DWORD", 123 | logger)); 124 | 125 | // Disable Gamer Mode 126 | habits.Add(new SuperMSConfig.RegistryHabit( 127 | RegistryHive.LocalMachine, 128 | @"Software\Policies\Microsoft\Edge", 129 | "GamerModeEnabled", 130 | 1, // Bad value (gamer mode enabled) 131 | 0, // Good value (gamer mode disabled) 132 | CategoryName + "Disable Gamer Mode", 133 | "DWORD", 134 | logger)); 135 | 136 | // Disable First Run Experience 137 | habits.Add(new SuperMSConfig.RegistryHabit( 138 | RegistryHive.LocalMachine, 139 | @"Software\Policies\Microsoft\Edge", 140 | "HideFirstRunExperience", 141 | 0, // Bad value (first run experience enabled) 142 | 1, // Good value (first run experience disabled) 143 | CategoryName + "Hide First Run Experience", 144 | "DWORD", 145 | logger)); 146 | 147 | // Disable Import on Each Launch 148 | habits.Add(new SuperMSConfig.RegistryHabit( 149 | RegistryHive.LocalMachine, 150 | @"Software\Policies\Microsoft\Edge", 151 | "ImportOnEachLaunch", 152 | 1, // Bad value (import on each launch enabled) 153 | 0, // Good value (import on each launch disabled) 154 | CategoryName + "Disable import on each launch", 155 | "DWORD", 156 | logger)); 157 | 158 | // "Don't Show Sponsored links in new tab page 159 | habits.Add(new SuperMSConfig.RegistryHabit( 160 | RegistryHive.LocalMachine, 161 | @"Software\Policies\Microsoft\Edge", 162 | "NewTabPageHideDefaultTopSites", 163 | 0, // Bad value (top sites visible) 164 | 1, // Good value (top sites hidden) 165 | CategoryName + "Don't Show Sponsored links in new tab page", 166 | "DWORD", 167 | logger)); 168 | 169 | // Disable New Tab Page Quick Links 170 | habits.Add(new SuperMSConfig.RegistryHabit( 171 | RegistryHive.LocalMachine, 172 | @"Software\Policies\Microsoft\Edge", 173 | "NewTabPageQuickLinksEnabled", 174 | 1, // Bad value (quick links enabled) 175 | 0, // Good value (quick links disabled) 176 | CategoryName + "Disable quick links on new tab page", 177 | "DWORD", 178 | logger)); 179 | 180 | // Disable Startup Boost 181 | habits.Add(new SuperMSConfig.RegistryHabit( 182 | RegistryHive.LocalMachine, 183 | @"Software\Policies\Microsoft\Edge", 184 | "StartupBoostEnabled", 185 | 1, // Bad value (startup boost enabled) 186 | 0, // Good value (startup boost disabled) 187 | CategoryName + "Disable startup boost", 188 | "DWORD", 189 | logger)); 190 | 191 | // Disable User Feedback 192 | habits.Add(new SuperMSConfig.RegistryHabit( 193 | RegistryHive.LocalMachine, 194 | @"Software\Policies\Microsoft\Edge", 195 | "UserFeedbackAllowed", 196 | 1, // Bad value (feedback allowed) 197 | 0, // Good value (feedback disabled) 198 | CategoryName + "Disable user feedback", 199 | "DWORD", 200 | logger)); 201 | } 202 | } 203 | -------------------------------------------------------------------------------- /SuperMSConfig/Habits/PrivacyHabits.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Win32; 2 | using SuperMSConfig; 3 | using System; 4 | 5 | public class PrivacyHabits : BaseHabitCategory 6 | { 7 | private readonly Logger logger; 8 | 9 | public override string CategoryName => "Privacy"; 10 | 11 | public PrivacyHabits(Logger logger) 12 | { 13 | this.logger = logger; 14 | 15 | // Disable diagnostic data collection 16 | habits.Add(new SuperMSConfig.RegistryHabit( 17 | RegistryHive.LocalMachine, 18 | @"Software\Policies\Microsoft\Windows\DataCollection", 19 | "AllowTelemetry", 20 | 2, // Bad Enhanced data collection (full) 21 | 1, // Recommended for home users / Minimal data collection (basic) 22 | "Enable basic telemetry data collection for Home/Pro editions", 23 | "DWORD", 24 | logger)); 25 | 26 | habits.Add(new SuperMSConfig.RegistryHabit( 27 | RegistryHive.LocalMachine, 28 | @"Software\Policies\Microsoft\Windows\DataCollection", 29 | "AllowTelemetry", 30 | 1, // Bad value (enabled) 31 | 0, // Disable telemetry (only for Enterprise, Education, Server) 32 | "Disable telemetry data collection for enterprise-level privacy", 33 | "DWORD", 34 | logger)); 35 | 36 | // Disable activity history 37 | habits.Add(new SuperMSConfig.RegistryHabit( 38 | RegistryHive.CurrentUser, 39 | @"Software\Microsoft\Windows\CurrentVersion\Privacy", 40 | "ActivityHistoryEnabled", 41 | 1, // Bad value (enabled) 42 | 0, // Good value (disabled) 43 | "Disable activity history (prevents Windows from tracking and storing your activity)", 44 | "DWORD", 45 | logger)); 46 | 47 | // Disable location tracking 48 | habits.Add(new SuperMSConfig.RegistryHabit( 49 | RegistryHive.CurrentUser, 50 | @"Software\Microsoft\Windows\CurrentVersion\LocationAndSensors", 51 | "LocationEnabled", 52 | 1, // Bad value (enabled) 53 | 0, // Good value (disabled) 54 | "Disable location tracking (prevents Windows from accessing your location)", 55 | "DWORD", 56 | logger)); 57 | 58 | // Disable background apps 59 | habits.Add(new SuperMSConfig.RegistryHabit( 60 | RegistryHive.CurrentUser, 61 | @"Software\Microsoft\Windows\CurrentVersion\BackgroundAccessApplications", 62 | "Disabled", 63 | 1, // Bad value (enabled) 64 | 0, // Good value (disabled) 65 | "Disable background apps (prevents apps from running in the background)", 66 | "DWORD", 67 | logger)); 68 | 69 | // Disable automatic app updates 70 | habits.Add(new SuperMSConfig.RegistryHabit( 71 | RegistryHive.CurrentUser, 72 | @"Software\Microsoft\Windows\CurrentVersion\WindowsStore\WindowsUpdate", 73 | "AutoDownload", 74 | 1, // Bad value (enabled) 75 | 0, // Good value (disabled) 76 | "Disable automatic app updates (prevents apps from updating automatically)", 77 | "DWORD", 78 | logger)); 79 | 80 | // Disable sending of feedback and error reports 81 | habits.Add(new SuperMSConfig.RegistryHabit( 82 | RegistryHive.CurrentUser, 83 | @"Software\Microsoft\Windows\CurrentVersion\Feedback", 84 | "EnableFeedback", 85 | 0, // Bad value (enabled) 86 | 1, // Good value (disabled) 87 | "Disable sending of feedback and error reports (prevents sending feedback to Microsoft)", 88 | "DWORD", 89 | logger)); 90 | 91 | // Disable camera access 92 | habits.Add(new SuperMSConfig.RegistryHabit( 93 | RegistryHive.CurrentUser, 94 | @"Software\Microsoft\Windows\CurrentVersion\CapabilityAccessManager\ConsentStore\camera", 95 | "Value", 96 | "Allow", // Bad value (Allow) 97 | "Deny", // Good value (Deny) 98 | "Disable camera access (prevents apps from using your camera)", 99 | "STRING", 100 | logger)); 101 | 102 | // Disable microphone access 103 | habits.Add(new SuperMSConfig.RegistryHabit( 104 | RegistryHive.CurrentUser, 105 | @"Software\Microsoft\Windows\CurrentVersion\CapabilityAccessManager\ConsentStore\microphone", 106 | "Value", 107 | "Allow", // Bad value (Allow) 108 | "Deny", // Good value (Deny) 109 | "Disable microphone access (prevents apps from using your microphone)", 110 | "STRING", 111 | logger)); 112 | 113 | // Disable location access 114 | habits.Add(new SuperMSConfig.RegistryHabit( 115 | RegistryHive.CurrentUser, 116 | @"Software\Microsoft\Windows\CurrentVersion\CapabilityAccessManager\ConsentStore\location", 117 | "Value", 118 | "Allow", // Bad value (Allow) 119 | "Deny", // Good value (Deny) 120 | "Disable location access (prevents apps from using your location)", 121 | "STRING", 122 | logger)); 123 | 124 | // Disable contacts access 125 | habits.Add(new SuperMSConfig.RegistryHabit( 126 | RegistryHive.CurrentUser, 127 | @"Software\Microsoft\Windows\CurrentVersion\CapabilityAccessManager\ConsentStore\contacts", 128 | "Value", 129 | "Allow", // Bad value (Allow) 130 | "Deny", // Good value (Deny) 131 | "Disable contacts access (prevents apps from using your contacts)", 132 | "STRING", 133 | logger)); 134 | 135 | // Disable calendar access 136 | habits.Add(new SuperMSConfig.RegistryHabit( 137 | RegistryHive.CurrentUser, 138 | @"Software\Microsoft\Windows\CurrentVersion\CapabilityAccessManager\ConsentStore\calendar", 139 | "Value", 140 | "Allow", // Bad value (Allow) 141 | "Deny", // Good value (Deny) 142 | "Disable calendar access (prevents apps from accessing your calendar)", 143 | "STRING", 144 | logger)); 145 | 146 | // Disable call history access 147 | habits.Add(new SuperMSConfig.RegistryHabit( 148 | RegistryHive.CurrentUser, 149 | @"Software\Microsoft\Windows\CurrentVersion\CapabilityAccessManager\ConsentStore\callHistory", 150 | "Value", 151 | "Allow", // Bad value (Allow) 152 | "Deny", // Good value (Deny) 153 | "Disable call history access (prevents apps from accessing your call history)", 154 | "STRING", 155 | logger)); 156 | 157 | // Disable email access 158 | habits.Add(new SuperMSConfig.RegistryHabit( 159 | RegistryHive.CurrentUser, 160 | @"Software\Microsoft\Windows\CurrentVersion\CapabilityAccessManager\ConsentStore\email", 161 | "Value", 162 | "Allow", // Bad value (Allow) 163 | "Deny", // Good value (Deny) 164 | "Disable email access (prevents apps from accessing your email)", 165 | "STRING", 166 | logger)); 167 | 168 | // Disable messaging access 169 | habits.Add(new SuperMSConfig.RegistryHabit( 170 | RegistryHive.CurrentUser, 171 | @"Software\Microsoft\Windows\CurrentVersion\CapabilityAccessManager\ConsentStore\messaging", 172 | "Value", 173 | "Allow", // Bad value (Allow) 174 | "Deny", // Good value (Deny) 175 | "Disable messaging access (prevents apps from accessing your messages)", 176 | "STRING", 177 | logger)); 178 | 179 | // Disable radio access 180 | habits.Add(new SuperMSConfig.RegistryHabit( 181 | RegistryHive.CurrentUser, 182 | @"Software\Microsoft\Windows\CurrentVersion\CapabilityAccessManager\ConsentStore\radios", 183 | "Value", 184 | "Allow", // Bad value (Allow) 185 | "Deny", // Good value (Deny) 186 | "Disable radio access (prevents apps from accessing your radios)", 187 | "STRING", 188 | logger)); 189 | } 190 | } -------------------------------------------------------------------------------- /SuperMSConfig/Habits/SecurityHabits.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Win32; 2 | using SuperMSConfig; 3 | using System; 4 | 5 | public class SecurityHabits : BaseHabitCategory 6 | { 7 | private readonly Logger logger; 8 | 9 | public override string CategoryName => "Security"; 10 | 11 | public SecurityHabits(Logger logger) 12 | { 13 | this.logger = logger; 14 | 15 | // Enable Windows Defender 16 | habits.Add(new SuperMSConfig.RegistryHabit( 17 | RegistryHive.LocalMachine, 18 | @"Software\Policies\Microsoft\Windows Defender", 19 | "DisableAntiSpyware", 20 | 1, // Bad value (disabled) 21 | 0, // Good value (enabled) 22 | "Enable Windows Defender (prevents spyware and malware)", 23 | "DWORD", 24 | logger)); 25 | 26 | // Enable User Account Control (UAC) 27 | habits.Add(new SuperMSConfig.RegistryHabit( 28 | RegistryHive.LocalMachine, 29 | @"Software\Policies\Microsoft\Windows\System", 30 | "EnableLUA", 31 | 0, // Bad value (disabled) 32 | 1, // Good value (enabled) 33 | "Enable User Account Control (UAC) (prompts for administrative actions)", 34 | "DWORD", 35 | logger)); 36 | 37 | // Disable SMBv1 38 | habits.Add(new SuperMSConfig.RegistryHabit( 39 | RegistryHive.LocalMachine, 40 | @"System\CurrentControlSet\Services\LanmanServer\Parameters", 41 | "SMB1", 42 | 1, // Bad value (enabled) 43 | 0, // Good value (disabled) 44 | "Disable SMBv1 (prevents exploitation of old vulnerabilities)", 45 | "DWORD", 46 | logger)); 47 | 48 | // Enable Windows Defender Real-Time Protection 49 | habits.Add(new SuperMSConfig.RegistryHabit( 50 | RegistryHive.LocalMachine, 51 | @"Software\Policies\Microsoft\Windows Defender\Real-Time Protection", 52 | "DisableRealtimeMonitoring", 53 | 1, // Bad value (disabled) 54 | 0, // Good value (enabled) 55 | "Enable Windows Defender Real-Time Protection (scans for threats in real time)", 56 | "DWORD", 57 | logger)); 58 | 59 | // Disable Windows Script Host 60 | habits.Add(new SuperMSConfig.RegistryHabit( 61 | RegistryHive.CurrentUser, 62 | @"Software\Microsoft\Windows Script Host\Settings", 63 | "Enabled", 64 | 1, // Bad value (enabled) 65 | 0, // Good value (disabled) 66 | "Disable Windows Script Host (prevents malicious scripts)", 67 | "DWORD", 68 | logger)); 69 | 70 | // Enable Secure Boot 71 | habits.Add(new SuperMSConfig.RegistryHabit( 72 | RegistryHive.LocalMachine, 73 | @"System\CurrentControlSet\Control\SecureBoot\State", 74 | "UEFISecureBootEnabled", 75 | 0, // Bad value (disabled) 76 | 1, // Good value (enabled) 77 | "Enable Secure Boot (prevents unauthorized OS and bootloaders)", 78 | "DWORD", 79 | logger)); 80 | 81 | // Enable Firewall 82 | habits.Add(new SuperMSConfig.RegistryHabit( 83 | RegistryHive.LocalMachine, 84 | @"Software\Policies\Microsoft\WindowsFirewall\DomainProfile", 85 | "EnableFirewall", 86 | 0, // Bad value (disabled) 87 | 1, // Good value (enabled) 88 | "Enable Firewall (Protect all network connections)", 89 | "DWORD", 90 | logger)); 91 | 92 | // Disable AutoRun 93 | habits.Add(new SuperMSConfig.RegistryHabit( 94 | RegistryHive.LocalMachine, 95 | @"Software\Microsoft\Windows\CurrentVersion\Policies\Explorer", 96 | "NoDriveTypeAutoRun", 97 | 0, // Bad value (enabled) 98 | 255, // Good value (disabled) 99 | "Disable AutoRun (prevents auto-starting of malicious USB devices)", 100 | "DWORD", 101 | logger)); 102 | 103 | // Disable Guest Account 104 | habits.Add(new SuperMSConfig.RegistryHabit( 105 | RegistryHive.LocalMachine, 106 | @"Software\Microsoft\Windows NT\CurrentVersion\Winlogon", 107 | "AutoAdminLogon", 108 | 1, // Bad value (enabled) 109 | 0, // Good value (disabled) 110 | "Disable Guest Account (prevents unauthorized access)", 111 | "DWORD", 112 | logger)); 113 | } 114 | } 115 | -------------------------------------------------------------------------------- /SuperMSConfig/Habits/ServiceHabits.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | 4 | namespace SuperMSConfig 5 | { 6 | public class ServiceHabits : BaseHabitCategory 7 | { 8 | private readonly Logger logger; 9 | 10 | public override string CategoryName => "Services"; 11 | 12 | public ServiceHabits(Logger logger) 13 | { 14 | this.logger = logger; 15 | 16 | // badValue; 1 for stopped, 0 for running 17 | 18 | habits.Add(new ServiceHabit("diagnosticshub.standardcollector.service", "Microsoft (R) Diagnostics Hub Standard Collector Service: Collects diagnostic data for system health and performance.", logger, 1)); 19 | 20 | // Adobe Acrobat Updater 21 | habits.Add(new ServiceHabit("AdobeARMservice", "Adobe Acrobat Update Service: Keeps Adobe Acrobat software up to date.", logger, 1)); 22 | 23 | // Google Services (irrelevant services) 24 | habits.Add(new ServiceHabit("gupdate", "Google Update Service: Keeps Google applications such as Chrome up to date.", logger, 1)); 25 | habits.Add(new ServiceHabit("gupdatem", "Google Update Service (Machine-Wide): Keeps Google applications up to date (machine-wide).", logger, 1)); 26 | 27 | // TeamViewer 28 | habits.Add(new ServiceHabit("TeamViewer", "TeamViewer Service: Allows remote access and support connections.", logger, 1)); 29 | 30 | // Citrix Updater Service 31 | habits.Add(new ServiceHabit("CWAUpdaterService", "Citrix Workspace App Updater Service: Manages updates for Citrix Workspace.", logger, 1)); 32 | 33 | // Apple Services (on Windows) 34 | habits.Add(new ServiceHabit("AppleMobileDeviceService", "Apple Mobile Device Service: Allows iTunes to communicate with iPhones/iPads.", logger, 1)); 35 | habits.Add(new ServiceHabit("Bonjour Service", "Apple Bonjour Service: Allows automatic discovery of devices on local networks, often unnecessary.", logger, 1)); 36 | 37 | // NVIDIA Telemetry 38 | habits.Add(new ServiceHabit("NvTelemetryContainer", "NVIDIA Telemetry Service: Collects and sends telemetry data to NVIDIA.", logger, 1)); 39 | 40 | // Dropbox Update Services 41 | habits.Add(new ServiceHabit("dbupdate", "Dropbox Update Service: Keeps Dropbox application up to date.", logger, 1)); 42 | habits.Add(new ServiceHabit("dbupdatem", "Dropbox Update Service (Machine-Wide): Keeps Dropbox up to date for all users on the system.", logger, 1)); 43 | 44 | // Skype Updater 45 | habits.Add(new ServiceHabit("SkypeUpdate", "Skype Updater Service: Updates Skype automatically, often unnecessary.", logger, 1)); 46 | 47 | // Spotify Web Helper 48 | habits.Add(new ServiceHabit("SpotifyWebHelper", "Spotify Web Helper: Automatically launches Spotify from web links, often not needed.", logger, 1)); 49 | 50 | // Realtek Audio Services 51 | habits.Add(new ServiceHabit("RtkAudioService", "Realtek Audio Service: Manages audio-related tasks for Realtek hardware, usually unnecessary for basic use.", logger, 1)); 52 | 53 | // Intel Update Manager 54 | habits.Add(new ServiceHabit("IntelRapidStorage", "Intel Rapid Storage Technology: Often unnecessary unless using advanced RAID or disk management features.", logger, 1)); 55 | 56 | // Steam Client Service 57 | habits.Add(new ServiceHabit("Steam Client Service", "Steam Client Service: Allows Steam to update and manage games, not needed unless you actively use Steam.", logger, 1)); 58 | 59 | // Adobe Genuine Software Integrity Service 60 | habits.Add(new ServiceHabit("AdobeGenuineMonitorService", "Adobe Genuine Software Integrity Service: Checks for genuine Adobe software, not essential for regular use.", logger, 1)); 61 | 62 | // Windows Services 63 | habits.Add(new ServiceHabit("diagnosticshub.standardcollector.service", "Microsoft (R) Diagnostics Hub Standard Collector Service: Collects diagnostic data for system health and performance.", logger, 1)); 64 | habits.Add(new ServiceHabit("DiagTrack", "Diagnostics Tracking Service: Monitors and tracks diagnostics and performance metrics.", logger, 1)); 65 | habits.Add(new ServiceHabit("dmwappushservice", "WAP Push Message Routing Service: Handles WAP push messages, but can be safely turned off if not in use.", logger, 1)); 66 | habits.Add(new ServiceHabit("lfsvc", "Geolocation Service: Manages location data for various applications. Disable if you don’t use location-based services.", logger, 1)); 67 | habits.Add(new ServiceHabit("MapsBroker", "Downloaded Maps Manager: Manages offline maps. Disable if you don’t use offline maps.", logger, 1)); 68 | habits.Add(new ServiceHabit("NetTcpPortSharing", "Net.Tcp Port Sharing Service: Enables network communication via TCP. Turn off if you don’t use networked applications.", logger, 1)); 69 | habits.Add(new ServiceHabit("RemoteRegistry", "Remote Registry: Allows remote access to the Windows registry. Disable if remote registry access is unnecessary.", logger, 1)); 70 | habits.Add(new ServiceHabit("TrkWks", "Distributed Link Tracking Client: Maintains links to files across a network. Disable if not using networked file links.", logger, 1)); 71 | habits.Add(new ServiceHabit("WbioSrvc", "Windows Biometric Service: Supports fingerprint and facial recognition hardware. Disable if you don’t use biometric devices.", logger, 1)); 72 | habits.Add(new ServiceHabit("WMPNetworkSvc", "Windows Media Player Network Sharing Service: Shares media over the network. Disable if you don’t share media.", logger, 1)); 73 | habits.Add(new ServiceHabit("XblAuthManager", "Xbox Live Auth Manager: Manages Xbox Live authentication. Turn off if you don’t use Xbox Live services.", logger, 1)); 74 | habits.Add(new ServiceHabit("XblGameSave", "Xbox Live Game Save Service: Manages Xbox game saves. Disable if you’re not using Xbox Live game features.", logger, 1)); 75 | habits.Add(new ServiceHabit("XboxNetApiSvc", "Xbox Live Networking Service: Handles Xbox Live network connections. Turn off if Xbox Live services aren’t needed.", logger, 1)); 76 | habits.Add(new ServiceHabit("ndu", "Windows Network Data Usage Monitor: Tracks network data usage. Disable if you don’t need to monitor data usage.", logger, 1)); 77 | habits.Add(new ServiceHabit("fxssvc", "Fax Service: Manages fax operations. If you don’t use a fax machine, it’s safe to turn off this service.", logger, 1)); 78 | habits.Add(new ServiceHabit("WiaRpc", "Windows Image Acquisition (WIA): Supports image acquisition devices like scanners and cameras. Disable if these devices aren’t used.", logger, 1)); 79 | habits.Add(new ServiceHabit("SmartCard", "Smart Card: Supports smart card devices for security. Turn off if smart card functionality isn’t needed.", logger, 1)); 80 | habits.Add(new ServiceHabit("Spooler", "Print Spooler: Manages print jobs. Disable if you don’t have a printer or print jobs.", logger, 1)); 81 | habits.Add(new ServiceHabit("SysMain", "Superfetch (SysMain): Improves startup times by preloading frequently used applications. If you have an SSD, you might not need this.", logger, 1)); 82 | habits.Add(new ServiceHabit("bthserv", "Bluetooth Support Service: Manages Bluetooth connections. Turn off if you don’t use Bluetooth devices.", logger, 1)); 83 | habits.Add(new ServiceHabit("WerSvc", "Windows Error Reporting Service: Sends error reports to Microsoft. Disable if you don’t wish to share error information.", logger, 1)); 84 | habits.Add(new ServiceHabit("wisvc", "Windows Insider Service: Manages Windows Insider updates. Disable if you’re not part of the Insider Program.", logger, 1)); 85 | habits.Add(new ServiceHabit("seclogon", "Secondary Logon: Allows running applications with different credentials. Turn off if you don’t use this feature.", logger, 1)); 86 | } 87 | } 88 | } -------------------------------------------------------------------------------- /SuperMSConfig/Habits/StartupHabits.cs: -------------------------------------------------------------------------------- 1 | namespace SuperMSConfig 2 | { 3 | public class StartupHabits : BaseHabitCategory 4 | { 5 | private readonly Logger logger; 6 | 7 | public override string CategoryName => "Startup"; 8 | 9 | public StartupHabits(Logger logger) 10 | { 11 | this.logger = logger; 12 | 13 | habits.Add(new StartupHabit("Discord", "Discord: Essential for gaming and communication but can be disabled if it impacts startup performance.", logger)); 14 | habits.Add(new StartupHabit("UninstallT20", "Microsoft Teams Updater: Automatically updates Microsoft Teams; disable if it's causing startup delays.", logger)); 15 | habits.Add(new StartupHabit("Teams", "Microsoft Teams: Critical for work-related collaboration; disable if it affects startup time.", logger)); 16 | habits.Add(new StartupHabit("OneDrive", "OneDrive: Syncs files to the cloud; can be disabled if not needed or causing issues.", logger)); 17 | habits.Add(new StartupHabit("Spotify", "Spotify: Launches music streaming; can be disabled if it slows down your system at startup.", logger)); 18 | habits.Add(new StartupHabit("Skype", "Skype: Used for calls and messaging; disable if not needed to speed up your startup.", logger)); 19 | habits.Add(new StartupHabit("Acrobat", "Adobe Acrobat: Opens PDFs; can be disabled if you don't frequently use it or it slows down boot.", logger)); 20 | habits.Add(new StartupHabit("Java Update Scheduler", "Java Update Scheduler: Keeps Java updated; disable if you prefer manual updates or it's causing slowdowns.", logger)); 21 | habits.Add(new StartupHabit("CCleaner", "CCleaner: Cleans up system junk; can be disabled if it causes slow startup times.", logger)); 22 | habits.Add(new StartupHabit("NVIDIA GeForce Experience", "NVIDIA GeForce Experience: Manages graphics drivers and settings; disable if it’s impacting startup performance.", logger)); 23 | habits.Add(new StartupHabit("QuickTime", "QuickTime: Media player; can be disabled if it's not frequently used or slows down startup.", logger)); 24 | habits.Add(new StartupHabit("uTorrent", "uTorrent: BitTorrent client; can be disabled if it's causing delays or issues at startup.", logger)); 25 | habits.Add(new StartupHabit("RtHDVBg", "Realtek HD Audio Driver: Essential for high-quality sound but may be disabled if causing issues.", logger)); 26 | habits.Add(new StartupHabit("RtHDVCpl", "Realtek HD Control Panel: Manages audio settings; can be disabled if it disrupts system performance.", logger)); 27 | } 28 | } 29 | } -------------------------------------------------------------------------------- /SuperMSConfig/Habits/SystemHabits.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Win32; 2 | using SuperMSConfig; 3 | using System; 4 | 5 | public class SystemHabits : BaseHabitCategory 6 | { 7 | private readonly Logger logger; 8 | 9 | public override string CategoryName => "System"; 10 | 11 | public SystemHabits(Logger logger) 12 | { 13 | this.logger = logger; 14 | 15 | //Hasten the shutdown process 16 | habits.Add(new SuperMSConfig.RegistryHabit( 17 | RegistryHive.LocalMachine, 18 | @"SYSTEM\CurrentControlSet\Control", 19 | "WaitToKillServiceTimeout", 20 | "5000", // Bad value (disabled) 21 | "2000", // Good value (enabled) 22 | "Hasten the shutdown process", 23 | "STRING", 24 | logger)); 25 | 26 | 27 | // Modify the Taskbar alignment to left 28 | habits.Add(new SuperMSConfig.RegistryHabit( 29 | RegistryHive.CurrentUser, 30 | @"Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced", 31 | "TaskbarAl", 32 | 1, // Bad value (disabled) 33 | 0, // Good value (enabled) 34 | "Modify the Taskbar alignment to left", 35 | "DWORD", 36 | logger)); 37 | 38 | // Performance Monitoring 39 | habits.Add(new SuperMSConfig.RegistryHabit( 40 | RegistryHive.LocalMachine, 41 | @"Software\Microsoft\Windows\CurrentVersion\PerformanceMonitoring", 42 | "EnablePerformanceMonitoring", 43 | 0, // Bad value (disabled) 44 | 1, // Good value (enabled) 45 | "Enable performance monitoring", 46 | "DWORD", 47 | logger)); 48 | 49 | // Launch folders in a new process 50 | habits.Add(new SuperMSConfig.RegistryHabit( 51 | RegistryHive.LocalMachine, 52 | @"Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced", 53 | "LaunchFolderWindowsInNewProcess", 54 | 0, // Bad value (disabled) 55 | 1, // Good value (enabled) 56 | "Launch folders in a new process", 57 | "DWORD", 58 | logger)); 59 | 60 | // Enable SuperFetch 61 | habits.Add(new SuperMSConfig.RegistryHabit( 62 | RegistryHive.LocalMachine, 63 | @"Software\Policies\Microsoft\Windows\System", 64 | "EnableSuperFetch", 65 | 0, // Bad value (disabled) 66 | 1, // Good value (enabled) 67 | "Enable SuperFetch (improves performance by preloading frequently used apps)", 68 | "DWORD", 69 | logger)); 70 | 71 | // Allow access to Task Manager 72 | habits.Add(new SuperMSConfig.RegistryHabit( 73 | RegistryHive.LocalMachine, 74 | @"Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options", 75 | "DisableTaskMgr", 76 | 1, // Bad value (enabled) 77 | 0, // Good value (disabled) 78 | "Allow access to Task Manager", 79 | "DWORD", 80 | logger)); 81 | 82 | // Disable Background Apps 83 | habits.Add(new SuperMSConfig.RegistryHabit( 84 | RegistryHive.CurrentUser, 85 | @"Software\Microsoft\Windows\CurrentVersion\BackgroundAccessApplications", 86 | "GlobalUserDisabled", 87 | 0, // Bad value (disabled) 88 | 1, // Good value (enabled) 89 | "Disable background apps (improves system performance)", 90 | "DWORD", 91 | logger)); 92 | 93 | // Hide Super Hidden Files and Folders 94 | habits.Add(new SuperMSConfig.RegistryHabit( 95 | RegistryHive.CurrentUser, 96 | @"Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced", 97 | "ShowSuperHidden", 98 | 1, // Bad value (enabled) 99 | 0, // Good value (disabled) 100 | "Hide super hidden files and folders (improves Explorer performance)", 101 | "DWORD", 102 | logger)); 103 | 104 | // Windows Update 105 | habits.Add(new SuperMSConfig.RegistryHabit( 106 | RegistryHive.LocalMachine, 107 | @"Software\Policies\Microsoft\Windows\WindowsUpdate", 108 | "DisableWindowsUpdateAccess", 109 | 1, // Bad value (disabled) 110 | 0, // Good value (enabled) 111 | "Enabled Windows Updates", 112 | "DWORD", 113 | logger)); 114 | 115 | // Fast Startup 116 | habits.Add(new SuperMSConfig.RegistryHabit( 117 | RegistryHive.LocalMachine, 118 | @"SYSTEM\CurrentControlSet\Control\Session Manager\Power", 119 | "HiberbootEnabled", 120 | 0, // Bad value (disabled) 121 | 1, // Good value (enabled) 122 | "Enable Fast Startup to speed up boot times", 123 | "DWORD", 124 | logger)); 125 | 126 | // System Restore 127 | habits.Add(new SuperMSConfig.RegistryHabit( 128 | RegistryHive.LocalMachine, 129 | @"SOFTWARE\Policies\Microsoft\Windows NT\CurrentVersion\SystemRestore", 130 | "DisableSR", 131 | 1, // Bad value (System Restore disabled) 132 | 0, // Good value (System Restore enabled) 133 | "Enable System Restore for better system recovery options", 134 | "DWORD", 135 | logger)); 136 | 137 | // Remote Desktop 138 | habits.Add(new SuperMSConfig.RegistryHabit( 139 | RegistryHive.LocalMachine, 140 | @"SYSTEM\CurrentControlSet\Control\Terminal Server", 141 | "fDenyTSConnections", 142 | 1, // Bad value (Remote Desktop disabled) 143 | 0, // Good value (Remote Desktop enabled) 144 | "Enable Remote Desktop for remote access to your system", 145 | "DWORD", 146 | logger)); 147 | 148 | // File Extensions Visibility 149 | habits.Add(new SuperMSConfig.RegistryHabit( 150 | RegistryHive.CurrentUser, 151 | @"Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced", 152 | "HideFileExt", 153 | 1, // Bad value (file extensions hidden) 154 | 0, // Good value (file extensions visible) 155 | "Show file extensions for better file management", 156 | "DWORD", 157 | logger)); 158 | } 159 | } 160 | -------------------------------------------------------------------------------- /SuperMSConfig/Helpers/Logger.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Drawing; 3 | using System.Linq; 4 | using System.Threading.Tasks; 5 | using System.Windows.Forms; 6 | 7 | namespace SuperMSConfig 8 | { 9 | public class Logger 10 | { 11 | private readonly MainForm mainForm; 12 | 13 | public Logger(MainForm mainForm) 14 | { 15 | this.mainForm = mainForm?? throw new ArgumentNullException(nameof(mainForm)); 16 | } 17 | 18 | 19 | // Log method that supports additional details 20 | public void Log(string message, Color color, string details = "") 21 | { 22 | // Find the RichTextBox where logs are displayed 23 | RichTextBox logBox = mainForm.Controls.Find("rtbLog", true).FirstOrDefault() as RichTextBox; 24 | 25 | if (logBox != null) 26 | { 27 | // Ensure UI updates are made on the UI thread 28 | if (logBox.InvokeRequired) 29 | { 30 | logBox.Invoke((Action)(() => 31 | { 32 | AppendLog(logBox, message, color, details); 33 | })); 34 | } 35 | else 36 | { 37 | AppendLog(logBox, message, color, details); 38 | } 39 | } 40 | } 41 | 42 | private void AppendLog(RichTextBox logBox, string message, Color color, string details) 43 | { 44 | logBox.SelectionColor = color; 45 | logBox.AppendText($"{DateTime.Now}: {message}\n"); 46 | 47 | // If there are additional details, append them indented 48 | if (!string.IsNullOrEmpty(details)) 49 | { 50 | logBox.SelectionColor = Color.Gray; 51 | logBox.AppendText($"\tDetails: {details}\n"); 52 | } 53 | 54 | // Autoscroll to the bottom 55 | logBox.SelectionStart = logBox.Text.Length; 56 | logBox.ScrollToCaret(); 57 | } 58 | 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /SuperMSConfig/Helpers/Utils.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Security.Principal; 5 | using System.Text; 6 | using System.Threading.Tasks; 7 | 8 | namespace SuperMSConfig.Helpers 9 | { 10 | internal static class Utils 11 | { 12 | // Check if app runs as Admin 13 | public static bool IsRunningAsAdmin() 14 | { 15 | try 16 | { 17 | WindowsIdentity identity = WindowsIdentity.GetCurrent(); 18 | WindowsPrincipal principal = new WindowsPrincipal(identity); 19 | bool isAdmin = principal.IsInRole(WindowsBuiltInRole.Administrator); 20 | 21 | //logger.Log($"App is running with Admin rights: {isAdmin}", isAdmin ? Color.Green : Color.Red); 22 | 23 | if (!isAdmin) 24 | { 25 | // logger.Log("The app should be run as Administrator to ensure all features work properly.", Color.Orange); 26 | } 27 | 28 | return isAdmin; 29 | } 30 | catch (Exception ex) 31 | { 32 | // logger.Log($"Error checking admin rights: {ex.Message}", Color.Red); 33 | return false; 34 | } 35 | } 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /SuperMSConfig/PluginsForm.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace SuperMSConfig 2 | { 3 | partial class PluginsForm 4 | { 5 | /// 6 | /// Required designer variable. 7 | /// 8 | private System.ComponentModel.IContainer components = null; 9 | 10 | /// 11 | /// Clean up any resources being used. 12 | /// 13 | /// true if managed resources should be disposed; otherwise, false. 14 | protected override void Dispose(bool disposing) 15 | { 16 | if (disposing && (components != null)) 17 | { 18 | components.Dispose(); 19 | } 20 | base.Dispose(disposing); 21 | } 22 | 23 | #region Windows Form Designer generated code 24 | 25 | /// 26 | /// Required method for Designer support - do not modify 27 | /// the contents of this method with the code editor. 28 | /// 29 | private void InitializeComponent() 30 | { 31 | this.SuspendLayout(); 32 | // 33 | // PluginsForm 34 | // 35 | this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); 36 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 37 | this.ClientSize = new System.Drawing.Size(414, 507); 38 | this.Name = "PluginsForm"; 39 | this.ShowIcon = false; 40 | this.ResumeLayout(false); 41 | 42 | } 43 | 44 | #endregion 45 | } 46 | } -------------------------------------------------------------------------------- /SuperMSConfig/PluginsForm.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.ComponentModel; 4 | using System.Data; 5 | using System.Drawing; 6 | using System.Linq; 7 | using System.Text; 8 | using System.Threading.Tasks; 9 | using System.Windows.Forms; 10 | 11 | namespace SuperMSConfig 12 | { 13 | public partial class PluginsForm : Form 14 | { 15 | public PluginsForm() 16 | { 17 | InitializeComponent(); 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /SuperMSConfig/PluginsForm.resx: -------------------------------------------------------------------------------- 1 |  2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | -------------------------------------------------------------------------------- /SuperMSConfig/Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Threading.Tasks; 5 | using System.Windows.Forms; 6 | 7 | namespace SuperMSConfig 8 | { 9 | internal static class Program 10 | { 11 | /// 12 | /// Get app version 13 | /// 14 | internal static string GetCurrentVersionTostring() => new Version(Application.ProductVersion).ToString(3); 15 | 16 | /// 17 | /// The main entry point for the application. 18 | /// 19 | /// 20 | [STAThread] 21 | static void Main() 22 | { 23 | Application.EnableVisualStyles(); 24 | Application.SetCompatibleTextRenderingDefault(false); 25 | Application.Run(new MainForm()); 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /SuperMSConfig/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // Allgemeine Informationen über eine Assembly werden über die folgenden 6 | // Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern, 7 | // die einer Assembly zugeordnet sind. 8 | [assembly: AssemblyTitle("SuperMSConfig")] 9 | [assembly: AssemblyDescription("Super Microsoft Configuration")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("Builtbybel")] 12 | [assembly: AssemblyProduct("SuperMSConfig")] 13 | [assembly: AssemblyCopyright("Copyright © 2024")] 14 | [assembly: AssemblyTrademark("A Belim app creation")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Durch Festlegen von ComVisible auf FALSE werden die Typen in dieser Assembly 18 | // für COM-Komponenten unsichtbar. Wenn Sie auf einen Typ in dieser Assembly von 19 | // COM aus zugreifen müssen, sollten Sie das ComVisible-Attribut für diesen Typ auf "True" festlegen. 20 | [assembly: ComVisible(false)] 21 | 22 | // Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird 23 | [assembly: Guid("6514a6a5-6e23-4b36-ac92-df96db8901d3")] 24 | 25 | // Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten: 26 | // 27 | // Hauptversion 28 | // Nebenversion 29 | // Buildnummer 30 | // Revision 31 | // 32 | [assembly: AssemblyVersion("1.5.1")] 33 | [assembly: AssemblyFileVersion("1.5.1")] 34 | -------------------------------------------------------------------------------- /SuperMSConfig/Properties/Resources.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // Dieser Code wurde von einem Tool generiert. 4 | // Laufzeitversion:4.0.30319.42000 5 | // 6 | // Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn 7 | // der Code erneut generiert wird. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace SuperMSConfig.Properties { 12 | using System; 13 | 14 | 15 | /// 16 | /// Eine stark typisierte Ressourcenklasse zum Suchen von lokalisierten Zeichenfolgen usw. 17 | /// 18 | // Diese Klasse wurde von der StronglyTypedResourceBuilder automatisch generiert 19 | // -Klasse über ein Tool wie ResGen oder Visual Studio automatisch generiert. 20 | // Um einen Member hinzuzufügen oder zu entfernen, bearbeiten Sie die .ResX-Datei und führen dann ResGen 21 | // mit der /str-Option erneut aus, oder Sie erstellen Ihr VS-Projekt neu. 22 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] 23 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 24 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 25 | internal class Resources { 26 | 27 | private static global::System.Resources.ResourceManager resourceMan; 28 | 29 | private static global::System.Globalization.CultureInfo resourceCulture; 30 | 31 | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] 32 | internal Resources() { 33 | } 34 | 35 | /// 36 | /// Gibt die zwischengespeicherte ResourceManager-Instanz zurück, die von dieser Klasse verwendet wird. 37 | /// 38 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 39 | internal static global::System.Resources.ResourceManager ResourceManager { 40 | get { 41 | if (object.ReferenceEquals(resourceMan, null)) { 42 | global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("SuperMSConfig.Properties.Resources", typeof(Resources).Assembly); 43 | resourceMan = temp; 44 | } 45 | return resourceMan; 46 | } 47 | } 48 | 49 | /// 50 | /// Überschreibt die CurrentUICulture-Eigenschaft des aktuellen Threads für alle 51 | /// Ressourcenzuordnungen, die diese stark typisierte Ressourcenklasse verwenden. 52 | /// 53 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 54 | internal static global::System.Globalization.CultureInfo Culture { 55 | get { 56 | return resourceCulture; 57 | } 58 | set { 59 | resourceCulture = value; 60 | } 61 | } 62 | 63 | /// 64 | /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. 65 | /// 66 | internal static System.Drawing.Bitmap assetCopilot { 67 | get { 68 | object obj = ResourceManager.GetObject("assetCopilot", resourceCulture); 69 | return ((System.Drawing.Bitmap)(obj)); 70 | } 71 | } 72 | 73 | /// 74 | /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. 75 | /// 76 | internal static System.Drawing.Bitmap assetCopilotBW { 77 | get { 78 | object obj = ResourceManager.GetObject("assetCopilotBW", resourceCulture); 79 | return ((System.Drawing.Bitmap)(obj)); 80 | } 81 | } 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /SuperMSConfig/Properties/Resources.resx: -------------------------------------------------------------------------------- 1 |  2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | 121 | 122 | ..\assetCopilot.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a 123 | 124 | 125 | ..\assetCopilotBW.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a 126 | 127 | -------------------------------------------------------------------------------- /SuperMSConfig/Properties/Settings.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // Dieser Code wurde von einem Tool generiert. 4 | // Laufzeitversion:4.0.30319.42000 5 | // 6 | // Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn 7 | // der Code erneut generiert wird. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace SuperMSConfig.Properties { 12 | 13 | 14 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 15 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.11.0.0")] 16 | internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { 17 | 18 | private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); 19 | 20 | public static Settings Default { 21 | get { 22 | return defaultInstance; 23 | } 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /SuperMSConfig/Properties/Settings.settings: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /SuperMSConfig/SuperMSConfig.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Debug 6 | AnyCPU 7 | {6514A6A5-6E23-4B36-AC92-DF96DB8901D3} 8 | WinExe 9 | SuperMSConfig 10 | SuperMSConfig 11 | v4.8 12 | 512 13 | true 14 | true 15 | 16 | 17 | x64 18 | true 19 | full 20 | false 21 | bin\Debug\ 22 | DEBUG;TRACE 23 | prompt 24 | 4 25 | 26 | 27 | AnyCPU 28 | pdbonly 29 | true 30 | bin\Release\ 31 | TRACE 32 | prompt 33 | 4 34 | 35 | 36 | app.manifest 37 | 38 | 39 | AppIcon.ico 40 | 41 | 42 | 43 | ..\packages\Newtonsoft.Json.13.0.3\lib\net45\Newtonsoft.Json.dll 44 | 45 | 46 | 47 | 48 | False 49 | ..\..\..\..\..\..\Windows\Microsoft.NET\assembly\GAC_MSIL\System.Management.Automation\v4.0_3.0.0.0__31bf3856ad364e35\System.Management.Automation.dll 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | Form 64 | 65 | 66 | AboutForm.cs 67 | 68 | 69 | 70 | 71 | 72 | UserControl 73 | 74 | 75 | GetStartedPage.cs 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | Form 93 | 94 | 95 | PluginsForm.cs 96 | 97 | 98 | Form 99 | 100 | 101 | MainForm.cs 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | True 110 | True 111 | Resources.resx 112 | 113 | 114 | 115 | 116 | 117 | AboutForm.cs 118 | Designer 119 | 120 | 121 | GetStartedPage.cs 122 | 123 | 124 | PluginsForm.cs 125 | 126 | 127 | MainForm.cs 128 | 129 | 130 | ResXFileCodeGenerator 131 | Designer 132 | Resources.Designer.cs 133 | 134 | 135 | 136 | 137 | SettingsSingleFileGenerator 138 | Settings.Designer.cs 139 | 140 | 141 | True 142 | Settings.settings 143 | True 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | {11724eb0-bd43-41d3-a4c3-7002f9163b7f} 157 | PluginInterface 158 | 159 | 160 | 161 | -------------------------------------------------------------------------------- /SuperMSConfig/Templates/HabitFactory.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Win32; 2 | using SuperMSConfig; 3 | using System; 4 | using System.Collections.Generic; 5 | using System.Linq; 6 | using System.Text; 7 | using System.Threading.Tasks; 8 | using Templates; 9 | 10 | namespace Templates 11 | { 12 | public class HabitFactory 13 | { 14 | public BaseHabit CreateHabit(HabitTemplate template, Logger logger) 15 | { 16 | switch (template.Type) 17 | { 18 | case "RegistryHabit": 19 | var hive = (RegistryHive)Enum.Parse(typeof(RegistryHive), template.Hive); 20 | var valueType = template.ValueType ?? "DWORD"; // Default to "Dword" if not specified 21 | return new RegistryHabit( 22 | hive, 23 | template.Key, 24 | template.ValueName, 25 | template.BadValue, 26 | template.GoodValue, 27 | template.Description, 28 | valueType, 29 | logger); 30 | 31 | case "StartupHabit": 32 | return new StartupHabit(template.AppName, template.Description, logger); 33 | case "ServiceHabit": 34 | // Convert BadValue to int, assuming it's always numeric 35 | return new ServiceHabit(template.ServiceName, template.Description, logger, Convert.ToInt32(template.BadValue)); 36 | 37 | case "AppsHabit": 38 | return new AppsHabit(template.AppName, template.Description, logger); 39 | 40 | default: 41 | throw new ArgumentException($"Unknown habit type: {template.Type}"); 42 | } 43 | } 44 | } 45 | } -------------------------------------------------------------------------------- /SuperMSConfig/Templates/HabitTemplate.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | 7 | namespace Templates 8 | { 9 | public class HabitTemplate 10 | { 11 | public string Type { get; set; } 12 | public string Hive { get; set; } 13 | public string Key { get; set; } 14 | public string ValueName { get; set; } 15 | public object GoodValue { get; set; } 16 | public object BadValue { get; set; } 17 | public string AppName { get; set; } 18 | public string ServiceName { get; set; } 19 | public string Description { get; set; } 20 | public string ValueType { get; set; } 21 | } 22 | 23 | } -------------------------------------------------------------------------------- /SuperMSConfig/Templates/TemplateLoader.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using System.IO; 3 | using Newtonsoft.Json; 4 | using Templates; 5 | 6 | public class TemplateLoader 7 | { 8 | // Deserializes the template JSON file into a list of HabitTemplate objects 9 | public TemplateFile LoadTemplateFile(string filePath) 10 | { 11 | try 12 | { 13 | var json = File.ReadAllText(filePath); 14 | 15 | // Deserialize the full template file (with Header and Entries) 16 | var templateFile = JsonConvert.DeserializeObject(json); 17 | 18 | if (templateFile == null) 19 | { 20 | throw new InvalidDataException("Deserialized JSON data is null."); 21 | } 22 | 23 | return templateFile; 24 | } 25 | catch (JsonException ex) 26 | { 27 | throw new InvalidDataException("Error parsing JSON data. " + ex.Message, ex); 28 | } 29 | catch (IOException ex) 30 | { 31 | throw new IOException("Error reading JSON file. " + ex.Message, ex); 32 | } 33 | } 34 | } 35 | 36 | public class TemplateFile 37 | { 38 | public string Header { get; set; } 39 | public List Entries { get; set; } 40 | } -------------------------------------------------------------------------------- /SuperMSConfig/app.manifest: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 54 | 55 | 56 | 57 | true 58 | true 59 | 60 | 61 | 62 | 63 | 64 | 78 | 79 | 80 | -------------------------------------------------------------------------------- /SuperMSConfig/assetCopilot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/builtbybel/SuperMSConfig/262fd6129fb414318bc89ad662ed49e579d28c5f/SuperMSConfig/assetCopilot.png -------------------------------------------------------------------------------- /SuperMSConfig/assetCopilotBW.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/builtbybel/SuperMSConfig/262fd6129fb414318bc89ad662ed49e579d28c5f/SuperMSConfig/assetCopilotBW.png -------------------------------------------------------------------------------- /SuperMSConfig/packages.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | --------------------------------------------------------------------------------