2014-02-16 3 views
2

Я пытаюсь получить идентификаторы объектов NTFS для использования в программе резервного копирования Python. Я перехожу через голову, но мне удалось создать функцию, которая возвращает ... что-то.Вызов FSCTL_CREATE_OR_GET_OBJECT_ID из Python

import sys 
import win32file 
import winioctlcon 


def object_id(filename): 
    """ 
    NTFS OBJECT_ID 
    """ 
    fhandle = win32file.CreateFileW(
     # FileName 
     filename, 

     # DesiredAccess 
     win32file.GENERIC_READ, 

     # ShareMode 
     win32file.FILE_SHARE_READ | win32file.FILE_SHARE_WRITE, 

     # SecurityAttributes 
     None, 

     # CreationDisposition 
     win32file.OPEN_EXISTING, 

     # FlagsAndAttributes 
     0 
     ) 

    obj_id = win32file.DeviceIoControl(
     # Device : PyHANDLE 
     # Handle to a file, device, or volume 
     fhandle, 

     # IoControlCode : int 
     # IOControl Code to use, from winioctlcon 
     winioctlcon.FSCTL_CREATE_OR_GET_OBJECT_ID, 

     # InBuffer : str/buffer 
     # The input data for the operation, can be None for some operations. 
     None, 

     # OutBuffer : int/buffer 
     # Size of the buffer to allocate for output, or a writeable buffer as 
     # returned by win32file::AllocateReadBuffer. 
     64, 

     # Overlapped=None : PyOVERLAPPED An overlapped object for async 
     # operations. Device handle must have been opened with 
     # FILE_FLAG_OVERLAPPED. 
     None 
     ) 
    fhandle.Close() 
    return obj_id 

Некоторые образцы с выходом вызова этой функции является ул как, «↑ · ∟âkòπ◄êδ% dΘπ╧hMêc▌Æ╧J¿/╧y╠┘ôπ ↑ · ∟âkòπ◄êδ% dΘπ╧ ». Это было бы хорошо для целей моей программы, если это согласовано для каждого файла, который я поддерживаю. Но я делаю что-то ужасное здесь? В идеале я хотел бы реализовать это как можно лучше.

ответ

2

Использование binascii.hexify() на выходе ул из моих выходов вопрос: "18fa1c836b95e31188eb002564e9e3cf684d8863dd92cf4aa82fcf79ccd993e318fa1c836b95e31188eb002564e9e3cf00000000000000000000000000000000". Это тот же самый результат:

C:\Windows\system32>fsutil.exe objectid query "myfile.txt" 
Object ID :  18fa1c836b95e31188eb002564e9e3cf 
BirthVolume ID : 684d8863dd92cf4aa82fcf79ccd993e3 
BirthObjectId ID : 18fa1c836b95e31188eb002564e9e3cf 
Domain ID :  00000000000000000000000000000000 

Так что я независимая проверка с fsutil.exe, что моя функция Питона производит правильный вывод.

Я все еще не знаю, были ли использованы функции Windows абсолютно правильными, и были бы признательны за любые исправления, если бы они не были.

2

Да. Это действительно 100%.

Вы возвращает три OBJECT_ID:

Object ID: 3FB73FE2-6BF2-3F3F-EA3F-2025643F3F3F

Объем рождения ID: 684DEA63-A6C6-2D4A-BF2F-2D79A62BF470

Врожденные Идентификатор объекта: 3FB73FE2-6BF2-3F3F-EA3F-2025643F3F3F

Этот выход соответствует ожиданиям. :)

+0

Как вы перевели из (сумасшедшего) значения str, которое я дал выше этим трем алфавитумерам ?! –

+0

Просто из вашей строки, как hex. – user2120666

+0

Можете ли вы показать функцию Python, которая преобразует мою строку в ваши шестнадцатеричные строки? Я пытаюсь воспроизвести ваш результат всю ночь! –