Кнопка вызова "Свойства - Безопасность" объекта под курсором

Обсуждение вопросов автоматизации Total Commander с помощью сторонних программ и скриптовых технологий.

Модераторы: Avada, CaptainFlint, Nik, d-view, Моторокер

HA3APET
Сообщения: 151
Зарегистрирован: Пн фев 22, 2010 05:43

Кнопка вызова "Свойства - Безопасность" объекта под курсором

Сообщение HA3APET »

Здравствуйте, хотелось бы кнопочку по вызову диалога "Свойства" объекта под курсором и что бы сразу открывалась закладка "Безопасность".

Затем я совмещу эту кнопку с командой cm_EditPersmissionInfo\cm_EditPermissionInfo, что бы на Win2000\XP у нас выполнялась эта команда, а на Win выше открывалась вкладка "Безопасность"

Есть идеи как сделать эту кнопку?

Исправлена опечатка - безопастность.
Моторокер.
Аватара пользователя
Avada
Сообщения: 10541
Зарегистрирован: Пт авг 01, 2008 16:17
Откуда: Россия, Саратов

Сообщение Avada »

HA3APET
Идея одна — просить Гислера, чтобы на ОС выше XP по нужной NTFS-команде сразу выполнялось открытие именно того, что позволяет система. Чтобы соответствующая группа cm-команд начиная с Висты опять какую-то пользу приносила. Альтернативы, ИМХО, слишком громоздки и, по большому счёту, могут быть интересны только для сборок.
Даже самая богатая фантазия
Не представит себе наши безобразия.
Аватара пользователя
MVV
Сообщения: 4815
Зарегистрирован: Чт окт 15, 2009 10:58
Откуда: Ростов-Дон

Сообщение MVV »

Мысль хорошая. Собственно, вот.
Аватара пользователя
Avada
Сообщения: 10541
Зарегистрирован: Пт авг 01, 2008 16:17
Откуда: Россия, Саратов

Сообщение Avada »

MVV
OK. Только лучше было дать предложение по всем трём командам этой группы: cm_EditPermissionInfo, cm_EditAuditInfo и cm_EditOwnerInfo.
Даже самая богатая фантазия
Не представит себе наши безобразия.
HA3APET
Сообщения: 151
Зарегистрирован: Пн фев 22, 2010 05:43

Сообщение HA3APET »

ghisler(Author) писал(а):To my knowledge, there is no function to activate the correct tab automatically.
Видимо я захотел невозможного.
Может наши гуру по скриптам смогут это осуществить...

Есть reg-файл добавляющий в контекстное меню объектов команду, которая делает Владельцем текущего пользователя.

Код: Выделить всё

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\*\shell\runas]
@="Take Ownership"
"NoWorkingDirectory"=""

[HKEY_CLASSES_ROOT\*\shell\runas\command]
@="cmd.exe /c takeown /f "%1" && icacls "%1" /grant administrators:F"
"IsolatedCommand"="cmd.exe /c takeown /f "%1" && icacls "%1" /grant administrators:F"

[HKEY_CLASSES_ROOT\Directory\shell\runas]
@="Take Ownership"
"NoWorkingDirectory"=""

[HKEY_CLASSES_ROOT\Directory\shell\runas\command]
@="cmd.exe /c takeown /f "%1" /r /d y && icacls "%1" /grant administrators:F /t"
"IsolatedCommand"="cmd.exe /c takeown /f "%1" /r /d y && icacls "%1" /grant administrators:F /t"
Возможно ли сделать кнопку с такой же функцией для выделенного под курсором объекта? Это и будет наша замена для cm_EditOwnerInfo
Последний раз редактировалось HA3APET Пн авг 09, 2010 20:38, всего редактировалось 1 раз.
Аватара пользователя
Avada
Сообщения: 10541
Зарегистрирован: Пт авг 01, 2008 16:17
Откуда: Россия, Саратов

Сообщение Avada »

Кстати, Гислер не вполне прав. Точнее, прав он, например, в том смысле, что для разных объектов вкладка "Безопасность" может занимать разное место в общем ряду, а при определённых системных настройках — вовсе отсутствовать. Однако же при запуске в Висте/7 одной из трёх NTFS-команд лучше, если даже она просто откроет системное окно свойств на основной вкладке, чем не будет делать ничего.
Даже самая богатая фантазия
Не представит себе наши безобразия.
Аватара пользователя
MVV
Сообщения: 4815
Зарегистрирован: Чт окт 15, 2009 10:58
Откуда: Ростов-Дон

Сообщение MVV »

HA3APET, позаменяй "%1" на %P%N - и будет работать.

Код: Выделить всё

cmd.exe /c takeown /f %P%N && icacls %P%N /grant administrators:F

Код: Выделить всё

cmd.exe /c takeown /f %P%N /r /d y && icacls %P%N /grant administrators:F /t
Разумеется, если у тебя есть утилиты/команды takeown и icacls.

Уточню, эти команды делают владельцем не текущего пользователя, а группу администраторов.
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

HA3APET
В принципе Гислер прав, нет никакой возможности однозначно определить расположение нужной вкладки на разных языках.
Однако, если остановиться на каком-нибудь одном языке, можно пройти по всем вкладкам, получить их заголовки и перейти на нужную.

Скрипт ниже (разумеется, Autoit) это и делает для русского языка. Довольно развесистый, что связано со сложностью получения заголовка таба в другом процессе. Требует модуль Memory.au3, который входит в стандартный дистрибутив Autoit.

