Тема: AHK: Отправка оконного сообщения
Возможно как то отправить оконное сообщение, из скрипта с меньшими правами чем принимающий?
Win10x64 AhkSpy, Hotkey, ClockGui
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Возможно как то отправить оконное сообщение, из скрипта с меньшими правами чем принимающий?
UIA?
Не очень вникал в это, казалось что оно именно от админа работает.
Это про файл AutoHotkeyU32_UIA.exe?
Я запускаю из AHK_H, Dll или ехе. В ехе попробовал в манифест прописать <v3:requestedExecutionLevel level="asInvoker" uiAccess="true"/>, не помогло. С длл не ясно что делать.
Это как то можно в коде анк прописать?
Подробнее поясню, есть скрипт запущенный по некоторым причинам без админа, он отправляет сообщение, и другой скрипт от админа не видит его сообщение.
Тебе нужно ChangeWindowMessageFilter или ChangeWindowMessageFilterEx.
О, спасибо, работает!
Насчёт UIA конечно по прежнему интересно.
Насчёт UIA конечно по прежнему интересно.
Ещё и в контексте установки хоткеи, которые аналогично не работают.
Там нужно ещё сертификат покупать и подписывать созданные экзешники.
https://habr.com/ru/companies/tuthost/articles/152867
Спасибо, в общем слишком серьёзно всё. Для хоткеев вариантов нет.
Ну можно хакерским способом:
https://forum.script-coding.com/viewtopic.php?id=17864
Да, но
(нужно запускать скрипт от имени администратора):
Если ничего запускать от имени админа нельзя, то не выйдет.
Автор с автоит пишет:
This UDF requires administrator privileges, but you can still use it to create a process with standard user privileges and uiaccess attributes
Если ничего запускать от имени админа нельзя
Можно.
Так, может я не вкурил, есть скрипт который должен работать без прав админа, то есть вместо него можно что то сначала запустить с правами админа, и оно как то его так запустит без прав админа, таким образом что вопрос с хоткеями решится?
Можно так попробовать:
scriptToRunWithUIAccess := "D:\OneDrive\Scripts\_Разработка\New7.ahk"
RunAsAdmin()
RunWithUiAccess()
ShellRunAsUser(A_AhkPath, scriptToRunWithUIAccess)
RunAsAdmin(exitIfNotAdmin := false) {
commandLine := DllCall("GetCommandLine", "str")
isRestarted := !!RegExMatch(commandLine, " /restart(?!\S)")
while !( A_IsAdmin || isRestarted ) {
try Run, % "*RunAs " . (A_IsCompiled ? """" . A_ScriptFullPath . """ /restart"
: """" . A_AhkPath . """ /restart """ . A_ScriptFullPath . """")
catch
break
ExitApp
}
if !A_IsAdmin {
MsgBox, Failed to run the script as admin!
if exitIfNotAdmin
ExitApp
}
}
RunWithUiAccess()
{
Gui, +HWNDhGui +AlwaysOnTop
DllCall("GetWindowBand", "uptr", hGui, "uint*", band)
Gui, Destroy
if (band != 1)
return
if !DllCall("advapi32\LookupPrivilegeValueW", "ptr", 0, "str", "SeTcbPrivilege", "int64*", luid)
{
msgbox LookupPrivilegeValueW error`n%A_LastError%
exitapp
}
VarSetCapacity(PRIVILEGE_SET, 20, 0)
NumPut(1, PRIVILEGE_SET, 0, "uint")
NumPut(PRIVILEGE_SET_ALL_NECESSARY := 1, PRIVILEGE_SET, 4, "uint")
NumPut(luid, PRIVILEGE_SET, 8, "int64")
DllCall("advapi32\OpenProcessToken", "ptr", DllCall("GetCurrentProcess", "ptr"), "uint", 0x0008|0x0002, "ptr*", hTokenSelf) ; TOKEN_QUERY|TOKEN_DUPLICATE
DllCall("advapi32\GetTokenInformation", "ptr", hTokenSelf, "uint", 12, "uint*", TokenSelfSessionId, "uint", 4, "uint*", ReturnLength)
hSnapshot := DllCall("CreateToolhelp32Snapshot", "uint", TH32CS_SNAPPROCESS := 0x00000002, "uint", 0, "ptr")
VarSetCapacity(PROCESSENTRY32, A_PtrSize*3 + 544, 0)
NumPut(A_PtrSize*3 + 544, PROCESSENTRY32, 0, "uint")
loop
{
if (A_Index = 1)
hr := DllCall("Process32FirstW", "ptr", hSnapshot, "ptr", &PROCESSENTRY32)
else
hr := DllCall("Process32NextW", "ptr", hSnapshot, "ptr", &PROCESSENTRY32)
if !hr
break
if (StrGet(&PROCESSENTRY32 + A_PtrSize*2 + 28, "utf-16") = "winlogon.exe")
{
hProcess := DllCall("OpenProcess", "uint", PROCESS_QUERY_LIMITED_INFORMATION := 0x1000, "int", false, "uint", NumGet(PROCESSENTRY32, 8, "uint"), "ptr")
DllCall("advapi32\OpenProcessToken", "ptr", hProcess, "uint", 0x0008|0x0002, "ptr*", hToken) ; TOKEN_QUERY|TOKEN_DUPLICATE
DllCall("advapi32\PrivilegeCheck", "ptr", hToken, "ptr", &PRIVILEGE_SET, "int*", pfResult)
if pfResult
{
DllCall("advapi32\GetTokenInformation", "ptr", hToken, "uint", 12, "uint*", TokenSessionId, "uint", 4, "uint*", ReturnLength)
if (TokenSessionId = TokenSelfSessionId)
{
DllCall("advapi32\GetTokenInformation", "ptr", hToken, "uint", 1, "ptr", 0, "uint", 0, "uint*", ReturnLength)
VarSetCapacity(TokenUser, ReturnLength, 0)
DllCall("advapi32\GetTokenInformation", "ptr", hToken, "uint", 1, "ptr", &TokenUser, "uint", ReturnLength, "uint*", ReturnLength)
if DllCall("advapi32\IsWellKnownSid", "ptr", NumGet(TokenUser), "uint", WinLocalSystemSid := 22)
DllCall("advapi32\DuplicateTokenEx", "ptr", hToken, "uint", TOKEN_IMPERSONATE := 0x0004, "ptr", 0, "int", SecurityImpersonation := 2, "int", TokenImpersonation := 2, "ptr*", hTokenSystem)
}
}
DllCall("CloseHandle", "ptr", hProcess)
DllCall("CloseHandle", "ptr", hToken)
}
} until hTokenSystem
DllCall("CloseHandle", "ptr", hSnapshot)
if !hTokenSystem
{
msgbox RunWithUiAccess error
exitapp
}
DllCall("advapi32\SetThreadToken", "ptr", 0, "ptr", hTokenSystem)
DllCall("advapi32\DuplicateTokenEx", "ptr", hTokenSelf, "uint", 0x0008|0x0002|0x0001|0x0080, "ptr", 0, "int", SecurityAnonymous := 0, "int", TokenPrimary := 1, "ptr*", hTokenUIAccess) ; TOKEN_QUERY|TOKEN_DUPLICATE|TOKEN_ASSIGN_PRIMARY|TOKEN_ADJUST_DEFAULT
DllCall("advapi32\SetTokenInformation", "ptr", hTokenUIAccess, "uint", TokenUIAccess := 26, "uint*", true, "uint", 4)
DllCall("advapi32\RevertToSelf")
DllCall("CloseHandle", "ptr", hTokenSystem)
DllCall("CloseHandle", "ptr", hTokenSelf)
VarSetCapacity(PROCESS_INFORMATION, A_PtrSize*2 + 8, 0)
VarSetCapacity(STARTUPINFO, A_PtrSize*9 + 32, 0)
NumPut(A_PtrSize*9 + 32, STARTUPINFO, 0, "uint")
DllCall("GetStartupInfo", "ptr", &STARTUPINFO)
DllCall("advapi32\CreateProcessAsUserW", "ptr", hTokenUIAccess, "ptr", 0, "wstr", DllCall("GetCommandLineW", "wstr"), "ptr", 0, "ptr", 0, "int", 0, "uint", 0, "ptr", 0, "wstr", A_ScriptDir, "ptr", &STARTUPINFO, "ptr", &PROCESS_INFORMATION)
DllCall("CloseHandle", "ptr", NumGet(PROCESS_INFORMATION, 0, "ptr"))
DllCall("CloseHandle", "ptr", NumGet(PROCESS_INFORMATION, A_PtrSize, "ptr"))
sleep 1000
}
ShellRunAsUser(filePath, arguments := "", directory := "", verb := "", show := 1)
{
static VT_UI4 := 0x13, SWC_DESKTOP := 0x8
ShellWindows := ComObjCreate("Shell.Application").Windows
Shell := ShellWindows.Item( ComObject(VT_UI4, SWC_DESKTOP) ).Document.Application
Shell.ShellExecute(filePath, arguments, directory, verb, show)
}
Не помогло, если запустить от админа, то и скрипт из переменной scriptToRunWithUIAccess запускается от админа, а если запустить без админа, то и скрипт без админа, но ничего не меняется, хоткей не работает.
Это хорошо видно в Notepad++ запущенном даже без админа, хоткей работает только если ахк от админа.
#IF 1
2::
MsgBox
Return
Хм, странно, у меня всё не так. Горячая клавиша в Notepad++ работает даже в скрипте без повышения привилегий. Скрипт, запущенный вышеуказанным способом запускается именно с UIAccess, но не от админа, проверял в Диспетчере задач.
Твоя горячая клавиша при активном приложении с повышенными правами почему-то действительно не работает, а вот такая работает:
^1:: MsgBox Hotkey test
Это на фоне Диспетчера задач. Но у меня Windows 10.
Твоя горячая клавиша при активном приложении с повышенными правами почему-то действительно не работает, а вот такая работает:
Такая тоже работает и без UiAccess.
Если с твоим кодом запустить, то окно поверх диспетчера задач не выводит.
Windows тоже 10.
Запускает с админом, ZBID_DESKTOP := 1.
при активном приложении с повышенными правами
Если права одинаковы, то еть и то и другое без админа, то тоже не работает с #IF 1.
serzh82saratov, тут наверное надо создавать процесс с урезанным токеном.
То есть, после того как мы создали с помощью "SetTokenInformation" hTokenUIAccess, мы должны его урезать:
DllCall("advapi32.dll\CreateRestrictedToken", "ptr", hTokenUIAccess, "uint", LUA_TOKEN := 0x4, "uint", 0, "ptr", 0, "uint", 0, "ptr", 0, "uint", 0, "ptr", 0, "ptr*", hTokenRestricted)
После чего в CreateProcessAsUserW, указать hTokenRestricted.
Пробуй, сам проверить смогу нескоро.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться