The function are the counterparts of Run/RunWait commands(v1.1)/functions(v2.0).
Usage and examples: http://redd.it/1450upb
- Elevate.ahk (for AHK v2.0).
- Elevate1.ahk (for AHK v1.1).
- Elevate~.diff (v1.1 vs v2.0).
- Run.ahk (v2 built-ins patch).
The function are the counterparts of Run/RunWait commands(v1.1)/functions(v2.0).
Usage and examples: http://redd.it/1450upb
| #Requires AutoHotkey v2.0 | |
| ; Version: 2023.06.09.2 | |
| ; https://gist.github.com/d92498381a74a4535662306152b34ab | |
| ; Usage and examples: https://redd.it/1450upb | |
| Elevate(Target, WorkingDir := "", Options := "", &OutputVarPID := 0) { | |
| return Elevate_(false, Target, WorkingDir, Options, &OutputVarPID) | |
| } | |
| ElevateWait(Target, WorkingDir := "", Options := "", &OutputVarPID := 0) { | |
| return Elevate_(true, Target, WorkingDir, Options, &OutputVarPID) | |
| } | |
| /** | |
| * @private | |
| */ | |
| Elevate_(bWait, Target, WorkingDir, Options, &OutputVarPID) { | |
| template := ' | |
| ( | |
| #Requires AutoHotkey v2.0 | |
| Persistent(true) | |
| TraySetIcon("imageres.dll", 265) | |
| appPid := -1 | |
| ahkPid := DllCall("GetCurrentProcessId") | |
| FileOpen(A_WinDir "\Temp\AhkElevate2.run", 0x1).Write(ahkPid) | |
| SetTimer(CheckIt, 1) | |
| SetTimer(RunIt, -1) | |
| Exit() ; End of auto-execute | |
| RunIt() { | |
| global appPid | |
| exitCode := {}("{}", "{}", "{}", &appPid) | |
| FileOpen(A_WinDir "\Temp\AhkElevate2.ec", 0x1).Write(exitCode) | |
| FileDelete(A_ScriptFullPath) | |
| ExitApp(IsNumber(exitCode) ? exitCode : 0) | |
| } | |
| CheckIt() { | |
| global appPid | |
| if (appPid != -1) { | |
| FileOpen(A_WinDir "\Temp\AhkElevate2.pid", 0x1).Write(appPid) | |
| SetTimer(CheckIt, 0) | |
| } | |
| } | |
| )' | |
| Target := StrReplace(Target, "`"", "```"") | |
| template := Format(template, bWait ? "RunWait" : "Run", Target, WorkingDir, Options) | |
| try FileDelete(A_WinDir "\Temp\AhkElevate2.*") | |
| try { | |
| FileOpen(A_WinDir "\Temp\AhkElevate2.ahk", 0x1).Write(template) | |
| } catch { | |
| throw Error("There was an error creating the script for the task.", -1) | |
| } | |
| loop 2 { | |
| ErrorLevel := RunWait("schtasks.exe /Run /TN AhkElevate2 /HRESULT", , "Hide") | |
| if (ErrorLevel = -2147024894) { | |
| if (Elevate_AddTask()) { | |
| MsgBox("Scheduled task not added, cannot continue.", , 0x40010) | |
| Exit() | |
| } | |
| continue | |
| } | |
| if (ErrorLevel = 0) { | |
| break | |
| } | |
| throw Error("There was an error while running the scheduled task.", -1) | |
| } | |
| while (!FileExist(A_WinDir "\Temp\AhkElevate2.run")) { | |
| continue | |
| } | |
| timeout := A_TickCount + 50 | |
| while (A_TickCount < timeout) { | |
| try { | |
| OutputVarPID := FileOpen(A_WinDir "\Temp\AhkElevate2.pid", 0x0).Read() | |
| break | |
| } | |
| } | |
| try FileDelete(A_WinDir "\Temp\AhkElevate2.pid") | |
| if (bWait && IsSet(OutputVarPID)) { | |
| ProcessWaitClose(OutputVarPID) | |
| } | |
| timeout := A_TickCount + 50 | |
| while (A_TickCount < timeout) { | |
| try { | |
| ahkPid := FileOpen(A_WinDir "\Temp\AhkElevate2.run", 0x0).Read() | |
| ProcessWaitClose(ahkPid) | |
| break | |
| } | |
| } | |
| try FileDelete(A_WinDir "\Temp\AhkElevate2.run") | |
| exitCode := "" | |
| timeout := A_TickCount + 50 | |
| while (A_TickCount < timeout) { | |
| try { | |
| exitCode := FileOpen(A_WinDir "\Temp\AhkElevate2.ec", 0x0).Read() | |
| } | |
| } | |
| try FileDelete(A_WinDir "\Temp\AhkElevate2.ec") | |
| return exitCode | |
| } | |
| /** | |
| * @private | |
| */ | |
| Elevate_AddTask() { | |
| xml := '<?xml version="1.0" encoding="UTF-16"?><Task version="1.4" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task"><Triggers><TimeTrigger><StartBoundary>1970-01-01T00:00:00</StartBoundary><Enabled>true</Enabled></TimeTrigger></Triggers><Principals><Principal id="Author"><LogonType>InteractiveToken</LogonType><RunLevel>HighestAvailable</RunLevel></Principal></Principals><Settings><MultipleInstancesPolicy>Parallel</MultipleInstancesPolicy><DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries><StopIfGoingOnBatteries>false</StopIfGoingOnBatteries><ExecutionTimeLimit>PT0S</ExecutionTimeLimit></Settings><Actions Context="Author"><Exec><Command>"C:\Program Files\AutoHotkey\v2\AutoHotkey.exe"</Command><Arguments>"' A_WinDir '\Temp\AhkElevate2.ahk"</Arguments></Exec></Actions></Task>' | |
| FileOpen(A_Temp "\AhkElevate2.xml", 0x1, "UTF-16").Write(xml) | |
| try { | |
| RunWait("*RunAs schtasks.exe /Create /TN AhkElevate2 /XML `"" A_Temp "\AhkElevate2.xml`" /F", , "Hide") | |
| return 0 | |
| } catch { | |
| ; Avoid unhandled exception. | |
| } finally { | |
| FileDelete(A_Temp "\AhkElevate2.xml") | |
| } | |
| return 1 | |
| } |
| #Requires AutoHotkey v1.1 | |
| ; Version: 2023.06.09.2 | |
| ; https://gist.github.com/d92498381a74a4535662306152b34ab | |
| ; Usage and examples: https://redd.it/1450upb | |
| Elevate(Target, WorkingDir := "", Options := "", ByRef OutputVarPID := 0) { | |
| return Elevate_(false, Target, WorkingDir, Options, OutputVarPID) | |
| } | |
| ElevateWait(Target, WorkingDir := "", Options := "", ByRef OutputVarPID := 0) { | |
| return Elevate_(true, Target, WorkingDir, Options, OutputVarPID) | |
| } | |
| /** | |
| * @private | |
| */ | |
| Elevate_(bWait, Target, WorkingDir, Options, ByRef OutputVarPID) { | |
| template = | |
| (% | |
| #Requires AutoHotkey v1.1 | |
| #Persistent | |
| Menu Tray, Icon, imageres.dll, 265 | |
| appPid := -1 | |
| ahkPid := DllCall("GetCurrentProcessId") | |
| FileOpen(A_WinDir "\Temp\AhkElevate1.run", 0x1).Write(ahkPid) | |
| SetTimer CheckIt, 1 | |
| SetTimer RunIt, -1 | |
| Exit ; End of auto-execute | |
| RunIt() { | |
| global appPid | |
| {} {}, {}, {}, appPid | |
| exitCode := ErrorLevel | |
| FileOpen(A_WinDir "\Temp\AhkElevate1.ec", 0x1).Write(exitCode) | |
| FileDelete % A_ScriptFullPath | |
| ExitApp % Format("{:d}", exitCode) | |
| } | |
| CheckIt() { | |
| global appPid | |
| if (appPid != -1) { | |
| FileOpen(A_WinDir "\Temp\AhkElevate1.pid", 0x1).Write(appPid) | |
| SetTimer CheckIt, Delete | |
| } | |
| } | |
| ) | |
| Target := StrReplace(Target, """", """""") | |
| template := Format(template, bWait ? "RunWait" : "Run", Target, WorkingDir, Options) | |
| try FileDelete % A_WinDir "\Temp\AhkElevate1.*" | |
| try { | |
| FileOpen(A_WinDir "\Temp\AhkElevate1.ahk", 0x1).Write(template) | |
| } catch { | |
| throw Exception("There was an error creating the script for the task.", -1) | |
| } | |
| loop 2 { | |
| RunWait schtasks.exe /Run /TN AhkElevate1 /HRESULT, , Hide | |
| if (ErrorLevel = -2147024894) { | |
| if (Elevate_AddTask()) { | |
| MsgBox 0x40010, , Scheduled task not added`, cannot continue. | |
| Exit | |
| } | |
| continue | |
| } | |
| if (ErrorLevel = 0) { | |
| break | |
| } | |
| throw Exception("There was an error while running the scheduled task.", -1) | |
| } | |
| while (!FileExist(A_WinDir "\Temp\AhkElevate1.run")) { | |
| continue | |
| } | |
| timeout := A_TickCount + 50 | |
| while (A_TickCount < timeout) { | |
| try { | |
| OutputVarPID := FileOpen(A_WinDir "\Temp\AhkElevate1.pid", 0x0).Read() | |
| break | |
| } | |
| } | |
| try FileDelete % A_WinDir "\Temp\AhkElevate1.pid" | |
| if (bWait && IsSet(OutputVarPID)) { | |
| Process WaitClose, % OutputVarPID | |
| } | |
| timeout := A_TickCount + 50 | |
| while (A_TickCount < timeout) { | |
| try { | |
| ahkPid := FileOpen(A_WinDir "\Temp\AhkElevate1.run", 0x0).Read() | |
| Process WaitClose, % ahkPid | |
| break | |
| } | |
| } | |
| try FileDelete % A_WinDir "\Temp\AhkElevate1.run" | |
| exitCode := "" | |
| timeout := A_TickCount + 50 | |
| while (A_TickCount < timeout) { | |
| try { | |
| exitCode := FileOpen(A_WinDir "\Temp\AhkElevate1.ec", 0x0).Read() | |
| } | |
| } | |
| try FileDelete % A_WinDir "\Temp\AhkElevate1.ec" | |
| return exitCode | |
| } | |
| /** | |
| * @private | |
| */ | |
| Elevate_AddTask() { | |
| xml = <?xml version="1.0" encoding="UTF-16"?><Task version="1.4" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task"><Triggers><TimeTrigger><StartBoundary>1970-01-01T00:00:00</StartBoundary><Enabled>true</Enabled></TimeTrigger></Triggers><Principals><Principal id="Author"><LogonType>InteractiveToken</LogonType><RunLevel>HighestAvailable</RunLevel></Principal></Principals><Settings><MultipleInstancesPolicy>Parallel</MultipleInstancesPolicy><DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries><StopIfGoingOnBatteries>false</StopIfGoingOnBatteries><ExecutionTimeLimit>PT0S</ExecutionTimeLimit></Settings><Actions Context="Author"><Exec><Command>"C:\Program Files\AutoHotkey\AutoHotkey.exe"</Command><Arguments>"%A_WinDir%\Temp\AhkElevate1.ahk"</Arguments></Exec></Actions></Task> | |
| FileOpen(A_Temp "\AhkElevate1.xml", 0x1, "UTF-16").Write(xml) | |
| try { | |
| RunWait % "*RunAs schtasks.exe /Create /TN AhkElevate1 /XML """ A_Temp "\AhkElevate1.xml"" /F", , Hide | |
| return 0 | |
| } catch { | |
| ; Avoid unhandled exception. | |
| } finally { | |
| FileDelete % A_Temp "\AhkElevate1.xml" | |
| } | |
| return 1 | |
| } |
| --- Elevate.ahk | |
| +++ Elevate1.ahk | |
| @@ -1 +1 @@ | |
| -#Requires AutoHotkey v2.0 | |
| +#Requires AutoHotkey v1.1 | |
| @@ -7,2 +7,2 @@ | |
| -Elevate(Target, WorkingDir := "", Options := "", &OutputVarPID := 0) { | |
| - return Elevate_(false, Target, WorkingDir, Options, &OutputVarPID) | |
| +Elevate(Target, WorkingDir := "", Options := "", ByRef OutputVarPID := 0) { | |
| + return Elevate_(false, Target, WorkingDir, Options, OutputVarPID) | |
| @@ -11,2 +11,2 @@ | |
| -ElevateWait(Target, WorkingDir := "", Options := "", &OutputVarPID := 0) { | |
| - return Elevate_(true, Target, WorkingDir, Options, &OutputVarPID) | |
| +ElevateWait(Target, WorkingDir := "", Options := "", ByRef OutputVarPID := 0) { | |
| + return Elevate_(true, Target, WorkingDir, Options, OutputVarPID) | |
| @@ -18,6 +18,6 @@ | |
| -Elevate_(bWait, Target, WorkingDir, Options, &OutputVarPID) { | |
| - template := ' | |
| - ( | |
| - #Requires AutoHotkey v2.0 | |
| - Persistent(true) | |
| - TraySetIcon("imageres.dll", 265) | |
| +Elevate_(bWait, Target, WorkingDir, Options, ByRef OutputVarPID) { | |
| + template = | |
| + (% | |
| + #Requires AutoHotkey v1.1 | |
| + #Persistent | |
| + Menu Tray, Icon, imageres.dll, 265 | |
| @@ -26,4 +26,4 @@ | |
| - FileOpen(A_WinDir "\Temp\AhkElevate2.run", 0x1).Write(ahkPid) | |
| - SetTimer(CheckIt, 1) | |
| - SetTimer(RunIt, -1) | |
| - Exit() ; End of auto-execute | |
| + FileOpen(A_WinDir "\Temp\AhkElevate1.run", 0x1).Write(ahkPid) | |
| + SetTimer CheckIt, 1 | |
| + SetTimer RunIt, -1 | |
| + Exit ; End of auto-execute | |
| @@ -32,4 +32,5 @@ | |
| - exitCode := {}("{}", "{}", "{}", &appPid) | |
| - FileOpen(A_WinDir "\Temp\AhkElevate2.ec", 0x1).Write(exitCode) | |
| - FileDelete(A_ScriptFullPath) | |
| - ExitApp(IsNumber(exitCode) ? exitCode : 0) | |
| + {} {}, {}, {}, appPid | |
| + exitCode := ErrorLevel | |
| + FileOpen(A_WinDir "\Temp\AhkElevate1.ec", 0x1).Write(exitCode) | |
| + FileDelete % A_ScriptFullPath | |
| + ExitApp % Format("{:d}", exitCode) | |
| @@ -40,2 +41,2 @@ | |
| - FileOpen(A_WinDir "\Temp\AhkElevate2.pid", 0x1).Write(appPid) | |
| - SetTimer(CheckIt, 0) | |
| + FileOpen(A_WinDir "\Temp\AhkElevate1.pid", 0x1).Write(appPid) | |
| + SetTimer CheckIt, Delete | |
| @@ -44,2 +45,2 @@ | |
| - )' | |
| - Target := StrReplace(Target, "`"", "```"") | |
| + ) | |
| + Target := StrReplace(Target, """", """""") | |
| @@ -47 +48 @@ | |
| - try FileDelete(A_WinDir "\Temp\AhkElevate2.*") | |
| + try FileDelete % A_WinDir "\Temp\AhkElevate1.*" | |
| @@ -49 +50 @@ | |
| - FileOpen(A_WinDir "\Temp\AhkElevate2.ahk", 0x1).Write(template) | |
| + FileOpen(A_WinDir "\Temp\AhkElevate1.ahk", 0x1).Write(template) | |
| @@ -51 +52 @@ | |
| - throw Error("There was an error creating the script for the task.", -1) | |
| + throw Exception("There was an error creating the script for the task.", -1) | |
| @@ -54 +55 @@ | |
| - ErrorLevel := RunWait("schtasks.exe /Run /TN AhkElevate2 /HRESULT", , "Hide") | |
| + RunWait schtasks.exe /Run /TN AhkElevate1 /HRESULT, , Hide | |
| @@ -57,2 +58,2 @@ | |
| - MsgBox("Scheduled task not added, cannot continue.", , 0x40010) | |
| - Exit() | |
| + MsgBox 0x40010, , Scheduled task not added`, cannot continue. | |
| + Exit | |
| @@ -65 +66 @@ | |
| - throw Error("There was an error while running the scheduled task.", -1) | |
| + throw Exception("There was an error while running the scheduled task.", -1) | |
| @@ -67 +68 @@ | |
| - while (!FileExist(A_WinDir "\Temp\AhkElevate2.run")) { | |
| + while (!FileExist(A_WinDir "\Temp\AhkElevate1.run")) { | |
| @@ -73 +74 @@ | |
| - OutputVarPID := FileOpen(A_WinDir "\Temp\AhkElevate2.pid", 0x0).Read() | |
| + OutputVarPID := FileOpen(A_WinDir "\Temp\AhkElevate1.pid", 0x0).Read() | |
| @@ -77 +78 @@ | |
| - try FileDelete(A_WinDir "\Temp\AhkElevate2.pid") | |
| + try FileDelete % A_WinDir "\Temp\AhkElevate1.pid" | |
| @@ -79 +80 @@ | |
| - ProcessWaitClose(OutputVarPID) | |
| + Process WaitClose, % OutputVarPID | |
| @@ -84,2 +85,2 @@ | |
| - ahkPid := FileOpen(A_WinDir "\Temp\AhkElevate2.run", 0x0).Read() | |
| - ProcessWaitClose(ahkPid) | |
| + ahkPid := FileOpen(A_WinDir "\Temp\AhkElevate1.run", 0x0).Read() | |
| + Process WaitClose, % ahkPid | |
| @@ -89 +90 @@ | |
| - try FileDelete(A_WinDir "\Temp\AhkElevate2.run") | |
| + try FileDelete % A_WinDir "\Temp\AhkElevate1.run" | |
| @@ -94 +95 @@ | |
| - exitCode := FileOpen(A_WinDir "\Temp\AhkElevate2.ec", 0x0).Read() | |
| + exitCode := FileOpen(A_WinDir "\Temp\AhkElevate1.ec", 0x0).Read() | |
| @@ -97 +98 @@ | |
| - try FileDelete(A_WinDir "\Temp\AhkElevate2.ec") | |
| + try FileDelete % A_WinDir "\Temp\AhkElevate1.ec" | |
| @@ -105,2 +106,2 @@ | |
| - xml := '<?xml version="1.0" encoding="UTF-16"?><Task version="1.4" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task"><Triggers><TimeTrigger><StartBoundary>1970-01-01T00:00:00</StartBoundary><Enabled>true</Enabled></TimeTrigger></Triggers><Principals><Principal id="Author"><LogonType>InteractiveToken</LogonType><RunLevel>HighestAvailable</RunLevel></Principal></Principals><Settings><MultipleInstancesPolicy>Parallel</MultipleInstancesPolicy><DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries><StopIfGoingOnBatteries>false</StopIfGoingOnBatteries><ExecutionTimeLimit>PT0S</ExecutionTimeLimit></Settings><Actions Context="Author"><Exec><Command>"C:\Program Files\AutoHotkey\v2\AutoHotkey.exe"</Command><Arguments>"' A_WinDir '\Temp\AhkElevate2.ahk"</Arguments></Exec></Actions></Task>' | |
| - FileOpen(A_Temp "\AhkElevate2.xml", 0x1, "UTF-16").Write(xml) | |
| + xml = <?xml version="1.0" encoding="UTF-16"?><Task version="1.4" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task"><Triggers><TimeTrigger><StartBoundary>1970-01-01T00:00:00</StartBoundary><Enabled>true</Enabled></TimeTrigger></Triggers><Principals><Principal id="Author"><LogonType>InteractiveToken</LogonType><RunLevel>HighestAvailable</RunLevel></Principal></Principals><Settings><MultipleInstancesPolicy>Parallel</MultipleInstancesPolicy><DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries><StopIfGoingOnBatteries>false</StopIfGoingOnBatteries><ExecutionTimeLimit>PT0S</ExecutionTimeLimit></Settings><Actions Context="Author"><Exec><Command>"C:\Program Files\AutoHotkey\AutoHotkey.exe"</Command><Arguments>"%A_WinDir%\Temp\AhkElevate1.ahk"</Arguments></Exec></Actions></Task> | |
| + FileOpen(A_Temp "\AhkElevate1.xml", 0x1, "UTF-16").Write(xml) | |
| @@ -108 +109 @@ | |
| - RunWait("*RunAs schtasks.exe /Create /TN AhkElevate2 /XML `"" A_Temp "\AhkElevate2.xml`" /F", , "Hide") | |
| + RunWait % "*RunAs schtasks.exe /Create /TN AhkElevate1 /XML """ A_Temp "\AhkElevate1.xml"" /F", , Hide | |
| @@ -113 +114 @@ | |
| - FileDelete(A_Temp "\AhkElevate2.xml") | |
| + FileDelete % A_Temp "\AhkElevate1.xml" |
| #Requires AutoHotkey v2.0 | |
| ; Version: 2023.06.09.2 | |
| ; https://gist.github.com/d92498381a74a4535662306152b34ab | |
| ; Usage and examples: https://redd.it/1450upb | |
| #Include <Elevate> | |
| Run_Patch() { | |
| if (RunWait("schtasks.exe /Query /TN AhkElevate2", , "Hide")) { | |
| if (Elevate_AddTask()) { | |
| MsgBox("Scheduled task was not added, the UAC prompt will be shown.", , 0x40010) | |
| return | |
| } | |
| } | |
| Run_Call := Run.base.GetOwnPropDesc("Call").Call | |
| RunWait_Call := RunWait.base.GetOwnPropDesc("Call").Call | |
| Run.DefineProp("Call", { Call: (self, Params*) => Elevate_Patch(self, false, Params*) }) | |
| RunWait.DefineProp("Call", { Call: (self, Params*) => Elevate_Patch(self, true, Params*) }) | |
| Elevate_Patch(self, bWait, Target, WorkingDir := "", Options := "", &OutputVarPID := 0) { | |
| Target := RegExReplace(Target, "i)^\h*\*RunAs\h+", , &elevate) | |
| if (elevate) { | |
| return Elevate_(bWait, Target, WorkingDir, Options, &OutputVarPID) | |
| } | |
| fn := bWait ? RunWait_Call : Run_Call | |
| return fn(self, Target, WorkingDir, Options, &OutputVarPID) | |
| } | |
| } |