Войти

Показать полную графическую версию : Zone.Identifier (Альтернативные потоки NTFS)


nugzari
14-08-2019, 09:51
здравствуйте уважаемые участники форума! Мне нужна ваша помощь. Решил добавить в контекстное меню папки команду 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
вроде %V но не уверен точно. т.е. выглядеть будет примерно так:
@="cmd /k streams64.exe -s \"%V\""

YuS_2
14-08-2019, 13:28
Мне нужна ваша помощь. Решил добавить в контекстное меню папки команду Streams для отображения и удаления Zone.Identifier (Альтернативные потоки NTFS). Вручную не очень удобно к тому же он у тех файлов которых я скопировал с HDD друга(у меня отключено Zone.Identifier) »
Самый простой способ, создать раздел FAT32 и использовать его как буфер... никаких альтпотоков не останется.
Если, всё же, нет желания удалять ADS, то можно вместо сторонних программ, воспользоваться встроенным powershell+cmd:
<#
.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."$_"}
В итоге, получим примерно такую картинку:
http://ipic.su/img/img7/fs/Snimokekrana20190814161303.1565777612.png
Использовать можно как для просмотра, так и для удаления...

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

Iska
14-08-2019, 14:40
…альтернативные потоки каталогов... »
Которые ещё нужно поискать :).

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

alpap
14-08-2019, 15:24
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 (https://drive.google.com/open?id=1_gbodKN6onyXXYha0I8MGhsWhIycxNHu)
там есть и фото - доказательство того что все работает для открытой папки из которой идет запуск соотв. пункта конт. меню.

YuS_2
14-08-2019, 17:52
Которые ещё нужно поискать »
о том и речь. powershell, почему-то не посчитали нужным научить, а cmd умеет... непонятно, что за даунгрейд...

Если же говорить о практике использования — смотреть особого смысла нет »
да как сказать...
Например, что это:
http://ipic.su/img/img7/tn/Snimokekrana20190814204617.1565794056.png (http://ipic.su/img/img7/fs/Snimokekrana20190814204617.1565794056.png)
? размер - одно число, на диске другое...
Про вирусы и прочие червяки, которые могут прятаться таким образом и так понятно.
А смотреть - всегда полезно, прежде чем, что-то удалять и уничтожать...

Iska
14-08-2019, 18:49
о том и речь. »
YuS_2, не, я в том смысле, что мне лично ни разу каталоги с ADS не попадались. Тем более с ADS Zone.Identifier.

? размер - одно число, на диске другое... »
Так тут просто разница по кластерам показывается. Не?

YuS_2
14-08-2019, 19:58
не, я в том смысле, что мне лично ни разу каталоги с ADS не попадались. »
Если ADS может существовать у каталога, а это вполне допустимо, то и необходимость его получения/просмотра очевидна.

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

Iska
15-08-2019, 00:18
А смотреть - всегда полезно, прежде чем, что-то удалять и уничтожать... »
Ну, не знаю… Вот именно из своей практики использования — не смотрю. Тупо пытаюсь удалять искомый поток 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
Просто лично у меня концепция «сначала посмотри, есть ли поток Zone.Identifier, потом удали его» в практическом использовании достаточно быстро выродилась в «просто удали поток Zone.Identifier», потому как это быстрее, а конечный результат тот же »
Если неглядя:
Самый простой способ, создать раздел FAT32 и использовать его как буфер... никаких альтпотоков не останется. »
Это если файлы получены из ненадежного источника, либо если заведомо требуется удалить все скрытые потоки...
А если сам что-то спрятал (причины можно даже не рассматривать), но в каком из файлов/каталогов - любимый склероз поет пестню... что делать? Ведь они скрыты, те потоки и увидеть их стандартными способами - никак. :)

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

Iska
15-08-2019, 09:34
Это в том смысле, что не станем же мы, при необходимости удаления этого Zone.Identifier, удалять во всех подряд файлах и каталогах, »
Вот я именно так и делаю. Токмо не во всех подряд, а в выделенных файлах.

ибо в таком случае, вот это:
потому как это быстрее
не будет соответствовать действительности. Или я ошибаюсь? »
Всё равно это быстрее, нежели «посмотреть, выделить из них только те, где есть 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
Всё равно это быстрее, нежели «посмотреть, выделить из них только те, где есть ADS Zone.Identifier, удалить ADS Zone.Identifier». »
Посмотреть - это условность... если имя потока заранее известно, то смотреть необязательно. Тут речь об универсальности больше...
Например, есть каталог в котором всего 2356 файлов, общим размером 1,1 Гб. Мы не знаем какие есть потоки в файлах и каталогах, но найти их требуется - как будет выглядеть код в Far?
Мой скрипт работает так:
.\script.ps1 . -force -rec|ogv
https://jpegshare.net/images/ac/54/ac545f66ba20c9b48960f4c8ec6aaf58.png (https://jpegshare.net/)
Далее, нам надо удалить подозрительный поток "c.exe", ибо такого быть не должно:
https://jpegshare.net/images/2b/a9/2ba9f24e582ac13993d587f38e94a281.png (https://jpegshare.net/)
Ну и естественно, проверяем:
https://jpegshare.net/images/d1/57/d157136acf496d48ef54bc44067e37b7.png (https://jpegshare.net/)
Всё. Секундомер присутствует, легко проверить на любом другом наборе файлов.
Не такие уж и большие затраты времени. Львиная доля из этого времени приходится на CMD, т.к., (повторюсь) увы, powershell не научен извлекать альтпотоки из каталогов.

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

Iska
15-08-2019, 14:08
Посмотреть - это условность... если имя потока заранее известно, то смотреть необязательно. »
Я токмо про это!

Мы не знаем какие есть потоки в файлах и каталогах, но найти их требуется - как будет выглядеть код в Far? »
А хрен его знает. Я давно уже не программист, тем более на Lua :lol:.

Отобразить количество потоков файла на панели можно модификатором F:
F - количество потоков
https://i.imgur.com/yrShddc.png
а смотреть можно уже через вышеупомянутый NTFS File Information:
https://i.imgur.com/Hzq1y26.png

Под x64 готовых плагинов, так, чтобы работать в панели с потоками, как с контейнером (наподобие того, как открываются архивы или compound-файлы), нынче нет (раньше был NTFS File Streams (https://plugring.farmanager.com/plugin.php?pid=234&l=ru) от разработчика 7-Zip, под 1.x и x86:
https://i.imgur.com/acwMrIV.png
у меня же нынче 3.x и x64). Теоретически, нет каких-то технических проблем написать аналог того плагина непосредственно на Lua, но… см. абзацем выше.

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

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к; ░
Вообще, Far - стороннее средство, которое необходимо добавлять в систему, а потом ещё и разбираться с ним, как он работает... »
Это да.

YuS_2
15-08-2019, 15:26
Отобразить количество потоков файла на панели можно модификатором F: »
Верно на все сто, если уж назвался груздем, то в кузов придется лезть. В смысле, что любой файловый менеджер, должен уметь работать с теми файловыми системами, которые могут использоваться в качестве хранилища файлов...

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

Внезапно для себя выяснил, что Far Manager с некоторых пор уже умеет отображать не только размер основного потока, но и «занимаемое место на диске», и общий размер всех потоков файла »
Думаю, что это должно быть стандартом для любого ФМ, не только для Far-а.




© OSzone.net 2001-2012