1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
|
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
/// <summary>
/// Represents the default windows activation manager.
/// </summary>
/// <seealso cref="Tango.PPC.Common.OS.IOperationSystemManager" />
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
/// <summary>
/// Determines whether the OS is activated.
/// </summary>
/// <returns></returns>
public Task<bool> IsActivated()
{
return Task.Factory.StartNew<bool>(() =>
{
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;
}
});
}
/// <summary>
/// Activates the OS using the specified activation key.
/// </summary>
/// <param name="activationKey">The activation key.</param>
/// <returns></returns>
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...");
}
}
/// <summary>
/// Deactivates the OS license.
/// </summary>
/// <returns></returns>
/// <exception cref="System.NotImplementedException"></exception>
public Task Deactivate()
{
throw new NotImplementedException("Deactivating windows license is not supported.");
}
/// <summary>
/// Gets the available time zones.
/// </summary>
/// <returns></returns>
public ReadOnlyCollection<TimeZoneInfo> GetAvailableTimeZones()
{
return TimeZoneInfo.GetSystemTimeZones();
}
/// <summary>
/// Changes the operation system time zone.
/// </summary>
/// <param name="timeZone">The time zone.</param>
/// <returns></returns>
public async Task ChangeTimeZone(TimeZoneInfo timeZone)
{
CmdCommand cmd = new CmdCommand("tzutil", $"/s \"{timeZone.Id}\"");
await cmd.Run();
}
/// <summary>
/// Restarts the system.
/// </summary>
/// <returns></returns>
public void Restart()
{
Process.Start("shutdown.exe", "-r -t 0");
}
}
}
|