using System;
using System.Collections.Generic;
using System.Linq;
using System.Management;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace Tango.PPC.Common.OS
{
using System.Collections.ObjectModel;
using System.Diagnostics;
using Tango.Core;
using Tango.Core.Components;
using SLID = Guid; //SLID id declaration as typedef GUID SLID; in slpublic.h
///
/// Represents the default windows activation manager.
///
///
public class DefaultOperationSystemManager : ExtendedObject, IOperationSystemManager
{
#region Win32
private enum SL_GENUINE_STATE
{
SL_GEN_STATE_IS_GENUINE = 0,
SL_GEN_STATE_INVALID_LICENSE = 1,
SL_GEN_STATE_TAMPERED = 2,
SL_GEN_STATE_OFFLINE = 3,
SL_GEN_STATE_LAST = 4
}
[DllImportAttribute("Slwga.dll", EntryPoint = "SLIsGenuineLocal", CharSet = CharSet.None, ExactSpelling = false, SetLastError = false, PreserveSig = true, CallingConvention = CallingConvention.Winapi, BestFitMapping = false, ThrowOnUnmappableChar = false)]
[PreserveSigAttribute()]
private static extern uint SLIsGenuineLocal(ref SLID slid, [In, Out] ref SL_GENUINE_STATE genuineState, IntPtr val3);
#endregion
///
/// Determines whether the OS is activated.
///
///
public Task IsActivated()
{
return Task.Factory.StartNew(() =>
{
LogManager.Log("Validating windows activation...");
Guid ApplicationID = new Guid("55c92734-d682-4d71-983e-d6ec3f16059f"); //Application ID GUID http://technet.microsoft.com/en-us/library/dd772270.aspx
SLID windowsSlid = (Guid)ApplicationID;
try
{
SL_GENUINE_STATE genuineState = SL_GENUINE_STATE.SL_GEN_STATE_LAST;
uint ResultInt = SLIsGenuineLocal(ref windowsSlid, ref genuineState, IntPtr.Zero);
if (ResultInt == 0)
{
LogManager.Log("OS activation status: " + genuineState.ToString());
return (genuineState == SL_GENUINE_STATE.SL_GEN_STATE_IS_GENUINE);
}
else
{
throw LogManager.Log(new InvalidOperationException("An error occurred while trying to get the OS activation status."));
}
}
catch (Exception ex)
{
throw ex;
}
});
}
///
/// Activates the OS using the specified activation key.
///
/// The activation key.
///
public async Task Activate(string activationKey)
{
if (!(await IsActivated()))
{
CmdCommand command = new CmdCommand("cscript", $"C:\\Windows\\System32\\slmgr.vbs -ipk {activationKey}");
await command.Run();
bool activated = false;
for (int i = 0; i < 10; i++)
{
await Task.Delay(2000);
activated = await IsActivated();
if (activated) break;
}
if (!activated)
{
throw new ApplicationException("The activation was completed but activation status returned a false response.");
}
}
else
{
LogManager.Log("Windows is already activated. Skipping activation...");
}
}
///
/// Deactivates the OS license.
///
///
///
public Task Deactivate()
{
throw new NotImplementedException("Deactivating windows license is not supported.");
}
///
/// Gets the available time zones.
///
///
public ReadOnlyCollection GetAvailableTimeZones()
{
return TimeZoneInfo.GetSystemTimeZones();
}
///
/// Changes the operation system time zone.
///
/// The time zone.
///
public async Task ChangeTimeZone(TimeZoneInfo timeZone)
{
CmdCommand cmd = new CmdCommand("tzutil", $"/s \"{timeZone.Id}\"");
await cmd.Run();
try
{
cmd = new CmdCommand("sc.exe", "config W32Time start=auto");
cmd.Timeout = TimeSpan.FromSeconds(10);
await cmd.Run();
cmd = new CmdCommand("net", "start W32Time");
cmd.Timeout = TimeSpan.FromSeconds(10);
await cmd.Run();
cmd = new CmdCommand("w32tm", $"/resync");
await cmd.Run();
}
catch { }
}
///
/// Restarts the system.
///
///
public void Restart()
{
Process.Start("shutdown.exe", "-r -t 0");
}
}
}