Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Zone.Identifier (Альтернативные потоки NTFS) (http://forum.oszone.net/showthread.php?t=341800)

nugzari 14-08-2019 09:51 2883958

Zone.Identifier (Альтернативные потоки NTFS)
 
здравствуйте уважаемые участники форума! Мне нужна ваша помощь. Решил добавить в контекстное меню папки команду Streams для отображения и удаления Zone.Identifier (Альтернативные потоки NTFS). Вручную не очень удобно к тому же он у тех файлов которых я скопировал с HDD друга(у меня отключено Zone.Identifier)

Например хочу посмотреть какие файлы в папке имеет Альтернативные потоки NTFS :

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Directory\shell\Streams]

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Directory\shell\Streams\command]
@="cmd /k streams64.exe -s \"C:\\Users\\Admin\\Downloads\""


\"C:\\Users\\Admin\\Downloads\"" как же сделать так чтобы вместе этого адреса чтоб был текущий каталог с контекстного меню которого вызвал эту команду

Спасибо заранее!

Elven 14-08-2019 12:10 2883975

вроде %V но не уверен точно. т.е. выглядеть будет примерно так:
Код:

@="cmd /k streams64.exe -s \"%V\""

YuS_2 14-08-2019 13:28 2883996

Цитата:

Цитата nugzari
Мне нужна ваша помощь. Решил добавить в контекстное меню папки команду Streams для отображения и удаления Zone.Identifier (Альтернативные потоки NTFS). Вручную не очень удобно к тому же он у тех файлов которых я скопировал с HDD друга(у меня отключено Zone.Identifier) »

Самый простой способ, создать раздел FAT32 и использовать его как буфер... никаких альтпотоков не останется.
Если, всё же, нет желания удалять ADS, то можно вместо сторонних программ, воспользоваться встроенным powershell+cmd:
Скрипт для получения ADS имен файлов и каталогов
Код:

<#
        .SYNOPSIS
                Отображение альтернативных потоков файлов и каталогов

        .Description
                Скрипт предназначен для получения имен альтернативных потоков файлов и каталогов.
                Присваиваются отдельные идентификаторы для элементов и их альт. потоков,
                а также размер.

        .Parameter Elements
                Обязательный: Необходимо указать путь к каталогу, либо к отдельному файлу.
                Указанный каталог в выборку не включается, содержимым будут подкаталоги и файлы,
                находящиеся в этом каталоге. При рекурсии это поведение не изменится.

        .Parameter Root
                Переключатель: Используется для дополнительного включения в выборку
                указанного(ых), корневого(ых) каталога(ов)
       
        .Parameter Attributes
                Необязательный: Получает файлы и папки с указанными атрибутами. Этот параметр
                поддерживает все атрибуты и позволяет указывать сложные комбинации атрибутов.
                Соответствует параметру Attributes командлета Get-Childitem.

        .Parameter Hidden
                Переключатель: Для выбора файлов или каталогов с атрибутом Hidden

        .Parameter ReadOnly
                Переключатель: Для выбора файлов или каталогов с атрибутом ReadOnly

        .Parameter System
                Переключатель: Для выбора файлов или каталогов с атрибутом System

        .Parameter Force
                Переключатель: Для выбора всех файлов или каталогов с любым атрибутом

        .Parameter Recurse
                Переключатель: Для рекурсивного выбора файлов или каталогов

        .Example
                .\script.ps1 'd:\TEST' -force -rec|ogv

                Это пример рекурсивной выборки всех файлов и каталогов, с любым атрибутом,
                из корневого каталога d:\TEST и вывода результата в таблицу out-gridview

        .Example
                .\script.ps1 . -attr D+H,S -rec|ft

                Это пример рекурсивной выборки только каталогов с атрибутом Hidden или же
                выборки файлов и каталогов с атрибутом System из корневого каталога d:\TEST
                и вывода результата в таблицу out-gridview
               
        .Notes
                Created By YuS

                Version: 1.00
                Date: 11/03/2019
                Purpose/Change:        Первая версия
                Version: 1.01
                Date: 11/03/2019
                Purpose/Change:        Добавлен параметр -Root
                Version: 1.02
                Date: 14/03/2019
                Purpose/Change:        Добавлен параметр -Attributes для более гибкого отбора

        .Link
                <здесь была ссылка на форум, где скрипт опубликован ранее>
               
  #>

