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(); } /// /// Restarts the system. /// /// public void Restart() { Process.Start("shutdown.exe", "-r -t 0"); } } }