При запуске в Vista/7 открывает диалог свойств и переходит на нужную закладку, в других ОС - вызывает стандарную функцию тотала.

Код: Выделить всё

#include <Memory.au3>

Global $hWnd = _TCHGetActiveInstance()

Global Const $cm_Properties=1003
Global Const $cm_EditPermissionInfo=2200
Global Const $TC_SENDMESSAGE = 0x400 + 51
Global Const $TCM_FIRST = 0x1300
Global Const $TCM_GETITEMW = ($TCM_FIRST + 60)
Global Const $TCM_GETITEMCOUNT = ($TCM_FIRST + 4)
Global Const $TCIF_TEXT = 0x1

If Not ((@OSVersion = "WIN_7") Or (@OSVersion = "WIN_VISTA")) Then
    __TCHSendMessage($hWnd, $TC_SENDMESSAGE, $cm_EditPermissionInfo)
    Exit
EndIf

__TCHSendMessage($hWnd, $TC_SENDMESSAGE, $cm_Properties)

$WinWnd = WinWait("Свойства:", "", 5)
$TabWnd = ControlGetHandle($WinWnd, "", "SysTabControl321")

$nCount = __TCHSendMessage($TabWnd, $TCM_GETITEMCOUNT, 0, 0)
For $i = 0 To $nCount-1
    $sText = _TabGetItemText($TabWnd, $i)
    If $sText = "Безопасность" Then
        For $j =  0 To $i - 1
            ControlCommand($WinWnd, "", $TabWnd, "TabRight", "")
        Next
        Exit
    EndIf
Next

; Вспомогательные функции

Func __TCHSendMessage($hWnd, $nMsg, $wParam = 0, $lParam = 0)
    Local $aResult = DllCall("user32.dll", "int", "SendMessage", "hwnd", $hWnd, "int", $nMsg, "wparam", $wParam, "lparam", $lParam)
	If @error Then Return SetError(@error, @extended, "")
	Return $aResult[0]
EndFunc
 
Func _TCHGetActiveInstance()
    Local $aList = WinList("[CLASS:TTOTAL_CMD]")
    For $i = 1 To $aList[0][0]
        If WinActive($aList[$i][1]) Then Return $aList[$i][1]
    Next
    Return 0
EndFunc

Func _TabGetItemText($hWnd, $iIndex)
    Local $iBuffer = 1024, $iMaxPtrSize = 8
    Local $tItem = DllStructCreate("uint Mask;dword State;dword StateMask;ptr Text;int TextMax;int Image;lparam Param")
    Local $pItem = DllStructGetPtr($tItem)
    Local $iItem = DllStructGetSize($tItem)

    DllStructSetData($tItem, "Mask", $TCIF_TEXT)
    DllStructSetData($tItem, "TextMax", $iBuffer)

    Local $tBuffer = DllStructCreate("wchar Text[" & $iBuffer & "]")
    Local $pBuffer = DllStructGetPtr($tBuffer)

    Local $tMemMap
    Local $pMemory = _MemInit($hWnd, $iItem + $iBuffer * 2 + $iMaxPtrSize, $tMemMap)
    Local $pText = $pMemory + $iItem + $iMaxPtrSize

    DllStructSetData($tItem, "Text", $pText)
    
    _MemWrite($tMemMap, $pItem, $pMemory, $iItem)
    
    Local $iRet = __TCHSendMessage($hWnd, $TCM_GETITEMW, $iIndex, $pMemory)

    _MemRead($tMemMap, $pText, $pBuffer, $iBuffer)
    _MemFree($tMemMap)
    Return DllStructGetData($tBuffer, "Text")
EndFunc
HA3APET
Сообщения: 151
Зарегистрирован: Пн фев 22, 2010 05:43

Сообщение HA3APET »

Loopback
Ещё проблема в том, что некоторые программы вносят свою вкладку в свойства.
Спасибо за скрипт, буду пробовать.
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

HA3APET писал(а):Ещё проблема в том, что некоторые программы вносят свою вкладку в свойства.
Скрипт это учитывает, поскольку определяет закладку по заголовку.
HA3APET
Сообщения: 151
Зарегистрирован: Пн фев 22, 2010 05:43

Сообщение HA3APET »

Loopback
Спасибо, всё работает. Не понял фразу - "Требует модуль Memory.au3"
Я переконвертировал ваш скрипт в exe, жаль только очень большой по размеру получился 600Kb в несжатом виде.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

HA3APET писал(а):Не понял фразу - "Требует модуль Memory.au3"
Этот файл должен быть в папке include для правильной работы скрипта. >>
Loopback писал(а):

Код: Выделить всё

#include <Memory.au3>
HA3APET
Сообщения: 151
Зарегистрирован: Пн фев 22, 2010 05:43

Сообщение HA3APET »

Flasher
А папка где должна быть тогда?
У меня всё чётко работает... просто сделал из приведённого выше скрипта exe-файл.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

HA3APET писал(а):А папка где должна быть тогда?
<PATH>\Autoit\Include\Memory.au3
HA3APET писал(а):просто сделал из приведённого выше скрипта exe-файл
Ну да, и пожаловался на размер. :wink: Любая конвертация в exe-шник(хоть из vbs, хоть из cmd/bat, и из au3 в данном случае) получает размер конечного файла в десятки и сотни раз больший в сравнении с исходным.
Ответить