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) | |
} | |
} |
As so often, you save my gosh darn ass because I have been very unsuccessful at writing this on my own properly. Thank you. This goes into my lib immediately, and will probably turn up on various.
Also, please check chat once with regards to this, cuz I got questions which are tangential but utterly unresolved after enough time digging myself first.