Как читать вывод "fsutil usn readjournal C:"

529
Noctis Skytower

Существует утилита, которая может быть запущена в командной строке Microsoft Windows, которая называется fsutil. Одной из команд, которые он принимает, является fsutil usn readjournal <volume pathname>наряду с несколькими другими аргументами. Есть ли документация о том, как читать данные, полученные программой? Мои особые интересы, как интерпретировать и использовать File IDи Parent file IDполе. Поскольку File nameне включает полный путь, неясно, как определить, может ли файл представлять интерес на основе местоположения.

Пример записи

Usn : 9149751384 File name : Preferences~RF101ac0ae.TMP File name length : 52 Reason : 0x80000200: File delete | Close Time stamp : 7/12/2018 11:04:30 File attributes : 0x00000020: Archive File ID : 0000000000000000000500000000a67b Parent file ID : 0000000000000000000500000003fa3c Source info : 0x00000000: *NONE* Security ID : 0 Major version : 3 Minor version : 0 Record length : 128 
2

1 ответ на вопрос

2
Ben N

Этот вывод соответствует USN_RECORD_V3структуре данных. Что касается строк идентификаторов, каждый объект на томе NTFS имеет числовой идентификатор. В строке «идентификатор файла» указан идентификатор файла, на который повлияло это обновление; «идентификатор родительского файла» - это идентификатор каталога, в котором он находится.

Для того, чтобы получить путь к файлу, вы можете использовать другой режим работы этой утилиты: fsutil file queryFileNameById. Он принимает путь к тому и идентификатор файла (с 0xдобавлением префикса) и возвращает полный путь. Я говорю «путь», а не «путь», потому что NTFS допускает жесткие ссылки, которые дают разные пути к одному и тому же файлу. То, какой путь возвращается в этом случае, является произвольным. Тем не менее, подавляющее большинство файлов имеют только одну ссылку / путь.

Давайте сделаем пример. У меня есть эта запись USN:

Usn : 46966427728 File name : settings.dat File name length : 24 Reason : 0x80000001: Data overwrite | Close Time stamp : 7/11/2018 21:50:57 File attributes : 0x00000020: Archive File ID : 00000000000000000005000000170d13 Parent file ID : 0000000000000000001200000019ab0e Source info : 0x00000000: *NONE* Security ID : 0 Major version : 3 Minor version : 0 Record length : 104 

Давайте использовать идентификатор файла, чтобы найти путь к файлу:

fsutil file queryFileNameById C:\ 0x00000000000000000005000000170d13 

Результат:

A random link name to this file is \\?\C:\Users\Ben\AppData\Local\Packages\Microsoft.Windows.Photos_8wekyb3d8bbwe\Settings\settings.dat 

Похоже, этот файл является своего рода хранилищем настроек для приложения «Фото». В случае вашей записи USN, вероятно, файл сейчас удален, поэтому вам нужно будет использовать родительский идентификатор, чтобы найти его. Если я запросить по родительскому идентификатору моего файла ...

fsutil file queryFileNameById C:\ 0x0000000000000000001200000019ab0e 

... я получаю только путь к папке, а не к settings.datфайлу:

A random link name to this file is \\?\C:\Users\Ben\AppData\Local\Packages\Microsoft.Windows.Photos_8wekyb3d8bbwe\Settings 
У вас есть знания о том, как получить доступ к этой информации программно? Я мог бы написать программу на Python 3.7, которая будет читать стандартный вывод и анализировать строки, идущие от `fsutil`, но пакет, который обрабатывает такие детали, уже был бы идеальным. Noctis Skytower 6 лет назад 0
@NoctisSkytower Доступ к этой информации обычно осуществляется [с использованием `DeviceIoControl`] (https://msdn.microsoft.com/en-us/library/windows/desktop/aa364586 (v = vs.85) .aspx), родной Windows функция. [Этот инструмент Python] (https://github.com/PoorBillionaire/USN-Journal-Parser) может быть близок к тому, что вы ищете. Ben N 6 лет назад 0
Да, программа привлекла мое внимание, но не была понятна в использовании. Он также не поддерживает опции `wait` и` tail`, доступные в команде `fsutil usn readjournal`. Парсинг стандартного вывода кажется лучшим выбором на данный момент. Noctis Skytower 6 лет назад 0