Кнопка вызова "Свойства - Безопасность" объекта под курсором
Модераторы: Avada, CaptainFlint, Nik, d-view, Моторокер
Кнопка вызова "Свойства - Безопасность" объекта под курсором
Здравствуйте, хотелось бы кнопочку по вызову диалога "Свойства" объекта под курсором и что бы сразу открывалась закладка "Безопасность".
Затем я совмещу эту кнопку с командой cm_EditPersmissionInfo\cm_EditPermissionInfo, что бы на Win2000\XP у нас выполнялась эта команда, а на Win выше открывалась вкладка "Безопасность"
Есть идеи как сделать эту кнопку?
Исправлена опечатка - безопастность.
Моторокер.
Затем я совмещу эту кнопку с командой cm_EditPersmissionInfo\cm_EditPermissionInfo, что бы на Win2000\XP у нас выполнялась эта команда, а на Win выше открывалась вкладка "Безопасность"
Есть идеи как сделать эту кнопку?
Исправлена опечатка - безопастность.
Моторокер.
HA3APET
Идея одна — просить Гислера, чтобы на ОС выше XP по нужной NTFS-команде сразу выполнялось открытие именно того, что позволяет система. Чтобы соответствующая группа cm-команд начиная с Висты опять какую-то пользу приносила. Альтернативы, ИМХО, слишком громоздки и, по большому счёту, могут быть интересны только для сборок.
Идея одна — просить Гислера, чтобы на ОС выше XP по нужной NTFS-команде сразу выполнялось открытие именно того, что позволяет система. Чтобы соответствующая группа cm-команд начиная с Висты опять какую-то пользу приносила. Альтернативы, ИМХО, слишком громоздки и, по большому счёту, могут быть интересны только для сборок.
Даже самая богатая фантазия
Не представит себе наши безобразия.
Не представит себе наши безобразия.
Видимо я захотел невозможного.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"
Последний раз редактировалось HA3APET Пн авг 09, 2010 20:38, всего редактировалось 1 раз.
Кстати, Гислер не вполне прав. Точнее, прав он, например, в том смысле, что для разных объектов вкладка "Безопасность" может занимать разное место в общем ряду, а при определённых системных настройках — вовсе отсутствовать. Однако же при запуске в Висте/7 одной из трёх NTFS-команд лучше, если даже она просто откроет системное окно свойств на основной вкладке, чем не будет делать ничего.
Даже самая богатая фантазия
Не представит себе наши безобразия.
Не представит себе наши безобразия.
HA3APET, позаменяй "%1" на %P%N - и будет работать.
Разумеется, если у тебя есть утилиты/команды takeown и icacls.
Уточню, эти команды делают владельцем не текущего пользователя, а группу администраторов.
Код: Выделить всё
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Уточню, эти команды делают владельцем не текущего пользователя, а группу администраторов.
HA3APET
В принципе Гислер прав, нет никакой возможности однозначно определить расположение нужной вкладки на разных языках.
Однако, если остановиться на каком-нибудь одном языке, можно пройти по всем вкладкам, получить их заголовки и перейти на нужную.
Скрипт ниже (разумеется, Autoit) это и делает для русского языка. Довольно развесистый, что связано со сложностью получения заголовка таба в другом процессе. Требует модуль Memory.au3, который входит в стандартный дистрибутив Autoit.
При запуске в Vista/7 открывает диалог свойств и переходит на нужную закладку, в других ОС - вызывает стандарную функцию тотала.
В принципе Гислер прав, нет никакой возможности однозначно определить расположение нужной вкладки на разных языках.
Однако, если остановиться на каком-нибудь одном языке, можно пройти по всем вкладкам, получить их заголовки и перейти на нужную.
Скрипт ниже (разумеется, 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
Этот файл должен быть в папке include для правильной работы скрипта. >>HA3APET писал(а):Не понял фразу - "Требует модуль Memory.au3"
Loopback писал(а):Код: Выделить всё
#include <Memory.au3>
<PATH>\Autoit\Include\Memory.au3HA3APET писал(а):А папка где должна быть тогда?
Ну да, и пожаловался на размер.HA3APET писал(а):просто сделал из приведённого выше скрипта exe-файл