diff --git a/.bin/Scripts/functions/common.py b/.bin/Scripts/functions/common.py index 47505fe3..66a5f727 100644 --- a/.bin/Scripts/functions/common.py +++ b/.bin/Scripts/functions/common.py @@ -64,12 +64,24 @@ class NotInstalledError(Exception): class NoProfilesError(Exception): pass +class OSInstalledLegacyError(Exception): + pass + class PathNotFoundError(Exception): pass class UnsupportedOSError(Exception): pass +class SecureBootDisabledError(Exception): + pass + +class SecureBootNotAvailError(Exception): + pass + +class SecureBootUnknownError(Exception): + pass + # General functions def abort(): """Abort script.""" @@ -271,7 +283,7 @@ def human_readable_size(size, decimals=0): units = 'Kb' else: units = ' b' - + # Return return '{size:>{width}.{decimals}f} {units}'.format( size=size, width=width, decimals=decimals, units=units) @@ -462,7 +474,7 @@ def run_program(cmd, args=[], check=True, pipe=True, shell=False): def set_title(title='~Some Title~'): """Set title. - + Used for window title and menu titles.""" global_vars['Title'] = title os.system('title {}'.format(title)) @@ -566,7 +578,7 @@ def try_and_print(message='Trying...', def upload_crash_details(): """Upload log and runtime data to the CRASH_SERVER. - + Intended for uploading to a public Nextcloud share.""" if not ENABLED_UPLOAD_DATA: raise GenericError @@ -648,7 +660,7 @@ def init_global_vars(): def check_os(): """Set OS specific variables.""" tmp = {} - + # Query registry path = r'SOFTWARE\Microsoft\Windows NT\CurrentVersion' with winreg.OpenKey(HKLM, path) as key: @@ -697,7 +709,7 @@ def check_os(): tmp['DisplayName'] = '{} x{}'.format(tmp['Name'], tmp['Arch']) if tmp['Notes']: tmp['DisplayName'] += ' ({})'.format(tmp['Notes']) - + global_vars['OS'] = tmp def check_tools(): @@ -714,7 +726,7 @@ def check_tools(): def clean_env_vars(): """Remove conflicting global_vars and env variables. - + This fixes an issue where both global_vars and global_vars['Env'] are expanded at the same time.""" for key in global_vars.keys(): @@ -768,7 +780,7 @@ def set_common_vars(): def set_linux_vars(): """Set common variables in a Linux environment. - + These assume we're running under a WK-Linux build.""" result = run_program(['mktemp', '-d']) global_vars['TmpDir'] = result.stdout.decode().strip() diff --git a/.bin/Scripts/functions/diags.py b/.bin/Scripts/functions/diags.py index 220eaff3..47991680 100644 --- a/.bin/Scripts/functions/diags.py +++ b/.bin/Scripts/functions/diags.py @@ -1,5 +1,7 @@ # Wizard Kit: Functions - Diagnostics +import ctypes + from functions.common import * # STATIC VARIABLES @@ -30,12 +32,59 @@ def check_connection(): result = try_and_print(message='Ping test...', function=ping, cs='OK') if result['CS']: break + if not ask('ERROR: System appears offline, try again?'): + if ask('Continue anyway?'): + break + else: + abort() + +def check_secure_boot_status(): + """Checks UEFI Secure Boot status via PowerShell.""" + boot_mode = get_boot_mode() + cmd = ['PowerShell', '-Command', 'Confirm-SecureBootUEFI'] + result = run_program(cmd, check=False) + + # Check results + if result.returncode == 0: + out = result.stdout.decode() + if 'True' in out: + # It's on, do nothing + return + elif 'False' in out: + raise SecureBootDisabledError else: - if not ask('ERROR: System appears offline, try again?'): - if ask('Continue anyway?'): - break - else: - abort() + raise SecureBootUnknownError + else: + if boot_mode != 'UEFI': + raise OSInstalledLegacyError + else: + # Check error message + err = result.stderr.decode() + if 'Cmdlet not supported' in err: + raise SecureBootNotAvailError + else: + raise GenericError + +def get_boot_mode(): + """Check if Windows is booted in UEFI or Legacy mode, returns str.""" + kernel = ctypes.windll.kernel32 + firmware_type = ctypes.c_uint() + + # Get value from kernel32 API + try: + kernel.GetFirmwareType(ctypes.byref(firmware_type)) + except: + # Just set to zero + firmware_type = ctypes.c_uint(0) + + # Set return value + type_str = 'Unknown' + if firmware_type.value == 1: + type_str = 'Legacy' + elif firmware_type.value == 2: + type_str = 'UEFI' + + return type_str def run_autoruns(): """Run AutoRuns in the background with VirusTotal checks enabled.""" @@ -61,11 +110,22 @@ def run_hwinfo_sensors(): f.write('SummaryOnly=0\n') popen_program(global_vars['Tools']['HWiNFO']) +def run_nircmd(*cmd): + """Run custom NirCmd.""" + extract_item('NirCmd', silent=True) + cmd = [global_vars['Tools']['NirCmd'], *cmd] + run_program(cmd, check=False) + def run_xmplay(): """Run XMPlay to test audio.""" extract_item('XMPlay', silent=True) cmd = [global_vars['Tools']['XMPlay'], r'{BinDir}\XMPlay\music.7z'.format(**global_vars)] + + # Unmute audio first + run_nircmd(['mutesysvolume', '0']) + + # Open XMPlay popen_program(cmd) def run_hitmanpro(): diff --git a/.bin/Scripts/functions/update.py b/.bin/Scripts/functions/update.py index 237df6d5..58f92cde 100644 --- a/.bin/Scripts/functions/update.py +++ b/.bin/Scripts/functions/update.py @@ -435,6 +435,29 @@ def update_hwinfo(): # Cleanup remove_from_temp('HWiNFO.zip') +def update_nircmd(): + # Stop running processes + for exe in ['nircmdc.exe', 'nircmdc64.exe']: + kill_process(exe) + + # Remove existing folders + remove_from_kit('NirCmd') + + # Download + download_to_temp('nircmd32.zip', SOURCE_URLS['NirCmd32']) + download_to_temp('nircmd64.zip', SOURCE_URLS['NirCmd64']) + + # Extract files + extract_temp_to_cbin('nircmd64.zip', 'NirCmd', sz_args=['nircmdc.exe']) + shutil.move( + r'{}\NirCmd\nircmdc.exe'.format(global_vars['CBinDir']), + r'{}\NirCmd\nircmdc64.exe'.format(global_vars['CBinDir'])) + extract_temp_to_cbin('nircmd32.zip', 'NirCmd', sz_args=['nircmdc.exe']) + + # Cleanup + remove_from_temp('nircmd32.zip') + remove_from_temp('nircmd64.zip') + def update_produkey(): # Stop running processes for exe in ['ProduKey.exe', 'ProduKey64.exe']: @@ -590,7 +613,7 @@ def update_office(): include_path = r'{}\_include\_Office'.format(global_vars['CBinDir']) if os.path.exists(include_path): shutil.copytree(include_path, dest) - + for year in ['2016']: # Download and extract name = 'odt{}.exe'.format(year) @@ -605,7 +628,7 @@ def update_office(): shutil.move( r'{}\{}'.format(global_vars['TmpDir'], year), r'{}\_Office\{}'.format(global_vars['CBinDir'], year)) - + # Cleanup remove_from_temp('odt{}.exe'.format(year)) diff --git a/.bin/Scripts/settings/sources.py b/.bin/Scripts/settings/sources.py index cb43b979..c102a384 100644 --- a/.bin/Scripts/settings/sources.py +++ b/.bin/Scripts/settings/sources.py @@ -24,6 +24,8 @@ SOURCE_URLS = { 'Intel SSD Toolbox': r'https://downloadmirror.intel.com/27656/eng/Intel%20SSD%20Toolbox%20-%20v3.5.2.exe', 'IOBit_Uninstaller': 'https://portableapps.duckduckgo.com/IObitUninstallerPortable_7.5.0.7.paf.exe', 'KVRT': 'http://devbuilds.kaspersky-labs.com/devbuilds/KVRT/latest/full/KVRT.exe', + 'NirCmd32': 'https://www.nirsoft.net/utils/nircmd.zip', + 'NirCmd64': 'https://www.nirsoft.net/utils/nircmd-x64.zip', 'NotepadPlusPlus': 'https://notepad-plus-plus.org/repository/7.x/7.5.8/npp.7.5.8.bin.minimalist.7z', 'Office Deployment Tool 2016': 'https://download.microsoft.com/download/2/7/A/27AF1BE6-DD20-4CB4-B154-EBAB8A7D4A7E/officedeploymenttool_10810.33603.exe', 'ProduKey32': 'http://www.nirsoft.net/utils/produkey.zip', @@ -195,7 +197,6 @@ RST_SOURCES = { 'SetupRST_16.5.exe': 'https://downloadmirror.intel.com/27984/eng/SetupRST.exe', } - if __name__ == '__main__': print("This file is not meant to be called directly.") diff --git a/.bin/Scripts/settings/tools.py b/.bin/Scripts/settings/tools.py index bb2cda60..b470603c 100644 --- a/.bin/Scripts/settings/tools.py +++ b/.bin/Scripts/settings/tools.py @@ -30,6 +30,9 @@ TOOLS = { '64': r'HWiNFO\HWiNFO64.exe'}, 'KVRT': { '32': r'KVRT\KVRT.exe'}, + 'NirCmd': { + '32': r'NirCmd\nircmdc.exe', + '64': r'NirCmd\nircmdc64.exe'}, 'NotepadPlusPlus': { '32': r'NotepadPlusPlus\notepadplusplus.exe'}, 'ProduKey': { diff --git a/.bin/Scripts/system_checklist.py b/.bin/Scripts/system_checklist.py index 6fdbcf79..a70d3e3d 100644 --- a/.bin/Scripts/system_checklist.py +++ b/.bin/Scripts/system_checklist.py @@ -25,11 +25,17 @@ if __name__ == '__main__': ticket_number = get_ticket_number() other_results = { 'Error': { - 'CalledProcessError': 'Unknown Error', - 'BIOSKeyNotFoundError': 'BIOS key not found', - 'FileNotFoundError': 'File not found', + 'BIOSKeyNotFoundError': 'BIOS key not found', + 'CalledProcessError': 'Unknown Error', + 'FileNotFoundError': 'File not found', + 'GenericError': 'Unknown Error', + 'SecureBootDisabledError': 'Disabled', }, - 'Warning': {}} + 'Warning': { + 'OSInstalledLegacyError': 'OS installed Legacy', + 'SecureBootNotAvailError': 'Not available', + 'SecureBootUnknownError': 'Unknown', + }} if ENABLED_TICKET_NUMBERS: print_info('Starting System Checklist for Ticket #{}\n'.format( ticket_number)) @@ -82,6 +88,8 @@ if __name__ == '__main__': try_and_print(message='BIOS Activation:', function=activate_with_bios, other_results=other_results) + try_and_print(message='Secure Boot Status:', + function=check_secure_boot_status, other_results=other_results) try_and_print(message='Installed RAM:', function=show_installed_ram, ns='Unknown', silent_function=False) show_free_space() diff --git a/.bin/Scripts/update_kit.py b/.bin/Scripts/update_kit.py index 373bcb4f..6e187671 100644 --- a/.bin/Scripts/update_kit.py +++ b/.bin/Scripts/update_kit.py @@ -18,23 +18,23 @@ if __name__ == '__main__': 'Error': { 'CalledProcessError': 'Unknown Error', }} - + ## Prep ## update_sdio = ask('Update SDI Origin?') - + ## Download ## print_success('Downloading tools') - + # Data Recovery print_info(' Data Recovery') try_and_print(message='TestDisk / PhotoRec...', function=update_testdisk, other_results=other_results, width=40) - + # Data Transfers print_info(' Data Transfers') try_and_print(message='FastCopy...', function=update_fastcopy, other_results=other_results, width=40) try_and_print(message='wimlib...', function=update_wimlib, other_results=other_results, width=40) try_and_print(message='XYplorer...', function=update_xyplorer, other_results=other_results, width=40) - + # Diagnostics print_info(' Diagnostics') try_and_print(message='AIDA64...', function=update_aida64, other_results=other_results, width=40) @@ -44,8 +44,9 @@ if __name__ == '__main__': try_and_print(message='ERUNT...', function=update_erunt, other_results=other_results, width=40) try_and_print(message='HitmanPro...', function=update_hitmanpro, other_results=other_results, width=40) try_and_print(message='HWiNFO...', function=update_hwinfo, other_results=other_results, width=40) + try_and_print(message='NirCmd...', function=update_nircmd, other_results=other_results, width=40) try_and_print(message='ProduKey...', function=update_produkey, other_results=other_results, width=40) - + # Drivers print_info(' Drivers') try_and_print(message='Intel RST...', function=update_intel_rst, other_results=other_results, width=40) @@ -53,14 +54,14 @@ if __name__ == '__main__': try_and_print(message='Samsing Magician...', function=update_samsung_magician, other_results=other_results, width=40) if update_sdio: try_and_print(message='Snappy Driver Installer Origin...', function=update_sdi_origin, other_results=other_results, width=40) - + # Installers print_info(' Installers') try_and_print(message='Adobe Reader DC...', function=update_adobe_reader_dc, other_results=other_results, width=40) try_and_print(message='MS Office...', function=update_office, other_results=other_results, width=40) try_and_print(message='Visual C++ Runtimes...', function=update_vcredists, other_results=other_results, width=40) update_all_ninite(other_results=other_results, width=40) - + # Misc print_info(' Misc') try_and_print(message='Caffeine...', function=update_caffeine, other_results=other_results, width=40) @@ -72,7 +73,7 @@ if __name__ == '__main__': try_and_print(message='Notepad++...', function=update_notepadplusplus, other_results=other_results, width=40) try_and_print(message='WizTree...', function=update_wiztree, other_results=other_results, width=40) try_and_print(message='XMPlay...', function=update_xmplay, other_results=other_results, width=40) - + # Repairs print_info(' Repairs') try_and_print(message='AdwCleaner...', function=update_adwcleaner, other_results=other_results, width=40) @@ -84,11 +85,11 @@ if __name__ == '__main__': # Uninstallers print_info(' Uninstallers') try_and_print(message='IObit Uninstaller...', function=update_iobit_uninstaller, other_results=other_results, width=40) - + ## Review ## print_standard('Please review the results and download/extract any missing items to .cbin') pause('Press Enter to compress the .cbin items') - + ## Compress ## print_success('Compressing tools') print_info(' _Drivers') @@ -109,12 +110,12 @@ if __name__ == '__main__': other_results = other_results, width=40, item = item) - + ## Search for network Office/QuickBooks installers & add to LAUNCHERS print_success('Scanning for network installers') scan_for_net_installers(OFFICE_SERVER, 'Office', min_year=2010) scan_for_net_installers(QUICKBOOKS_SERVER, 'QuickBooks', min_year=2015) - + ## Generate Launchers print_success('Generating launchers') for section in sorted(LAUNCHERS.keys()): @@ -123,7 +124,7 @@ if __name__ == '__main__': try_and_print(message=name, function=generate_launcher, section=section, name=name, options=options, other_results=other_results, width=40) - + # Rename "Copy WizardKit.cmd" (if necessary) source = r'{}\Scripts\Copy WizardKit.cmd'.format(global_vars['BinDir']) dest = r'{}\Copy {}.cmd'.format(global_vars['BaseDir'], KIT_NAME_FULL) @@ -133,7 +134,7 @@ if __name__ == '__main__': except Exception: print_error(' Failed to rename "{}.cmd" to "{}.cmd"'.format( 'Copy WizardKit', KIT_NAME_FULL)) - + # Done print_standard('\nDone.') pause("Press Enter to exit...")