[CmdletBinding()] Param (
        [parameter(Mandatory=$true)]
        [string[]]$elements,[switch]$hidden,[switch]$readonly,$attributes,
        [switch]$system,[switch]$force,[switch]$recurse,[switch]$root
)

function testpth {[CmdletBinding()] Param (
                [parameter(Mandatory=$true)]
                [string[]]$elem,$attr,[switch]$hid,[switch]$read,
                [switch]$sys,[switch]$for,[switch]$rec
        )
        $dpar = @{};$dpar.literalpath = $elem;if ($attr){$dpar.attributes = $attr}
        if ($hid){$dpar.hidden = $true};if ($read){$dpar.readonly = $true}
        if ($for){$dpar.force = $true};if ($rec){$dpar.recurse = $true}
        if ($sys){$dpar.system = $true}
       
        if(test-path $elem -pathtype container){
                if($root){gi -lit $elem -force}
                dir @dpar
        } elseif (test-path $elem -pathtype leaf){
                gi -lit $elem -force
        } else {
                write-host Path no correct -for red
                sleep -s 5
                break
        }
}

function testitem($x){
        if(test-path $x.fullname -patht container){
                $fld = $x.fullname
                ((cmd /c "dir /ad/r ""$fld""").trim()|
                sls -patt '\d+ +\.:[^:]+:\$data').line|%{if(($a = $_ -split ':')[-2]){
                                new-object psobject -prop @{
                                        Stream = $a[-2]; Length = [int]$($a[0] `
                                        -replace '^(\d+)*?(\d*)[^\n]*','$1$2')
                                }
                        }
                }
        } elseif (test-path $x.fullname -patht leaf){
                gi -lit $x.fullname -stream *|? stream -ne ':$data'
        }
}

function get-namestream ($item){
        [array]$arr = testitem $item
        for ($i=0;$i -lt $arr.count;$i++){
                [pscustomobject]@{
                        'IDItem' = $script:k
                        'IDStream' = $i
                        'NameStream' = $arr[$i].stream
                        'Size' = $arr[$i].length
                        'Container' = if ($item.psiscontainer){$true}else{$false}
                        'Path' = $item.fullname
                }
        };if ($arr){$script:k++}
}
$k=0
$tpar=@{}; $tpar.elem = $elements;if($attributes){$tpar.attr = $attributes}
if ($hidden){$tpar.hid = $hidden};if ($readonly){$tpar.read = $readonly}
if ($force){$tpar.for = $force};if ($recurse){$tpar.rec = $recurse}
if ($system){$tpar.sys = $system}

$p = testpth @tpar|%{get-namestream $_} |group -prop iditem -ashash -asstr
0..($p.count)|%{$p."$_"}


В итоге, получим примерно такую картинку:
картинка

Использовать можно как для просмотра, так и для удаления...

ЗЫ Сразу отвечу на вопрос, который, вероятно, возникнет: "зачем +cmd?" Затем, что, увы, powershell не выводит альтернативные потоки каталогов...

Iska 14-08-2019 14:40 2884008

Цитата:

Цитата YuS_2
…альтернативные потоки каталогов... »

Которые ещё нужно поискать :).


Если же говорить о практике использования — смотреть особого смысла нет, достаточно тупо исполнять удаление альтернативного потока данных Zone.Identifier (именно одного этого потока, а не всех подряд). Такой я для себя сделал вывод, когда реализовывал аналогичное под Far Manager'ом.

alpap 14-08-2019 15:24 2884018

nugzari,
bat такой
Код:

@echo off
"streams64.exe" -s
pause

reg такой
Код:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Directory\Background\shell\Altern_potok]
"MUIVerb"="Альтерн. поток"
"Icon"="SHELL32.dll,296"

[HKEY_CLASSES_ROOT\Directory\Background\shell\Altern_potok\command]
@="\"C:\\Bat\\Altern_potok.bat\""

собственно все есть в архиве: Altern_potok
там есть и фото - доказательство того что все работает для открытой папки из которой идет запуск соотв. пункта конт. меню.

YuS_2 14-08-2019 17:52 2884038

Цитата:

Цитата Iska
Которые ещё нужно поискать »

о том и речь. powershell, почему-то не посчитали нужным научить, а cmd умеет... непонятно, что за даунгрейд...

Цитата:

Цитата Iska
Если же говорить о практике использования — смотреть особого смысла нет »

да как сказать...
Например, что это:

? размер - одно число, на диске другое...
Про вирусы и прочие червяки, которые могут прятаться таким образом и так понятно.
А смотреть - всегда полезно, прежде чем, что-то удалять и уничтожать...

Iska 14-08-2019 18:49 2884040

Цитата:

Цитата YuS_2
о том и речь. »

YuS_2, не, я в том смысле, что мне лично ни разу каталоги с ADS не попадались. Тем более с ADS Zone.Identifier.

Цитата:

Цитата YuS_2
? размер - одно число, на диске другое... »

Так тут просто разница по кластерам показывается. Не?

YuS_2 14-08-2019 19:58 2884048

Цитата:

Цитата Iska
не, я в том смысле, что мне лично ни разу каталоги с ADS не попадались. »

Если ADS может существовать у каталога, а это вполне допустимо, то и необходимость его получения/просмотра очевидна.

Цитата:

Цитата Iska
Так тут просто разница по кластерам показывается. Не? »

А, да... что-то я не то ляпнул. Размер ADS обычными средствами увидеть не получится...
Но, тем не менее, если данные в ADS присутствуют, то они могут быть либо нужными, либо нейтральными, либо вредными. А чтобы такие данные получить или удалить, их сначала необходимо найти, в том числе и в каталогах.

Iska 15-08-2019 00:18 2884064

Цитата:

Цитата YuS_2
А смотреть - всегда полезно, прежде чем, что-то удалять и уничтожать... »

Ну, не знаю… Вот именно из своей практики использования — не смотрю. Тупо пытаюсь удалять искомый поток Zone.Identifier с текущего или выделенных файлов панели:
Скрытый текст
Код:

local FILE_ATTRIBUTE_DIRECTORY = 0x00000010

if APanel.Visible then                                                                                                              -- Активная панель видима?
        if APanel.FilePanel and APanel.Type == 0 then                                                                                  -- Активная панель файловая?
                if APanel.Selected then                                                                                                    -- Активная панель содержит выделенные элементы?
                        for i = 1, APanel.ItemCount do                                                                                          -- Перебираем все элементы активной панели
                                if Panel.Item(0, i, 8) then                                                                                        -- i-тый элемент активной панели выделен?
                                        if bit64.band(Panel.FAttr(0, Panel.Item(0, i, 0)), FILE_ATTRIBUTE_DIRECTORY) ~= FILE_ATTRIBUTE_DIRECTORY then  -- i-тый элемент не папка?
                                                win.DeleteFile(APanel.UNCPath .. "\\" .. Panel.Item(0, i, 0) .. ":Zone.Identifier")
                                        end

                                        Panel.Select(0, 0, 1, i)
                                end
                        end
                else
                        win.DeleteFile(APanel.UNCPath .. "\\" .. APanel.Current .. ":Zone.Identifier")
                end
        else
                mf.msgbox("Не файловая панель", "Активная панель не файловая", 0x00010001)
        end
else
        mf.msgbox("Нет видимых панелей", "Нет видимых панелей", 0x00010001)
end


Я не к тому, что смотреть совсем не надо. Просто лично у меня концепция «сначала посмотри, есть ли поток Zone.Identifier, потом удали его» в практическом использовании достаточно быстро выродилась в «просто удали поток Zone.Identifier», потому как это быстрее, а конечный результат тот же :).

YuS_2 15-08-2019 07:44 2884087

Цитата:

Цитата Iska
Просто лично у меня концепция «сначала посмотри, есть ли поток Zone.Identifier, потом удали его» в практическом использовании достаточно быстро выродилась в «просто удали поток Zone.Identifier», потому как это быстрее, а конечный результат тот же »

Если неглядя:
Цитата:

Цитата YuS_2
Самый простой способ, создать раздел FAT32 и использовать его как буфер... никаких альтпотоков не останется. »

Это если файлы получены из ненадежного источника, либо если заведомо требуется удалить все скрытые потоки...
А если сам что-то спрятал (причины можно даже не рассматривать), но в каком из файлов/каталогов - любимый склероз поет пестню... что делать? Ведь они скрыты, те потоки и увидеть их стандартными способами - никак. :)

Кроме того: чтобы удалить, что-нибудь ненужное, нужно сначала получить что-нибудь ненужное...
Это в том смысле, что не станем же мы, при необходимости удаления этого Zone.Identifier, удалять во всех подряд файлах и каталогах, ибо в таком случае, вот это:
Цитата:

Цитата Iska
потому как это быстрее »

не будет соответствовать действительности. Или я ошибаюсь?

Iska 15-08-2019 09:34 2884101

Цитата:

Цитата YuS_2
Это в том смысле, что не станем же мы, при необходимости удаления этого Zone.Identifier, удалять во всех подряд файлах и каталогах, »

Вот я именно так и делаю. Токмо не во всех подряд, а в выделенных файлах.

Цитата:

Цитата YuS_2
ибо в таком случае, вот это:
Цитата:

потому как это быстрее
не будет соответствовать действительности. Или я ошибаюсь? »

Всё равно это быстрее, нежели «посмотреть, выделить из них только те, где есть ADS Zone.Identifier, удалить ADS Zone.Identifier». На практике у меня чаще всего процесс удаления выглядит так: Ctrl-*, F2, Z :). Разумеется, здесь не идёт речь про «прошерстить все полмиллиона файлов и каталогов раздела на предмет удаления ADS». Как правило, это содержимое каталога/группы каталогов, либо отдельные конкретные файл/файлы с удалением только одного конкретного ADS Zone.Identifier. Сейчас вот проверил навскидку — удаление ADS Zone.Identifier на примерно пяти тысячах файлов заняло у меня около двух секунд.

Так-то средства для просмотра ADS в Far Manager'е есть в виде плагина NTFS File Information.

YuS_2 15-08-2019 12:36 2884145

Цитата:

Цитата Iska
Всё равно это быстрее, нежели «посмотреть, выделить из них только те, где есть ADS Zone.Identifier, удалить ADS Zone.Identifier». »

Посмотреть - это условность... если имя потока заранее известно, то смотреть необязательно. Тут речь об универсальности больше...
Например, есть каталог в котором всего 2356 файлов, общим размером 1,1 Гб. Мы не знаем какие есть потоки в файлах и каталогах, но найти их требуется - как будет выглядеть код в Far?
Мой скрипт работает так:
Код:

.\script.ps1 . -force -rec|ogv
картинка

Далее, нам надо удалить подозрительный поток "c.exe", ибо такого быть не должно:
картинка

Ну и естественно, проверяем:
картинка

Всё. Секундомер присутствует, легко проверить на любом другом наборе файлов.
Не такие уж и большие затраты времени. Львиная доля из этого времени приходится на CMD, т.к., (повторюсь) увы, powershell не научен извлекать альтпотоки из каталогов.

Цитата:

Цитата Iska
Так-то средства для просмотра ADS в Far Manager'е есть в виде плагина NTFS File Information. »

Вообще, Far - стороннее средство, которое необходимо добавлять в систему, а потом ещё и разбираться с ним, как он работает... хотя, конечно, изучение работы, это то, что касается любого инструмента.

Iska 15-08-2019 14:08 2884176

Цитата:

Цитата YuS_2
Посмотреть - это условность... если имя потока заранее известно, то смотреть необязательно. »

Я токмо про это!

Цитата:

Цитата YuS_2
Мы не знаем какие есть потоки в файлах и каталогах, но найти их требуется - как будет выглядеть код в Far? »

А хрен его знает. Я давно уже не программист, тем более на Lua :lol:.

Отобразить количество потоков файла на панели можно модификатором F:
Цитата:

F - количество потоков
Скрытый текст

а смотреть можно уже через вышеупомянутый NTFS File Information:
Скрытый текст


Под x64 готовых плагинов, так, чтобы работать в панели с потоками, как с контейнером (наподобие того, как открываются архивы или compound-файлы), нынче нет (раньше был NTFS File Streams от разработчика 7-Zip, под 1.x и x86:
Скрытый текст

у меня же нынче 3.x и x64). Теоретически, нет каких-то технических проблем написать аналог того плагина непосредственно на Lua, но… см. абзацем выше.

Цитата:

Цитата YuS_2
Не такие уж и большие затраты времени. »

Не, я про другие затраты времени, не машинные — именно на просмотр и поиск «глазками». Именно потому я и счёл, что мне удобнее, быстрее и проще будет тупо «пробежаться» удалением одного искомого потока по выделенному файлу/списку.

P.S. Внезапно для себя выяснил, что Far Manager с некоторых пор уже умеет отображать не только размер основного потока, но и «занимаемое место на диске», и общий размер всех потоков файла:
Скрытый текст
Код:

╔════════════════════════════════════════════════════════════════════════════════════ Помощь - Far ════════════════════════════════════════════════════════════════════════════════════╗
║ Настройка режимов просмотра панели файлов                                                                                                                                            ║
╟──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╢
║ показан в одной полосе.                                                                                                                                                              ▲
║                                                                                                                                                                                      ░
║    Допускаются следующие типы колонок:                                                                                                                                              ░
║                                                                                                                                                                                      ░
║    N[M[D],O,R[F],N] - имя файла                                                                                                                                                      █
║                где: M - показывать символы пометки где: D - динамические символы пометки;                                                                                          █
║                      O - показывать имена без путей (предназначено в основном для плагинов);                                                                                        █
║                      R - выравнивать не умещающиеся имена по правому краю где: F - выравнивать все имена по правому краю;                                                            █
║                      N - не отображать расширения файлов;                                                                                                                            █
║                Эти символы можно комбинировать, например NMR                                                                                                                        █
║                                                                                                                                                                                      █
║    X[R]      - расширение файла                                                                                                                                                    █
║                где: R - выравнивать по правому краю;                                                                                                                                █
║                                                                                                                                                                                      █
║    S[C,T,F,E] - размер файла                                                                                                                                                        █
║    P[C,T,F,E] - выделенный размер файла                                                                                                                                              ░
║    G[C,T,F,E] - размер потоков файла                                                                                                                                                ░
║                где: C - группировать цифры, используя символ из настроек Windows;                                                                                                  ░
║                      T - использовать десятичные единицы вместо двоичных, т.е., чтобы вычислить килобайты, размер будет делиться на 1000, а не на 1024; в этом режиме символ единиц  ░
║                          показывается строчными буквами, например, к, м, г вместо К, М, Г;                                                                                          ░
║                      F - показывать размер в виде десятичной дроби с не более чем тремя цифрами до запятой, например, 999 байт будут показаны как 999, а 1024 байт как 1.00 К;      ░
║                          заметьте, что поведение зависит от наличия модификатора T;                                                                                                  ░
║                      E - экономичный режим, не показывать пробел между размером и символом единиц, например, 1.00к;                                                                  ░


Цитата:

Цитата YuS_2
Вообще, Far - стороннее средство, которое необходимо добавлять в систему, а потом ещё и разбираться с ним, как он работает... »

Это да.

YuS_2 15-08-2019 15:26 2884196

Цитата:

Цитата Iska
Отобразить количество потоков файла на панели можно модификатором F: »

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

Цитата:

Цитата Iska
быстрее и проще будет тупо «пробежаться» удалением одного искомого потока по выделенному файлу/списку. »

это да, в случае известного имени файлового потока, непродуктивно его ещё и просто глазами искать, в этом нет смысла...

Цитата:

Цитата Iska
Внезапно для себя выяснил, что Far Manager с некоторых пор уже умеет отображать не только размер основного потока, но и «занимаемое место на диске», и общий размер всех потоков файла »

Думаю, что это должно быть стандартом для любого ФМ, не только для Far-а.


Время: 06:29.

Время: 06:29.
© OSzone.net 2001-