|
|
本帖最后由 gzh888666 于 2026-5-6 22:06 编辑
解决方法: 在脚本的最顶部添加一行:
#RequireAdmin
; 先激活窗口
WinActivate("Windows 安全中心")
WinWaitActive("Windows 安全中心")
; 获取控件相对坐标并点击
Local $pos = ControlGetPos("Windows 安全中心", "", "[CLASS:Button; INSTANCE:2]")
If Not @error Then
; 点击控件的中心位置
MouseClick("left", $pos[0] + $pos[2]/2, $pos[1] + $pos[3]/2, 1, 0)
EndIf
ControlFocus("Windows 安全中心", "", "[CLASS:Button; INSTANCE:2]")
ControlSend("Windows 安全中心", "", "[CLASS:Button; INSTANCE:2]", "{SPACE}")
如果还不行就
Func _RunAsSYSTEM($sCmd)
Local $hToken, $hNewToken, $si, $pi
; 常量
Local Const $PROCESS_QUERY_INFORMATION = 0x0400
Local Const $TOKEN_DUPLICATE = 0x0002
Local Const $MAXIMUM_ALLOWED = 0x02000000
Local Const $CREATE_NEW_CONSOLE = 0x0010
; 找 winlogon PID
Local $aProc = ProcessList("winlogon.exe")
If @error Or $aProc[0][0] = 0 Then Return False
Local $hProc = DllCall("kernel32.dll", "handle", "OpenProcess",
"dword", $PROCESS_QUERY_INFORMATION,
"bool", False,
"dword", $aProc[1][1])
If Not $hProc[0] Then Return False
; 打开 Token
DllCall("advapi32.dll", "bool", "OpenProcessToken",
"handle", $hProc[0],
"dword", $TOKEN_DUPLICATE,
"ptr", VarPtr($hToken))
If Not $hToken Then Return False
; 复制 Token
DllCall("advapi32.dll", "bool", "DuplicateTokenEx",
"handle", $hToken,
"dword", $MAXIMUM_ALLOWED,
"ptr", 0,
"int", 2, ; SecurityImpersonation
"int", 1, ; TokenPrimary
"ptr", VarPtr($hNewToken))
; STARTUPINFO
$si = DllStructCreate("dword cb;ptr lpReserved;ptr lpDesktop;" &
"ptr lpTitle;dword dwX;dword dwY;dword dwXSize;dword dwYSize;" &
"dword dwXCountChars;dword dwYCountChars;dword dwFillAttribute;" &
"dword dwFlags;word wShowWindow;word cbReserved2;ptr lpReserved2;handle hStdInput;handle hStdOutput;handle hStdError")
DllStructSetData($si, "cb", DllStructGetSize($si))
; PROCESS_INFORMATION
$pi = DllStructCreate("handle hProcess;handle hThread;dword dwProcessId;dword dwThreadId")
; 创建进程
DllCall("advapi32.dll", "bool", "CreateProcessAsUser",
"handle", $hNewToken,
"str", "",
"str", $sCmd,
"ptr", 0,
"ptr", 0,
"bool", False,
"dword", $CREATE_NEW_CONSOLE,
"ptr", 0,
"str", "",
"ptr", DllStructGetPtr($si),
"ptr", DllStructGetPtr($pi))
Return True
EndFunc
最后一招:
Func _RunAsTrustedInstaller($sCmd)
Local $hToken, $hNewToken, $si, $pi
Local Const $PROCESS_QUERY_INFORMATION = 0x0400
Local Const $TOKEN_DUPLICATE = 0x0002
Local Const $MAXIMUM_ALLOWED = 0x02000000
Local Const $CREATE_NEW_CONSOLE = 0x0010
; 确保服务运行
RunWait("sc start TrustedInstaller")
Sleep(1000)
; 查找 TrustedInstaller
Local $aProc = ProcessList("TrustedInstaller.exe")
If @error Or $aProc[0][0] = 0 Then Return False
Local $hProc = DllCall("kernel32.dll", "handle", "OpenProcess",
"dword", $PROCESS_QUERY_INFORMATION,
"bool", False,
"dword", $aProc[1][1])
If Not $hProc[0] Then Return False
DllCall("advapi32.dll", "bool", "OpenProcessToken",
"handle", $hProc[0],
"dword", $TOKEN_DUPLICATE,
"ptr", VarPtr($hToken))
DllCall("advapi32.dll", "bool", "DuplicateTokenEx",
"handle", $hToken,
"dword", $MAXIMUM_ALLOWED,
"ptr", 0,
"int", 2,
"int", 1,
"ptr", VarPtr($hNewToken))
$si = DllStructCreate("dword cb;ptr lpReserved;ptr lpDesktop;" &
"ptr lpTitle;dword dwX;dword dwY;dword dwXSize;dword dwYSize;" &
"dword dwXCountChars;dword dwYCountChars;dword dwFillAttribute;" &
"dword dwFlags;word wShowWindow;word cbReserved2;ptr lpReserved2;handle hStdInput;handle hStdOutput;handle hStdError")
DllStructSetData($si, "cb", DllStructGetSize($si))
$pi = DllStructCreate("handle hProcess;handle hThread;dword dwProcessId;dword dwThreadId")
DllCall("advapi32.dll", "bool", "CreateProcessAsUser",
"handle", $hNewToken,
"str", "",
"str", $sCmd,
"ptr", 0,
"ptr", 0,
"bool", False,
"dword", $CREATE_NEW_CONSOLE,
"ptr", 0,
"str", "",
"ptr", DllStructGetPtr($si),
"ptr", DllStructGetPtr($pi))
Return True
EndFunc
然后再执行点击
|
|