I can make no promises, but try this from a Windows Command Prompt window launched with Administrator privileges:
bcdedit /set {bootmgr} path \EFI\ubuntu\grubx64.efi
Note that {bootmgr} should be typed exactly; that's not a variable. If that doesn't work, you could try this in Linux:
- Back up the entire contents of
/boot/efi (your EFI System Partition, or ESP).
- Type
sudo mv /boot/efi/EFI/Microsoft/Boot/bootmgfw.efi /boot/efi/EFI/Microsoft.
- Type
cp /boot/efi/EFI/ubuntu/grubx64.efi /boot/efi/EFI/Microsoft/Boot/bootmgfw.efi.
- Create a new
/etc/grub.d/40_custom file entry that refers to EFI/Microsoft/bootmgfw.efi. Model it after the existing entry in /boot/grub/grub.cfg that refers to EFI/Microsoft/Boot/bootmgfw.efi; just remove Boot from the boot path and give the entry a new name.
- Type
sudo update-grub to install the new GRUB entry.
When you reboot, GRUB should come up. The trouble is that if/when Windows decides to re-install its boot loader, the system will start booting straight to Windows again.
For step 4, you can:
- Copy the
40_custom entry beginning with menuentry 'Windows ...' situated between a set of ### BEGIN <path> ### and ### END <path> ### tags/comments. This is the entry having the path containing Boot.
- Create a new entry in file
/etc/grub.d/40_custom by adding the copied menuentry.
- Change the name of the new entry (original should be
Windows Boot Manager or something similar).
- Change the path from
EFI/Microsoft/Boot/bootmgfw.efi to EFI/Microsoft/bootmgfw.efi.
EDIT:
Since writing this answer, I've become aware of a third-party Windows tool called EasyUEFI, which is an easier GUI tool than bcdedit for adjusting the EFI boot order from Windows. I don't know if EasyUEFI will stop Windows from making changes, though, if Windows has a habit of setting itself as the default on every boot. Thus, bcdedit may still be required, but EasyUEFI is definitely worth trying, too.