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(); try { cmd = new CmdCommand("net", "start W32Time"); cmd.Timeout = TimeSpan.FromSeconds(10); await cmd.Run(); } catch { } cmd = new CmdCommand("w32tm", $"/resync"); await cmd.Run(); } catch { } } /// /// Restarts the system. /// /// public void Restart() { Process.Start("shutdown.exe", "-r -t 0"); } /// /// Shutdown the system. /// public void Shutdown() { Process.Start("shutdown.exe", "-s -t 0"); } /// /// Gets the machine unique identifier. /// /// public Task GetDeviceId() { return Task.Factory.StartNew(() => { try { ManagementObjectCollection mbsList = null; ManagementObjectSearcher mbs = new ManagementObjectSearcher("Select * From Win32_processor"); mbsList = mbs.Get(); string id = ""; foreach (ManagementObject mo in mbsList) { id = mo["ProcessorID"].ToString(); } string max_address = ""; using (ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration")) { using (ManagementObjectCollection moc = mc.GetInstances()) { if (moc != null) { foreach (ManagementObject mo in moc) { if (string.IsNullOrEmpty(max_address)) // only return MAC Address from first card { if (mo["MacAddress"] != null) { max_address = mo["MacAddress"].ToString(); } } mo.Dispose(); } } } } return id + "_" + max_address; } catch (Exception ex) { LogManager.Log(ex, "Could not extract device id. Falling back to device name..."); return GetDeviceName().Result; } }); } /// /// Gets the machine host name. /// /// public Task GetDeviceName() { return Task.Factory.StartNew(() => { return Environment.MachineName; }); } /// /// Sets the device host name. /// /// public async Task SetDeviceName(String name) { var command = new CmdCommand("wmic", $"computersystem where caption='{Environment.MachineName}' rename '{name}'"); await command.Run(); } /// /// Opens the operating system shell (explorer). /// public void OpenShell() { Process.Start(new ProcessStartInfo() { FileName = @"C:\Windows\Sysnative\cmd.exe", Arguments = @"/c start /B explorer.exe" }); } } }