#include "TaskScheduler.au3" ; 需安装 TaskScheduler UDF 库
#RequireAdmin
; 示例 1:启动记事本(不等待)
Local $iPid = _RunAsSystem("C:\Windows\System32\notepad.exe")
If @error Then
MsgBox(16, "错误", "启动失败!错误代码: " & @error)
Else
MsgBox(64, "成功", "记事本 PID: " & $iPid)
EndIf
; 示例 2:运行 CMD 命令并等待结束
_RunAsSystem("cmd.exe /c echo Hello SYSTEM > C:\system_test.txt", True)
If @error Then MsgBox(16, "错误", "命令执行失败")
; #FUNCTION# ==================================================================
; 名称: _RunAsSystem
; 描述: 以 SYSTEM 权限运行指定程序
; 参数:
; $sExePath: 目标程序完整路径(需存在)
; $bWait: 是否等待进程结束 [可选,默认 False]
; 返回: 成功返回进程 PID,失败返回 0 并设置 @error
; =============================================================================
Func _RunAsSystem($sExePath, $bWait = False)
; 验证目标程序是否存在
If Not FileExists($sExePath) Then Return SetError(1, 0, 0)
; 生成唯一任务名(避免冲突)
Local $sTaskName = "AutoItSystemTask_" & String(Hex(Random(1, 1000000, 1)))
; 创建任务计划(以 SYSTEM 身份运行)
Local $iResult = RunWait( _
'schtasks /Create /TN "' & $sTaskName & '" ' & _
'/SC ONCE /ST 00:00 /RU SYSTEM /TR "' & $sExePath & '" /F', "", @SW_SHOW)
; 检查任务是否创建成功
If $iResult <> 0 Then Return SetError(2, $iResult, 0)
; 立即执行任务
$iResult = RunWait('schtasks /Run /TN "' & $sTaskName & '"', "", @SW_SHOW)
If $iResult <> 0 Then Return SetError(3, $iResult, 0)
; 获取进程 PID(通过进程名)
Local $sProcessName = StringRegExpReplace($sExePath, ".*\", "")
Local $iPID = ProcessWait($sProcessName, 5) ; 最多等待 5 秒
If $iPID = 0 Then Return SetError(4, 0, 0)
; 可选:等待进程结束
If $bWait Then ProcessWaitClose($iPID)
; 清理任务(避免残留)
RunWait('schtasks /Delete /TN "' & $sTaskName & '" /F', "", @SW_HIDE)
Return $iPID
EndFunc
|