using Privatezilla.ITreeNode; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Diagnostics; using System.Drawing; using System.IO; using System.Linq; using System.Management.Automation; using System.Net; using System.Runtime.CompilerServices; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace Privatezilla { public partial class MainWindow : Form { private readonly string _successApply = "Applied"; private readonly string _failedApply = "Not applied"; private readonly string _successConfigure = "Configured"; private readonly string _failedConfigure = "Not configured"; private readonly string _finishApply = "Applying complete."; private readonly string _finishUndo = "Reverting complete."; private readonly string _finishAnalyze = "Analysis complete."; private readonly string _doWait = "Please wait ..."; private readonly string _undoSettings = "Do you really want to revert all selected settings to Windows 10 default state?"; private readonly string _helpApp = "Info about a setting:\nMove the cursor over a setting to view a brief explanation." + "\r\n\nAnalyze (Button):\nDetermines which settings are enabled and configured on your system or not. NO system changes are done yet!" + "\r\n\nApply selected (Button):\nThis will enable all selected settings." + "\r\n\nRevert selected (Button):\nThis will restore the default Windows 10 settings." + "\r\n\nConfigured (State):\nThis indicates your privacy is protected." + "\r\n\nNot Configured (State):\nThis indicates that the Windows 10 settings are in place."; // Script strings (optional) private readonly string _psSelect = "Please select a script."; private readonly string _psInfo = "What does this template/script do?\r\n\n"; private readonly string _psSuccess = "has been successfully executed."; private readonly string _psSave = "Please switch to code view."; // Setting progress private int _progress = 0; private int _progressIncrement = 0; // Update private readonly string _releaseURL = "https://raw.githubusercontent.com/builtbybel/privatezilla/master/latest.txt"; private readonly string _releaseUpToDate = "There are currently no updates available."; private readonly string _releaseUnofficial = "You are using an unoffical version of Privatezilla."; public Version CurrentVersion = new Version(Application.ProductVersion); public Version LatestVersion; public MainWindow() { InitializeComponent(); // Initilize settings InitializeGPO(); // Check if community package is installed CommunityPackageAvailable(); // GUI options LblMainMenu.Text = "\ue700"; // Hamburger menu } public void InitializeGPO() { TvwSettings.Nodes.Clear(); // Root node TreeNode root = new TreeNode("Windows 10 (" + WindowsHelper.GetOS() + ")") { Checked = false }; // Settings > Privacy TreeNode privacy = new TreeNode("Privacy", new TreeNode[] { new SettingNode(new Setting.Privacy.DisableTelemetry()), new SettingNode(new Setting.Privacy.DisableCompTelemetry()), new SettingNode(new Setting.Privacy.DisableAds()), new SettingNode(new Setting.Privacy.DisableWiFi()), new SettingNode(new Setting.Privacy.DiagnosticData()), new SettingNode(new Setting.Privacy.HandwritingData()), new SettingNode(new Setting.Privacy.DisableBiometrics()), new SettingNode(new Setting.Privacy.DisableTimeline()), new SettingNode(new Setting.Privacy.DisableLocation()), new SettingNode(new Setting.Privacy.DisableFeedback()), new SettingNode(new Setting.Privacy.DisableTips()), new SettingNode(new Setting.Privacy.DisableTipsLockScreen()), new SettingNode(new Setting.Privacy.InstalledApps()), new SettingNode(new Setting.Privacy.SuggestedApps()), new SettingNode(new Setting.Privacy.SuggestedContent()), new SettingNode(new Setting.Privacy.DisableCEIP()), new SettingNode(new Setting.Privacy.DisableHEIP()), new SettingNode(new Setting.Privacy.DisableMSExperiments()), new SettingNode(new Setting.Privacy.InventoryCollector()), new SettingNode(new Setting.Privacy.GetMoreOutOfWindows()), }) { //Checked = true, //ToolTipText = "Privacy settings" }; // Policies > Cortana TreeNode cortana = new TreeNode("Cortana", new TreeNode[] { new SettingNode(new Setting.Cortana.DisableCortana()), new SettingNode(new Setting.Cortana.DisableBing()), new SettingNode(new Setting.Cortana.UninstallCortana()), }); // Settings > Bloatware TreeNode bloatware = new TreeNode("Bloatware", new TreeNode[] { new SettingNode(new Setting.Bloatware.RemoveUWPAll()), new SettingNode(new Setting.Bloatware.RemoveUWPDefaults()), }) { ToolTipText = "Debloat Windows 10" }; // Settings > App permissions TreeNode apps = new TreeNode("App permissions", new TreeNode[] { new SettingNode(new Setting.Apps.AppNotifications()), new SettingNode(new Setting.Apps.Camera()), new SettingNode(new Setting.Apps.Microphone()), new SettingNode(new Setting.Apps.Call()), new SettingNode(new Setting.Apps.Notifications()), new SettingNode(new Setting.Apps.AccountInfo()), new SettingNode(new Setting.Apps.Contacts()), new SettingNode(new Setting.Apps.Calendar()), new SettingNode(new Setting.Apps.CallHistory()), new SettingNode(new Setting.Apps.Email()), new SettingNode(new Setting.Apps.Tasks()), new SettingNode(new Setting.Apps.Messaging()), new SettingNode(new Setting.Apps.Motion()), new SettingNode(new Setting.Apps.OtherDevices()), new SettingNode(new Setting.Apps.BackgroundApps()), new SettingNode(new Setting.Apps.TrackingApps()), new SettingNode(new Setting.Apps.DiagnosticInformation()), new SettingNode(new Setting.Apps.Documents()), new SettingNode(new Setting.Apps.Pictures()), new SettingNode(new Setting.Apps.Videos()), new SettingNode(new Setting.Apps.Radios()), new SettingNode(new Setting.Apps.FileSystem()), new SettingNode(new Setting.Apps.EyeGaze()), new SettingNode(new Setting.Apps.CellularData()), }); // Settings > Updates TreeNode updates = new TreeNode("Updates", new TreeNode[] { new SettingNode(new Setting.Updates.DisableUpdates()), new SettingNode(new Setting.Updates.DisableUpdatesSharing()), new SettingNode(new Setting.Updates.BlockMajorUpdates()), }); // Settings > Gaming TreeNode gaming = new TreeNode("Gaming", new TreeNode[] { new SettingNode(new Setting.Gaming.DisableGameBar()), }); // Settings > Windows Defender TreeNode defender = new TreeNode("Windows Defender", new TreeNode[] { new SettingNode(new Setting.Defender.DisableSmartScreenStore()), }); // Settings > Microsoft Edge TreeNode edge = new TreeNode("Microsoft Edge", new TreeNode[] { new SettingNode(new Setting.Edge.DisableAutoFillCredits()), new SettingNode(new Setting.Edge.EdgeBackground()), new SettingNode(new Setting.Edge.DisableSync()), new SettingNode(new Setting.Edge.BlockEdgeRollout()), }); // Settings > Security TreeNode security = new TreeNode("Security", new TreeNode[] { new SettingNode(new Setting.Security.DisablePassword()), new SettingNode(new Setting.Security.WindowsDRM()), }); // Add root nodes root.Nodes.AddRange(new TreeNode[] { privacy, cortana, bloatware, apps, updates, gaming, defender, edge, security, }); TvwSettings.Nodes.Add(root); TvwSettings.ExpandAll(); // Preselect nodes CheckNodes(privacy); // Set up ToolTip text for TvwSettings ToolTip tooltip = new ToolTip(); tooltip.AutoPopDelay = 15000; tooltip.IsBalloon = true; tooltip.SetToolTip(this.TvwSettings, "Settings"); } private List CollectSettingNodes() { List selectedSettings = new List(); foreach (TreeNode treeNode in TvwSettings.Nodes.All()) { if (treeNode.Checked && treeNode.GetType() == typeof(SettingNode)) { selectedSettings.Add((SettingNode)treeNode); } } _progressIncrement = (int)Math.Floor(100.0f / selectedSettings.Count); return selectedSettings; } private void Reset() { _progress = 0; _progressIncrement = 0; PBar.Visible = true; PBar.Value = 0; LvwStatus.HeaderStyle = ColumnHeaderStyle.Clickable; // Add Header to ListView LvwStatus.Items.Clear(); LvwStatus.Refresh(); } private void IncrementProgress() { _progress += _progressIncrement; PBar.Value = _progress; } private void DoProgress(int value) { _progress = value; PBar.Value = _progress; } // Check favored parent node including all child nodes public void CheckNodes(TreeNode startNode) { startNode.Checked = true; foreach (TreeNode node in startNode.Nodes) CheckNodes(node); } /// /// Auto check child nodes when parent node is checked /// private void TvwSetting_AfterCheck(object sender, TreeViewEventArgs e) { TvwSettings.BeginUpdate(); foreach (TreeNode child in e.Node.Nodes) { child.Checked = e.Node.Checked; } TvwSettings.EndUpdate(); } /// /// Method to auto. resize column and set the width to the width of the last item in ListView /// private void ResizeListViewColumns(ListView lv) { foreach (ColumnHeader column in lv.Columns) { column.Width = -2; } } /// /// Check system for configured settings /// private async void BtnSettingsAnalyze_Click(object sender, EventArgs e) { Reset(); LblStatus.Text = _doWait; BtnSettingsAnalyze.Enabled = false; LvwStatus.BeginUpdate(); List selectedSettings = CollectSettingNodes(); foreach (SettingNode node in selectedSettings) { var setting = node.Setting; ListViewItem state = new ListViewItem(node.Parent.Text + ": " + setting.ID()); ConfiguredTaskAwaitable analyzeTask = Task.Factory.StartNew(() => setting.CheckSetting()).ConfigureAwait(true); bool shouldPerform = await analyzeTask; if (shouldPerform) { state.SubItems.Add(_failedConfigure); state.BackColor = Color.LavenderBlush; } else { state.SubItems.Add(_successConfigure); state.BackColor = Color.Honeydew; } state.Tag = setting; LvwStatus.Items.Add(state); IncrementProgress(); } DoProgress(100); // Summary LblStatus.Text = _finishAnalyze; BtnSettingsAnalyze.Enabled = true; LvwStatus.EndUpdate(); ResizeListViewColumns(LvwStatus); } /// /// Apply selected settings /// /// private async void ApplySettings(List treeNodes) { BtnSettingsDo.Enabled = false; LvwStatus.BeginUpdate(); foreach (SettingNode node in treeNodes) { // Add status info LblStatus.Text = _doWait + " (" + node.Text + ")"; var setting = node.Setting; ConfiguredTaskAwaitable performTask = Task.Factory.StartNew(() => setting.DoSetting()).ConfigureAwait(true); var result = await performTask; var listItem = new ListViewItem(setting.ID()); if (result) { listItem.SubItems.Add(_successApply); listItem.BackColor = Color.Honeydew; } else { listItem.SubItems.Add(_failedApply); listItem.BackColor = Color.LavenderBlush; } LvwStatus.Items.Add(listItem); IncrementProgress(); } DoProgress(100); LblStatus.Text = _finishApply; BtnSettingsDo.Enabled = true; LvwStatus.EndUpdate(); ResizeListViewColumns(LvwStatus); } /// /// Revert selected settings /// private async void UndoSettings(List treeNodes) { LblStatus.Text = _doWait; BtnSettingsUndo.Enabled = false; LvwStatus.BeginUpdate(); foreach (SettingNode node in treeNodes) { var setting = node.Setting; ConfiguredTaskAwaitable performTask = Task.Factory.StartNew(() => setting.UndoSetting()).ConfigureAwait(true); var result = await performTask; var listItem = new ListViewItem(setting.ID()); if (result) { listItem.SubItems.Add(_successApply); listItem.BackColor = Color.Honeydew; } else { listItem.SubItems.Add(_failedApply); listItem.BackColor = Color.LavenderBlush; } LvwStatus.Items.Add(listItem); IncrementProgress(); } DoProgress(100); LblStatus.Text = _finishUndo; BtnSettingsUndo.Enabled = true; LvwStatus.EndUpdate(); ResizeListViewColumns(LvwStatus); } private void BtnSettingsDo_Click(object sender, EventArgs e) { Reset(); List performNodes = CollectSettingNodes(); ApplySettings(performNodes); } private void BtnSettingsUndo_Click(object sender, EventArgs e) { if (MessageBox.Show(_undoSettings, this.Text, MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button2) == DialogResult.Yes) { Reset(); List performNodes = CollectSettingNodes(); UndoSettings(performNodes); } } private void Info_Click(object sender, EventArgs e) { MessageBox.Show("Privatezilla" + "\nVersion " + Program.GetCurrentVersionTostring() + " (Phoenix)" + "\n\nThe open source Windows 10 privacy settings app.\n\nThis is in no way related to Microsoft and a completely independent project.\r\n\n" + "All infos and credits about this project on\n" + "\tgithub.com/builtbybel/privatezilla\r\n\n" + "You can also follow me on\n" + "\ttwitter.com/builtbybel\r\n\n" + "(C#) 2020, Builtbybel", "Info", MessageBoxButtons.OK, MessageBoxIcon.Information); } private void LblMainMenu_Click(object sender, EventArgs e) { this.MainMenu.Show(Cursor.Position.X, Cursor.Position.Y); } private void CheckRelease_Click(object sender, EventArgs e) { try { WebRequest hreq = WebRequest.Create(_releaseURL); hreq.Timeout = 10000; hreq.Headers.Set("Cache-Control", "no-cache, no-store, must-revalidate"); WebResponse hres = hreq.GetResponse(); StreamReader sr = new StreamReader(hres.GetResponseStream()); LatestVersion = new Version(sr.ReadToEnd().Trim()); // Done and dispose! sr.Dispose(); hres.Dispose(); } catch (Exception ex) { MessageBox.Show(ex.Message, this.Text, MessageBoxButtons.OK, MessageBoxIcon.Error); // Update check failed! } var equals = LatestVersion.CompareTo(CurrentVersion); if (equals == 0) { MessageBox.Show(_releaseUpToDate, this.Text, MessageBoxButtons.OK, MessageBoxIcon.Information); // Up-to-date } else if (equals < 0) { MessageBox.Show(_releaseUnofficial, this.Text, MessageBoxButtons.OK, MessageBoxIcon.Warning); // Unofficial } else // New release available! { if (MessageBox.Show("There is a new version available #" + LatestVersion + "\nYour are using version #" + CurrentVersion + "\n\nDo you want to open the @github/releases page?", this.Text, MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) // New release available! { Process.Start("https://github.com/builtbybel/privatezilla/releases/tag/" + LatestVersion); } } } private void Help_Click(object sender, EventArgs e) { MessageBox.Show(_helpApp, Help.Text, MessageBoxButtons.OK, MessageBoxIcon.Question); } /// /// Populate Setting files to Navigation > settings > LstPopulatePS /// private void PopulatePS() { // Switch to More PnlPS.Visible = true; LstPS.Visible = true; PnlSettings.Visible = false; TvwSettings.Visible = false; // Clear list LstPS.Items.Clear(); DirectoryInfo dirs = new DirectoryInfo(@"scripts"); FileInfo[] listSettings = dirs.GetFiles("*.ps1"); foreach (FileInfo fi in listSettings) { LstPS.Items.Add(Path.GetFileNameWithoutExtension(fi.Name)); LstPS.Enabled = true; } } private void LblPS_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { // Show Info about feature try { StreamReader OpenFile = new StreamReader(@"scripts\" + "readme.txt"); MessageBox.Show(OpenFile.ReadToEnd(), "Info about this feature", MessageBoxButtons.OK); OpenFile.Close(); } catch { } // Refresh PopulatePS(); } private void LblSettings_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { // Switch to Setting PnlSettings.Visible = true; TvwSettings.Visible = true; PnlPS.Visible = false; LstPS.Visible = false; } private void LstPS_SelectedIndexChanged(object sender, EventArgs e) { string psdir = @"scripts\" + LstPS.Text + ".ps1"; //Read PS content line by line try { using (StreamReader sr = new StreamReader(@"scripts\" + LstPS.Text + ".ps1", Encoding.Default)) { StringBuilder content = new StringBuilder(); // writes line by line to the StringBuilder until the end of the file is reached while (!sr.EndOfStream) content.AppendLine(sr.ReadLine()); // View Code TxtConsolePS.Text = content.ToString(); // View Info TxtPSInfo.Text = _psInfo + string.Join(Environment.NewLine, System.IO.File.ReadAllLines(psdir).Where(s => s.StartsWith("###")).Select(s => s.Substring(3).Replace("###", "\r\n\n"))); } } catch { } } /// /// Run custom PowerShell scripts /// private void BtnDoPS_Click(object sender, EventArgs e) { if (LstPS.CheckedItems.Count == 0) { MessageBox.Show(_psSelect, BtnDoPS.Text, MessageBoxButtons.OK, MessageBoxIcon.Information); } for (int i = 0; i < LstPS.Items.Count; i++) { if (LstPS.GetItemChecked(i)) { LstPS.SelectedIndex = i; BtnDoPS.Text = "Processing"; PnlPS.Enabled = false; //TxtOutputPS.Clear(); using (PowerShell powerShell = PowerShell.Create()) { powerShell.AddScript(TxtConsolePS.Text); powerShell.AddCommand("Out-String"); Collection PSOutput = powerShell.Invoke(); StringBuilder stringBuilder = new StringBuilder(); foreach (PSObject pSObject in PSOutput) stringBuilder.AppendLine(pSObject.ToString()); TxtOutputPS.Text = stringBuilder.ToString(); BtnDoPS.Text = "Apply"; PnlPS.Enabled = true; } // Done! MessageBox.Show("Script " + "\"" + LstPS.Text + "\" " + _psSuccess, this.Text, MessageBoxButtons.OK, MessageBoxIcon.Information); } } } /// /// Open PowerShell code view /// private void ChkCodePS_CheckedChanged(object sender, EventArgs e) { if (ChkCodePS.Checked == true) { ChkCodePS.Text = "Back"; TxtConsolePS.Visible = true; TxtOutputPS.Visible = false; } else { ChkCodePS.Text = "View code"; TxtOutputPS.Visible = true; TxtConsolePS.Visible = false; } } /// /// Import PowerShell script files /// private void PSImport_Click(object sender, EventArgs e) { OpenFileDialog ofd = new OpenFileDialog(); ofd.Filter = "*.txt|*.txt|*.ps1|*.ps1"; ofd.DefaultExt = ".ps1"; ofd.RestoreDirectory = true; ofd.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop); ofd.FilterIndex = 2; string strDestPath = Application.StartupPath + @"\scripts"; ofd.Multiselect = true; if (ofd.ShowDialog() == DialogResult.OK) { foreach (string fileName in ofd.FileNames) { try { File.Copy(fileName, strDestPath + @"\" + Path.GetFileName(fileName)); } catch (Exception ex) { MessageBox.Show(ex.Message, this.Text); } } } // Refresh PopulatePS(); } /// /// Save opened PowerShell script files as new preset script files /// /// /// private void PSSaveAs_Click(object sender, EventArgs e) { if (ChkCodePS.Checked == false) { MessageBox.Show(_psSave, this.Text, MessageBoxButtons.OK, MessageBoxIcon.Information); } else { SaveFileDialog dlg = new SaveFileDialog(); dlg.Filter = "*.txt|*.txt|*.ps1|*.ps1"; dlg.DefaultExt = ".ps1"; dlg.RestoreDirectory = true; dlg.InitialDirectory = Application.StartupPath + @"\scripts"; dlg.FilterIndex = 2; try { if (dlg.ShowDialog() == DialogResult.OK) { File.WriteAllText(dlg.FileName, TxtConsolePS.Text, Encoding.UTF8); //Refresh PopulatePS(); } } catch (Exception ex) { MessageBox.Show(ex.Message); } } } private void PSMarketplace_Click(object sender, EventArgs e) { Process.Start("http://www.builtbybel.com/marketplace"); } private void CommunityPkg_Click(object sender, EventArgs e) { Process.Start("https://github.com/builtbybel/privatezilla#community-package"); } // Check if community package installed private void CommunityPackageAvailable() { string path = @"scripts"; if (Directory.Exists(path)) { LblPS.Visible = true; CommunityPkg.Visible = false; } } private bool sortAscending = false; private void LvwStatus_ColumnClick(object sender, ColumnClickEventArgs e) { if (!sortAscending) { sortAscending = true; } else { sortAscending = false; } this.LvwStatus.ListViewItemSorter = new ListViewItemComparer(e.Column, sortAscending); } private void BtnMenuPS_Click(object sender, EventArgs e) { this.PSMenu.Show(Cursor.Position.X, Cursor.Position.Y); } private void PicOpenGitHubPage_Click(object sender, EventArgs e) { Process.Start("https://github.com/builtbybel/privatezilla"); } } }