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"
});
}
}
}