forked from Snoooopy/MetroUnlocker
174 lines
6.6 KiB
C#
174 lines
6.6 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.ComponentModel;
|
|
using System.Data;
|
|
using System.Drawing;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Windows.Forms;
|
|
|
|
using System.Diagnostics;
|
|
using Microsoft.Win32;
|
|
|
|
using MetroUnlocker.ProductPolicy;
|
|
|
|
namespace MetroUnlocker
|
|
{
|
|
public partial class App : Form
|
|
{
|
|
public const string AppxKey = "HKEY_LOCAL_MACHINE\\SOFTWARE\\Policies\\Microsoft\\Windows\\Appx";
|
|
|
|
string trustedAppsPolicyName = "AllowAllTrustedApps";
|
|
string developmentPolicyName = "AllowDevelopmentWithoutDevLicense";
|
|
string specialProfilesPolicyName = "AllowDeploymentInSpecialProfiles";
|
|
|
|
public bool LOBEnabled
|
|
{
|
|
get { return GetGroupPolicy(trustedAppsPolicyName); }
|
|
set { SetGroupPolicy(trustedAppsPolicyName, value); }
|
|
}
|
|
|
|
public bool DevelopmentEnabled
|
|
{
|
|
get { return GetGroupPolicy(developmentPolicyName); }
|
|
set { SetGroupPolicy(developmentPolicyName, value); }
|
|
}
|
|
|
|
public bool SpecialProfilesEnabled
|
|
{
|
|
get { return GetGroupPolicy(specialProfilesPolicyName); }
|
|
set { SetGroupPolicy(specialProfilesPolicyName, value); }
|
|
}
|
|
|
|
public void SetGroupPolicy(string policyName, bool enabled)
|
|
{
|
|
Registry.SetValue(AppxKey, policyName, enabled ? 1 : 0, RegistryValueKind.DWord);
|
|
}
|
|
|
|
public bool GetGroupPolicy(string policyName)
|
|
{
|
|
object value = Registry.GetValue(AppxKey, policyName, 0);
|
|
return value is int ? (int)value == 1 : false;
|
|
}
|
|
|
|
public App()
|
|
{
|
|
InitializeComponent();
|
|
|
|
UpdatePolicyState();
|
|
}
|
|
|
|
public void UpdatePolicyState()
|
|
{
|
|
var productPolicyEditor = new ProductPolicyEditor();
|
|
|
|
var policyState = productPolicyEditor.GetPolicyStateByName("WSLicensingService-LOBSideloadingActivated");
|
|
var isSideloadingKeyInstalled = LOBManager.IsSideloadingKeyInstalled();
|
|
|
|
switch (policyState)
|
|
{
|
|
case PolicyState.Disabled:
|
|
statusLabel.Text = "Disabled";
|
|
statusLabel.ForeColor = Color.DarkRed;
|
|
break;
|
|
case PolicyState.Enabled:
|
|
if (isSideloadingKeyInstalled)
|
|
{
|
|
statusLabel.Text = "Sideloading enabled";
|
|
statusLabel.ForeColor = Color.DarkGreen;
|
|
}
|
|
else
|
|
{
|
|
statusLabel.Text = "Sideloading will be disabled soon";
|
|
statusLabel.ForeColor = Color.DarkOrange;
|
|
}
|
|
break;
|
|
case PolicyState.Unknown:
|
|
statusLabel.Text = "Unknown";
|
|
statusLabel.ForeColor = Color.Black;
|
|
break;
|
|
}
|
|
}
|
|
|
|
private string CombineArguments(params string[] arguments)
|
|
{
|
|
return string.Join(" ", arguments);
|
|
}
|
|
|
|
private void SetSetupParameter(string key, object value, RegistryValueKind valueKind)
|
|
{
|
|
Registry.SetValue("HKEY_LOCAL_MACHINE\\SYSTEM\\Setup", key, value, valueKind);
|
|
}
|
|
|
|
private void SetSetupType(int type)
|
|
{
|
|
SetSetupParameter("SetupType", type, RegistryValueKind.DWord);
|
|
}
|
|
|
|
private void button1_Click(object sender, EventArgs e)
|
|
{
|
|
StartupArgument startupArgument;
|
|
|
|
if (LOBCheckBox.Checked && SPPCheckBox.Checked)
|
|
startupArgument = StartupArgument.EnableLOBAndEnableSPP;
|
|
else if (LOBCheckBox.Checked)
|
|
startupArgument = StartupArgument.EnableLOBAndDisableSPP;
|
|
else if (SPPCheckBox.Checked)
|
|
startupArgument = StartupArgument.DisableLOBAndEnableSPP;
|
|
else
|
|
startupArgument = StartupArgument.DisableLOBAndDisableSPP;
|
|
|
|
string commandLine = CombineArguments(new string[] { Application.ExecutablePath, StartupArguments.GetStartupArgumentString(startupArgument) });
|
|
|
|
SetSetupParameter("CmdLine", commandLine, RegistryValueKind.String);
|
|
SetSetupType(1);
|
|
DialogResult result = MessageBox.Show("Sideloading will be enabled after a reboot. Would you like to reboot now?", "Reboot?", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);
|
|
|
|
switch (result)
|
|
{
|
|
case DialogResult.Yes:
|
|
Rebooter.Reboot();
|
|
break;
|
|
case DialogResult.Cancel:
|
|
SetSetupType(0);
|
|
break;
|
|
}
|
|
}
|
|
|
|
private void JailbreakButton_Click(object sender, EventArgs e)
|
|
{
|
|
try
|
|
{
|
|
Guid productKey;
|
|
if (LOBManager.IsSideloadingKeyInstalled(out productKey))
|
|
if (MessageBox.Show(this, "There is already a sideloading key installed. If you continue, the current key will be deleted and a new one will be generated.", "Already activated", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning) == DialogResult.Cancel)
|
|
return;
|
|
|
|
LOBManager.ActivateZeroCID();
|
|
MessageBox.Show(this, "Sideloading activated!", "Success!", MessageBoxButtons.OK, MessageBoxIcon.Information);
|
|
UpdatePolicyState();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
MessageBox.Show(this, ex.Message, "Error while activating sideloading!", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
|
}
|
|
}
|
|
|
|
private void Uninstall(object sender, EventArgs e)
|
|
{
|
|
Guid productKey;
|
|
if (LOBManager.IsSideloadingKeyInstalled(out productKey))
|
|
{
|
|
if (MessageBox.Show(this, "Are you sure you want to disable sideloading?", "Really?", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
|
|
{
|
|
if (LOBManager.UninstallSideloadingKey(productKey))
|
|
MessageBox.Show(this, "The sideloading key was uninstalled successfully.", "Success", MessageBoxButtons.OK, MessageBoxIcon.Information);
|
|
else MessageBox.Show(this, "Could not uninstall the sideloading key.", "Failed", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
|
UpdatePolicyState();
|
|
}
|
|
}
|
|
else MessageBox.Show(this, "There is no sideloading key installed.", "I got nothing to do...", MessageBoxButtons.OK, MessageBoxIcon.Information);
|
|
}
|
|
}
|
|
}
|