diff options
author | Alejandro Sirgo Rica <asirgo@soleta.eu> | 2024-07-25 16:34:35 +0200 |
---|---|---|
committer | Alejandro Sirgo Rica <asirgo@soleta.eu> | 2024-07-29 15:07:22 +0200 |
commit | adbf02d170701d418ea47b73b442183bb2131099 (patch) | |
tree | 34f1ccaf167472325501a5a9c110eff59df6d1f6 | |
parent | 567fea276e16902be01f80cfb7be335f8d414622 (diff) |
utils: add set_windows_hostname
Add function to redefine the hostname of a Windows install.
Windows hostnames can't be larger than 15 characters due to
legacy heritage.
Hostname modification is done by modifying 3 registry values in
the ControlSetXXX entry of the SYSTEM hive. ControlSet001 is
generally the entry to be edited but one must query the value
of the 'Current' key in the 'Select' entry of the SYSTEM hive
to retrieve the active ControlSet.
The hostname has to be introduced in the following entries:
path = 'ControlSetXX/Control/ComputerName/ComputerName'
key = 'ComputerName'
path = 'ControlSetXXX/Services/Tcpip/Parameters'
key = 'HostName'
key = 'NV Hostname'
The value to store in those keys is of tipe SZ and has to be
encoded in UCS-2 Little Endian (utf-16-le).
-rw-r--r-- | src/utils/postinstall.py | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/src/utils/postinstall.py b/src/utils/postinstall.py index f6332b0..7fef437 100644 --- a/src/utils/postinstall.py +++ b/src/utils/postinstall.py @@ -22,6 +22,50 @@ from socket import gethostname CONFIGUREOS_LEGACY_ENABLED = False +def set_windows_hostname(disk, partition, name): + logging.info(f'Configuring hostname') + + if len(name) > 15: + logging.warning(f'Windows does nor permit hostnames that exceed 15 characters. Truncating {name}') + name = name[0:15] + + byte_name = name.encode(WINDOWS_HIVE_ENCODING) + + device = get_partition_device(disk, partition) + mountpoint = device.replace('dev', 'mnt') + + if not mount_mkdir(device, mountpoint): + raise OgError(f'Unable to mount {device} into {mountpoint}') + + try: + hive_path = mountpoint + WINDOWS_HIVE_SYSTEM + hive = hive_handler_open(hive_path, write=True) + root = hive.root() + + select_node = get_node_child_from_path(hive, root, 'Select') + current_control_set_number = get_value_from_node(hive, select_node, 'Current') + + control_set = f'ControlSet{current_control_set_number:03}' + + computer_name_node = get_node_child_from_path(hive, root, f'{control_set}/Control/ComputerName/ComputerName') + name_value = {'key': 'ComputerName', 't': RegistryType.SZ.value, 'value': byte_name} + hive.node_set_value(computer_name_node, name_value) + + parameters_node = get_node_child_from_path(hive, root, f'{control_set}/Services/Tcpip/Parameters') + + hostname_value = {'key': 'HostName', 't': RegistryType.SZ.value, 'value': byte_name} + hive.node_set_value(parameters_node, hostname_value) + + nvhostname_value = {'key': 'NV Hostname', 't': RegistryType.SZ.value, 'value': byte_name} + hive.node_set_value(parameters_node, nvhostname_value) + + hive.commit(hive_path) + except Exception as e: + raise OgError(f'Unable to configure Windows hostname: {e}') from e + finally: + umount(mountpoint) + + def configure_os_custom(disk, partition): if not shutil.which('configureOsCustom'): raise OgError('configureOsCustom not found') @@ -115,6 +159,9 @@ def configure_os_linux(disk, partition): def configure_os_windows(disk, partition): + hostname = gethostname() + set_windows_hostname(disk, partition, hostname) + if is_uefi_supported(): restore_windows_efi_bootloader(disk, partition) |