Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Zone.Identifier (Альтернативные потоки NTFS)

Ответить
Настройки темы
CMD/BAT - Zone.Identifier (Альтернативные потоки NTFS)

Аватара для nugzari

Новый участник


Сообщения: 12
Благодарности: 0

Профиль | Отправить PM | Цитировать


здравствуйте уважаемые участники форума! Мне нужна ваша помощь. Решил добавить в контекстное меню папки команду 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\"" как же сделать так чтобы вместе этого адреса чтоб был текущий каталог с контекстного меню которого вызвал эту команду

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

Отправлено: 09:51, 14-08-2019

 

Аватара для Elven

Ветеран


Сообщения: 814
Благодарности: 199

Профиль | Сайт | Отправить PM | Цитировать


вроде %V но не уверен точно. т.е. выглядеть будет примерно так:
Код: Выделить весь код
@="cmd /k streams64.exe -s \"%V\""

Отправлено: 12:10, 14-08-2019 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для YuS_2

Старожил


Сообщения: 488
Благодарности: 202

Профиль | Отправить PM | Цитировать


Цитата 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 не выводит альтернативные потоки каталогов...

-------
scio me nihil scire


Отправлено: 13:28, 14-08-2019 | #3


Ветеран


Contributor


Сообщения: 24805
Благодарности: 7211

Профиль | Отправить PM | Цитировать


Цитата YuS_2:
…альтернативные потоки каталогов... »
Которые ещё нужно поискать .


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

Отправлено: 14:40, 14-08-2019 | #4


Ветеран


Сообщения: 894
Благодарности: 338

Профиль | Отправить PM | Цитировать


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
там есть и фото - доказательство того что все работает для открытой папки из которой идет запуск соотв. пункта конт. меню.
Это сообщение посчитали полезным следующие участники:

Отправлено: 15:24, 14-08-2019 | #5


Аватара для YuS_2

Старожил


Сообщения: 488
Благодарности: 202

Профиль | Отправить PM | Цитировать


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

Цитата Iska:
Если же говорить о практике использования — смотреть особого смысла нет »
да как сказать...
Например, что это:

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

-------
scio me nihil scire


Отправлено: 17:52, 14-08-2019 | #6


Ветеран


Contributor


Сообщения: 24805
Благодарности: 7211

Профиль | Отправить PM | Цитировать


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

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

Отправлено: 18:49, 14-08-2019 | #7


Аватара для YuS_2

Старожил


Сообщения: 488
Благодарности: 202

Профиль | Отправить PM | Цитировать


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

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

-------
scio me nihil scire


Последний раз редактировалось YuS_2, 14-08-2019 в 20:44.


Отправлено: 19:58, 14-08-2019 | #8


Ветеран


Contributor


Сообщения: 24805
Благодарности: 7211

Профиль | Отправить PM | Цитировать


Цитата 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», потому как это быстрее, а конечный результат тот же .

Отправлено: 00:18, 15-08-2019 | #9


Аватара для YuS_2

Старожил


Сообщения: 488
Благодарности: 202

Профиль | Отправить PM | Цитировать


Цитата Iska:
Просто лично у меня концепция «сначала посмотри, есть ли поток Zone.Identifier, потом удали его» в практическом использовании достаточно быстро выродилась в «просто удали поток Zone.Identifier», потому как это быстрее, а конечный результат тот же »
Если неглядя:
Цитата YuS_2:
Самый простой способ, создать раздел FAT32 и использовать его как буфер... никаких альтпотоков не останется. »
Это если файлы получены из ненадежного источника, либо если заведомо требуется удалить все скрытые потоки...
А если сам что-то спрятал (причины можно даже не рассматривать), но в каком из файлов/каталогов - любимый склероз поет пестню... что делать? Ведь они скрыты, те потоки и увидеть их стандартными способами - никак.

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

-------
scio me nihil scire


Последний раз редактировалось YuS_2, 15-08-2019 в 07:52.


Отправлено: 07:44, 15-08-2019 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Zone.Identifier (Альтернативные потоки NTFS)

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Альтернативные потоки NTFS — удаление Zone.Identifier Anonymоus Скриптовые языки администрирования Windows 6 09-04-2019 19:21
Утилиты - [addon] Unknown Device Identifier Habetdin Наборы обновлений для Windows XP/2003/Windows 7 10 21-06-2012 12:47
Unknown Device Identifier 7.00 OSZone Software Новости программного обеспечения 0 06-12-2009 17:07
Ошибка Unknown Device Identifier truvo Хочу все знать 6 28-12-2008 23:29
Delphi - Delphi7, потоки mahsus Программирование и базы данных 1 19-10-2004 16:46




 
Переход