2014-02-16 24 views
2

我正在嘗試獲取NTFS對象ID以在Python備份程序中使用。我在我的頭上,但設法創建一個函數返回...什麼。從Python中調用FSCTL_CREATE_OR_GET_OBJECT_ID

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()的輸出STR從我的問題產生了: 「18fa1c836b95e31188eb002564e9e3cf684d8863dd92cf4aa82fcf79ccd993e318fa1c836b95e31188eb002564e9e3cf00000000000000000000000000000000」。這是相同的結果:

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

所以我必須從我的Python的功能是生成正確的輸出fsutil.exe獨立驗證。

我仍然不知道Windows的功能是否被完全正確地使用,如果不是,我們將不勝感激。

2

是的。這是100%有效的。

您在返回下面的三個OBJECT_ID

對象ID:3FB73FE2-6BF2-3F3F-EA3F-2025643F3F3F

出生卷ID:684DEA63-A6C6-2D4A-BF2F-2D79A62BF470

誕生對象ID:3FB73FE2-6BF2-3F3F-EA3F-2025643F3F3F

此輸出符合預期。 :)

+0

你是如何從上面給出的(看起來很瘋狂的)str值轉換成這三個字母數字?! –

+0

只需從十六進制字符串中取出即可。 – user2120666

+0

你能展示一個將我的字符串轉換爲你的十六進制字符串的Python函數嗎?我一直在努力整晚複製你的結果! –