Что нового

Получение родительских conhost'ов (по примеру AutoHotkey)

musicstashall

Знающий
Сообщения
322
Репутация
7
Всем привет.

Народ, помогите переписать следущий скрипт на AutoIt, либо аналог какой-то предложите. Буду признателен.

Код:
Hide:
if InfoHWND := WinExist("Desktop Window Manager ahk_class #32770")
{
	WinGet, InfoPID, PID, ahk_id %InfoHWND%
	Process, Exist, dwm.exe
	if (ErrorLevel = InfoPID)
		PostMessage, 0x112, 0xF060,,, ahk_id %InfoHWND%
}
IfWinExist, dwm.exe
{
	for Process in ComObjGet("winmgmts:").ExecQuery("Select * from Win32_Process where name='conhost.exe'")
	{
		User := ComVar()
		Process.GetOwner(User.ref)
		StringLeft, UserName, % User[], 4
		if (UserName = "DWM-")
			RunWait, % "taskkill /f /pid " . Process.ProcessID, , Hide
	}
}
SetTitleMatchMode, 2
if ModernFrameHWND := WinExist(A_WinDir "\system32\ApplicationFrameHost.exe ahk_class ConsoleWindowClass")
{
	WinGet, ModernFramePID, PID, ahk_id %ModernFrameHWND%
	Process, Exist, ApplicationFrameHost.exe
	ApplicationFrameHostPID := ErrorLevel
	if (ErrorLevel = ModernFramePID)
	{
		for Process in ComObjGet("winmgmts:").ExecQuery("Select * from Win32_Process where name='conhost.exe'")
		{
			if (GetParentProcess(Process.ProcessID) = ApplicationFrameHostPID)
			{
				RunWait, % "taskkill /f /pid " . Process.ProcessID, , Hide
				break
			}
		}
	}
}
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Код:
#include <WinAPIProc.au3>

$aList = ProcessList("conhost.exe")
For $i = 1 To $aList[0][0]
  $PID = _WinAPI_GetParentProcess($aList[$i][1])
  $Name = _WinAPI_GetProcessName($PID)
  ConsoleWrite($PID & ":" & $Name & @CRLF)
Next
 
Автор
M

musicstashall

Знающий
Сообщения
322
Репутация
7
Сделал таким образом:

Код:
#include <WinAPI.au3>
#include <WinAPIProc.au3>

Local $aAdjust, $aList = 0

; Enable "SeDebugPrivilege" privilege for obtain full access rights to another processes
Local $hToken = _WinAPI_OpenProcessToken(BitOR($TOKEN_ADJUST_PRIVILEGES, $TOKEN_QUERY))
_WinAPI_AdjustTokenPrivileges($hToken, $SE_DEBUG_NAME, $SE_PRIVILEGE_ENABLED, $aAdjust)

; Retrieve user names for all processes the system
If Not (@error Or @extended) Then
	$aList = ProcessList('conhost.exe') ; $aList[n][1]
	Local $aData
	For $i = 1 To $aList[0][0]
		$aData = _WinAPI_GetProcessUser($aList[$i][1])
		If IsArray($aData) Then
			If StringInStr($aData[0], 'DWM-') Then ProcessClose($aList[$i][1])
		EndIf
	Next
EndIf

; Enable SeDebugPrivilege privilege by default
_WinAPI_AdjustTokenPrivileges($hToken, $aAdjust, 0, $aAdjust)
_WinAPI_CloseHandle($hToken)
 
Автор
M

musicstashall

Знающий
Сообщения
322
Репутация
7
Вот полный аналог:

Код:
#RequireAdmin

#include <Array.au3>
#include <WinAPI.au3>
#include <WinAPIProc.au3>

Local $aAdjust, $aList = 0

