Add activation and Secure Boot sections

This commit is contained in:
2Shirt 2021-09-29 00:59:06 -06:00
parent 423cd343fb
commit 337b6d95e1
Signed by: 2Shirt
GPG key ID: 152FAC923B0E132C
3 changed files with 132 additions and 25 deletions

View file

@ -138,8 +138,8 @@ BASE_MENUS = {
),
'System Summary': (
MenuEntry('Operating System', 'auto_show_os_name'),
MenuEntry('Windows Activation', no_op),
MenuEntry('Secure Boot', no_op),
MenuEntry('Windows Activation', 'auto_show_activation'),
MenuEntry('Secure Boot', 'auto_show_secure_boot_status'),
MenuEntry('Installed RAM', no_op),
MenuEntry('Storage Volumes', no_op),
MenuEntry('Virus Protection', no_op),

View file

@ -1,6 +1,7 @@
"""WizardKit: Windows Functions"""
# vim: sts=2 sw=2 ts=2
import ctypes
import logging
import os
import pathlib
@ -16,6 +17,7 @@ except ImportError as err:
raise err
from wk.borrowed import acpi
from wk.cfg.main import KIT_NAME_FULL
from wk.cfg.windows_builds import (
OLDEST_SUPPORTED_BUILD,
OUTDATED_BUILD_NUMBERS,
@ -126,9 +128,40 @@ def is_activated():
return act_str and 'permanent' in act_str
# System Info Functions
def show_os_name(check=True):
"""Build OS display name and print it to screen.
# Date / Time functions
def get_timezone():
"""Get current timezone using tzutil, returns str."""
cmd = ['tzutil', '/g']
proc = run_program(cmd, check=False)
return proc.stdout
def set_timezone(zone):
"""Set current timezone using tzutil."""
cmd = ['tzutil', '/s', zone]
run_program(cmd, check=False)
# Info Functions
def get_os_activation(as_list=False, check=True):
"""Get OS activation status, returns str.
NOTE: If check=True then raise an exception if OS isn't activated.
"""
act_str = get_activation_string()
if check and not is_activated():
if 'unavailable' in act_str.lower():
raise GenericWarning(act_str)
# Else
raise GenericError(act_str)
# Done
return [act_str] if as_list else act_str
def get_os_name(as_list=False, check=True):
"""Build OS display name, returns str.
NOTE: If check=True then an exception is raised if the OS version is
outdated or unsupported.
@ -150,7 +183,14 @@ def show_os_name(check=True):
raise GenericError(f'{display_name} (unsupported)')
# Done
print(display_name)
return [display_name] if as_list else display_name
def show_alert_box(message, title=None):
"""Show Windows alert box with message."""
title = title if title else f'{KIT_NAME_FULL} Warning'
message_box = ctypes.windll.user32.MessageBoxW
message_box(None, message, title, 0x00001030)
# Registry Functions
@ -381,6 +421,72 @@ def enable_safemode_msi():
run_program(cmd)
# Secure Boot Functions
def is_booted_uefi():
"""Check if booted UEFI or legacy, returns bool."""
kernel = ctypes.windll.kernel32
firmware_type = ctypes.c_uint()
# Get value from kernel32 API (firmware_type is updated by the call)
try:
kernel.GetFirmwareType(ctypes.byref(firmware_type))
except Exception: # pylint: disable=broad-except
# Ignore and set firmware_type back to zero
firmware_type = ctypes.c_uint(0)
# Check result
return firmware_type.value == 2
def is_secure_boot_enabled(raise_exceptions=False, show_alert=False):
"""Check if Secure Boot is enabled, returns bool.
If raise_exceptions is True then an exception is raised with details.
If show_alert is True a popup alert box is shown if it's not enabled.
"""
booted_uefi = is_booted_uefi()
cmd = ['PowerShell', '-Command', 'Confirm-SecureBootUEFI']
enabled = False
msg_error = None
msg_warning = None
# Bail early
if OS_VERSION < 8:
if raise_exceptions:
raise GenericWarning(f'Secure Boot not available for {OS_VERSION}')
return False
# Check results
proc = run_program(cmd, check=False)
if proc.returncode:
# Something went wrong
if booted_uefi:
msg_warning = 'UNKNOWN'
else:
msg_warning = 'DISABLED\n\nOS installed LEGACY'
else:
# Command completed
enabled = 'True' in proc.stdout
if 'False' in proc.stdout:
msg_error = 'ERROR'
else:
msg_warning = 'UNKNOWN'
# Show popup and/or raise exceptions as necessary
for msg, exc in ((msg_error, GenericError), (msg_warning, GenericWarning)):
if not msg:
continue
msg = f'Secure Boot {msg}'
if show_alert:
show_alert_box(msg)
if raise_exceptions:
raise exc(msg)
break
# Done
return enabled
# Service Functions
def disable_service(service_name):
"""Set service startup to disabled."""
@ -451,19 +557,5 @@ def stop_service(service_name):
raise GenericError(f'Failed to stop service {service_name}')
# Date / Time functions
def get_timezone():
"""Get current timezone using tzutil, returns str."""
cmd = ['tzutil', '/g']
proc = run_program(cmd, check=False)
return proc.stdout
def set_timezone(zone):
"""Set current timezone using tzutil."""
cmd = ['tzutil', '/s', zone]
run_program(cmd, check=False)
if __name__ == '__main__':
print("This file is not meant to be called directly.")

View file

@ -44,10 +44,12 @@ if platform.system() == 'Windows':
from wk.os.win import (
OS_VERSION,
activate_with_bios,
get_os_activation,
get_os_name,
is_secure_boot_enabled,
reg_read_value,
reg_set_value,
reg_write_settings,
show_os_name,
)
from wk.repairs.win import (
backup_all_browser_profiles,
@ -66,10 +68,12 @@ else:
"""No-op function."""
# wk.os.win
activate_with_bios = no_op
get_os_activation = no_op
get_os_name = no_op
is_secure_boot_enabled = no_op
reg_read_value = no_op
reg_set_value = no_op
reg_write_settings = no_op
show_os_name = no_op
# wk.repairs.win
backup_all_browser_profiles = no_op
backup_registry = no_op
@ -559,9 +563,22 @@ def auto_restore_default_uac():
TRY_PRINT.run('User Account Control...', restore_default_uac)
def auto_show_os_activation():
"""Display OS Name."""
TRY_PRINT.run('Activation...', get_os_activation, as_list=True)
def auto_show_os_name():
"""Display OS Name."""
TRY_PRINT.run('Operating System...', show_os_name)
TRY_PRINT.run('Operating System...', get_os_name, as_list=True)
def auto_show_secure_boot_status():
"""Display Secure Boot status."""
TRY_PRINT.run(
'Secure Boot...', is_secure_boot_enabled,
raise_exceptions=True, show_alert=True,
)
def auto_windows_temp_fix():
@ -569,8 +586,6 @@ def auto_windows_temp_fix():
TRY_PRINT.run(r'Windows\Temp fix...', fix_windows_temp)
# Configure Functions
def config_explorer():
"""Configure Windows Explorer and restart the process."""