BackupRead problem

Stefan Sonnenberg-Carstens stefan.sonnenberg at pythonmeister.com
Sat Jan 15 11:58:16 EST 2011


Am 15.01.2011 16:06, schrieb Stefan Sonnenberg-Carstens:
> I'm trying to create a Backup/Restore app.
> I'm really struggeling for a long time.
>
> I can successfully read directories, but not files.
> Every time, I'll try I get "Access denied", Error 5.
>
> It's running with admin privs.
>
> Any ideas ?
>
> #!python
> import sys
> import os
> import os.path
> import getopt
> import time
>
>
> DELETE=0x00010000
> READ_CONTROL=0x00020000
> WRITE_DAC=0x00040000
> WRITE_OWNER=0x00080000
> SYNCHRONIZE=0x00100000
> STANDARD_RIGHTS_REQUIRED=0x000F0000L
> STANDARD_RIGHTS_READ=READ_CONTROL
> STANDARD_RIGHTS_WRITE=READ_CONTROL
> STANDARD_RIGHTS_EXECUTE=READ_CONTROL
> STANDARD_RIGHTS_ALL=0x001F0000
> SPECIFIC_RIGHTS_ALL=0x0000FFFF
>
> FILE_ATTRIBUTE_REPARSE_POINT=0x400
>
> from ctypes import *
>
> if os.name == 'nt':
>
>     import win32security
>     import win32process
>     import win32file
>
>     try:
>         import win32api
>     except ImportError,e:
>         print >>sys.stderr,'Could not load win32api module. Can not 
> continue'
>         os._exit(1)
>     try:
>         import wmi
>     except ImportError,e:
>         print >>sys.stderr,'Could not load wmi module. Can not continue'
>         os._exit(1)
>     try:
>         import ctypes
>     except ImportError,e:
>         print >>sys.stderr,'Could not load ctypes module. Can not 
> continue'
>         os._exit(1)
> else:
>     print >>sys.stderr,'Sorry, your platform %s is not supported' % 
> os.name
>     os._exit(1)
>
> if len(sys.argv) >= 1:
>     try:
>         opts,args = getopt.getopt(sys.argv[1:],'h',('help',))
>     except getopt.GetoptError,e:
>         print str(e)
>     if not ctypes.windll.shell32.IsUserAnAdmin():
>         win32api.ShellExecute(None,'runas',sys.executable,' 
> '.join(sys.argv),r'C:\WINDOWS',0)
>     else:
>         print >>sys.stderr,'Running with administrative privileges'
>         token = 
> win32security.OpenProcessToken(win32process.GetCurrentProcess(),win32security.TOKEN_ADJUST_PRIVILEGES|win32security.TOKEN_QUERY)
>         if token:
>             for priv in 
> (win32security.SE_BACKUP_NAME,win32security.SE_RESTORE_NAME):
>                 luid = win32security.LookupPrivilegeValue(None,priv)
>                 newState = [(luid,win32security.SE_PRIVILEGE_ENABLED)]
>                 try:
>                     win32security.AdjustTokenPrivileges(token,0,newState)
>                 except:
>                     print >>sys.stderr,'Could not get (some) required 
> priviledge(s): ',win32api.FormatMessage(win32api.GetLastError())
>                     os._exit(1)
>             win32api.CloseHandle(token)
>         else:
>             print >>sys.stderr,'Could not get token for running process'
>             os._exit(1)
>         print >>sys.stderr,'Acquired backup/restore context 
> (SeRestorePrivilege and SeBackupPrivilege enabled)'
>         inf = 
> win32file.CreateFile(r'C:\Windows\System32\drivers\etc\hosts',READ_CONTROL,0,None,win32file.OPEN_EXISTING,win32file.FILE_FLAG_BACKUP_SEMANTICS,None)
>         buf = win32file.AllocateReadBuffer(4096)
>         ctx = 0
>         (bytes_read,buf,ctx) = 
> win32file.BackupRead(inf,4096,buf,False,True,ctx)
MS's documenation sucks.
Just found some code on the web regarding root-kits,
but after changing

win32file.CreateFile(r'C:\Windows\System32\drivers\etc\hosts',READ_CONTROL,0,None,win32file.OPEN_EXISTING,win32file.FILE_FLAG_BACKUP_SEMANTICS,None)

to

win32file.CreateFile(r'C:\Windows\System32\drivers\etc\hosts',win32file.GENERIC_READ,0,None,win32file.OPEN_EXISTING,win32file.FILE_FLAG_BACKUP_SEMANTICS,None)


it works.




More information about the Python-list mailing list