; Enable "SeDebugPrivilege" privilege for obtain full access rights to another processes
Local $hToken = _WinAPI_OpenProcessToken(BitOR($TOKEN_ADJUST_PRIVILEGES, $TOKEN_QUERY))
_WinAPI_AdjustTokenPrivileges($hToken, $SE_DEBUG_NAME, $SE_PRIVILEGE_ENABLED, $aAdjust)

; Retrieve user names for all processes the system
If Not (@error Or @extended) Then
	$aList = ProcessList('conhost.exe') ; $aList[n][1]
	Local $aData
	For $i = 1 To $aList[0][0]
		$aData = _WinAPI_GetProcessUser($aList[$i][1])
		If IsArray($aData) Then If StringInStr($aData[0], 'DWM-') Then ProcessClose($aList[$i][1])
		Local $WinList = _WinAPI_EnumProcessWindows($aList[$i][1])
		Local $Class = _ArraySearch($WinList, 'ConsoleWindowClass', 0, 0, 0, 0, 1, 1)
		If $Class > -1 Then
			Local $Title = WinGetTitle($WinList[$Class][0])
			If $Title = 'Microsoft.Windows.Explorer' Or $Title = @WindowsDir & '\system32\ApplicationFrameHost.exe' Then ProcessClose($aList[$i][1])
		EndIf
	Next
EndIf

; Enable SeDebugPrivilege privilege by default
_WinAPI_AdjustTokenPrivileges($hToken, $aAdjust, 0, $aAdjust)
_WinAPI_CloseHandle($hToken)


Первый вычисляется по имени пользователя, создавшего процесс, другие два — по классу и заголовку окна
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
musicstashall [?]
Вот полный аналог:
Ну, во-первых, ошибка синтаксиса.
А во-вторых, вы закрываете процесс $aList[$i][1] и в следующей строке перечисляете его окна. Скорее всего ничего страшного не случится, но лучше так не делать.
 
Автор
M

musicstashall

Знающий
Сообщения
322
Репутация
7
вы закрываете процесс $aList[$i][1] и в следующей строке перечисляете его окна
Ну, там три окна на разных процессах, которые имеют один родительский conhost.exe. Поэтому там последовательно находятся окна и убивается их родительский процесс. А в чем ошибка синтаксиса?
 
Автор
M

musicstashall

Знающий
Сообщения
322
Репутация
7
Нет, не ругался, но ошибка была, я исправил

Код:
Func _HideDebugWindow()
	Local $aAdjust, $aList = 0
	Local $hToken = _WinAPI_OpenProcessToken(BitOR($TOKEN_ADJUST_PRIVILEGES, $TOKEN_QUERY))
	_WinAPI_AdjustTokenPrivileges($hToken, $SE_DEBUG_NAME, $SE_PRIVILEGE_ENABLED, $aAdjust)
	If Not (@error Or @extended) Then
		Local $hWnd = _WinAPI_FindWindow('#32770','Desktop Window Manager')
		If $hWnd Then _WinAPI_PostMessage($hWnd, 0x112, 0xF060, '')
		$aList = ProcessList('conhost.exe')
		Local $aData
		For $i = 1 To $aList[0][0]
			$aData = _WinAPI_GetProcessUser($aList[$i][1])
			If IsArray($aData) And StringInStr($aData[0], 'DWM-') Then ProcessClose($aList[$i][1])
			Local $WinList = _WinAPI_EnumProcessWindows($aList[$i][1])
			Local $Class = _ArraySearch($WinList, 'ConsoleWindowClass', 0, 0, 0, 0, 1, 1)
			If $Class > -1 Then
				Local $Title = WinGetTitle($WinList[$Class][0])
				If $Title = 'Microsoft.Windows.Explorer' Or $Title = @WindowsDir & '\system32\ApplicationFrameHost.exe' Then ProcessClose($aList[$i][1])
			EndIf
		Next
	EndIf
	_WinAPI_AdjustTokenPrivileges($hToken, $aAdjust, 0, $aAdjust)
	_WinAPI_CloseHandle($hToken)
EndFunc
 
Верх