## MAJOR refactoring done ##
* All .cmd Command scripts
* Brandind / Settings variables now set via .bin/Scripts/settings/main.py
* Window titles now set using KIT_FULL_NAME
* All .py Python scripts
* All ClientDir paths should now use KIT_SHORT_NAME
* Long lines wrapped to better follow PEP8
* String formatting now more consistant
* Updated run_program() and popen_program() calls to use lists
* (e.g. cmd = ['', '', '']; run_program(cmd))
** Should improve clarity IMO
* Update window titles AFTER init_global_vars() so KIT_FULL_NAME can be used
* Branding / Settings
* Support tech now configurable
* (e.g. "Please let {tech} know and they'll look into it")
* Timezone now configurable
* Upload info can now be disabled/enabled in .bin/Scripts/settings/main.py
* CHKDSK
* Combined read-only and fix scripts and added menu
* DISM
* Combined ScanHealth and RestoreHealth scripts and added menu
* functions/common.py
* BREAKING: run_program() and popen_program() no longer accept 'args' variable
* Misc
* Removed Win7 NVMe launcher
* Never used and Win7 is deprecated
* Removed "DeviceRemover" and "Display Driver Uninstaller" launchers
* Both cut too deep and were not useful
* Removed Nirsoft utilities and Sysinternals Suite launchers
* Too many tools unused.
* Added .url links to the websites in case the tools are needed
* Replaced WinDirStat with TreeSizeFree
* Replaced Q-Dir launcher with XYplorer launcher
* Q-Dir was running into issues on Windows 10
* Removed C.IntRep, ESET, and MBAM launchers from "OSR & VR"
* Removed JRT
* Deprecated and discontinued by MBAM
* Removed unsupported QuickBooks launchers (2014 and older)
* Removed unsupported Office launchers (2010 and 2013\365)
* Removed "Revo Uninstaller" launcher
* Removed infrequently used tools from "Diagnostics"
* Auslogics DiskDefrag
* BatteryInfoView
* BIOSCodes
* GpuTest
* HeavyLoad
* Bugfixes
* major_exception() try-blocks should catch CTL+c again
* Allows for manual script bailing
71 lines
2.4 KiB
Python
71 lines
2.4 KiB
Python
# Wizard Kit: Functions - Activation
|
|
|
|
import subprocess
|
|
|
|
from borrowed import acpi
|
|
from os import environ
|
|
|
|
# Variables
|
|
SLMGR = r'{}\System32\slmgr.vbs'.format(environ.get('SYSTEMROOT'))
|
|
|
|
# Error Classes
|
|
class BIOSKeyNotFoundError(Exception):
|
|
pass
|
|
|
|
def activate_windows_with_bios():
|
|
"""Attempt to activate Windows with a key stored in the BIOS."""
|
|
# Code borrowed from https://github.com/aeruder/get_win8key
|
|
#####################################################
|
|
#script to query windows 8.x OEM key from PC firmware
|
|
#ACPI -> table MSDM -> raw content -> byte offset 56 to end
|
|
#ck, 03-Jan-2014 (christian@korneck.de)
|
|
#####################################################
|
|
bios_key = None
|
|
table = b"MSDM"
|
|
if acpi.FindAcpiTable(table) is True:
|
|
rawtable = acpi.GetAcpiTable(table)
|
|
#http://msdn.microsoft.com/library/windows/hardware/hh673514
|
|
#byte offset 36 from beginning \
|
|
# = Microsoft 'software licensing data structure' \
|
|
# / 36 + 20 bytes offset from beginning = Win Key
|
|
bios_key = rawtable[56:len(rawtable)].decode("utf-8")
|
|
else:
|
|
raise Exception('ACPI table {} not found.'.format(str(table)))
|
|
if bios_key is None:
|
|
raise BIOSKeyNotFoundError
|
|
|
|
# Install Key
|
|
cmd = ['cscript', '//nologo', SLMGR, '/ipk', bios_key]
|
|
subprocess.run(cmd, check=False)
|
|
sleep(5)
|
|
|
|
# Attempt activation
|
|
cmd = ['cscript', '//nologo', SLMGR, '/ato']
|
|
subprocess.run(cmd, check=False)
|
|
sleep(5)
|
|
|
|
# Check status
|
|
if not windows_is_activated():
|
|
raise Exception('Activation Failed')
|
|
|
|
def get_activation_string():
|
|
"""Get activation status, returns str."""
|
|
act_str = subprocess.run(
|
|
['cscript', '//nologo', SLMGR, '/xpr'], check=False,
|
|
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
|
act_str = act_str.stdout.decode()
|
|
act_str = act_str.splitlines()
|
|
act_str = act_str[1].strip()
|
|
return act_str
|
|
|
|
def windows_is_activated():
|
|
"""Check if Windows is activated via slmgr.vbs and return bool."""
|
|
activation_string = subprocess.run(
|
|
['cscript', '//nologo', SLMGR, '/xpr'], check=False,
|
|
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
|
activation_string = activation_string.stdout.decode()
|
|
|
|
return bool(activation_string and 'permanent' in activation_string)
|
|
|
|
if __name__ == '__main__':
|
|
print("This file is not meant to be called directly.")
|