Mr_and_Mrs_D
Mr_and_Mrs_D

Reputation: 34016

Python win32com CallNotImplementedError instead of AccessDenied?

This code:

import os
from win32com.shell import shell, shellcon

tempFile = os.path.join(os.path.abspath(os.path.curdir), u'_tempfile.tmp')
# print tempFile
dest = os.path.join('C:\Program Files', '_tempfile.tmp')
with open(tempFile, 'wb'): pass # create the file
try: # to move it into C:\Program Files
        result, aborted = shell.SHFileOperation(
                (None, # parent window
                 shellcon.FO_MOVE, tempFile, dest,
                 # 0,
                 shellcon.FOF_SILENT, # replace this with 0 to get a UAC prompt
                 None, None))
        print result, aborted
except: # no exception raised
    import traceback
    traceback.print_exc()

Prints 120 False - 120 being CallNotImplementedError. If the flags are set to 0 then you get a UAC prompt as expected. Now why is not the result 5 (AccessDeniedError) ? Is something not implemented indeed or is it a bug or what do I not get ?

Needless to say that this was hard to debug - I was expecting an access denied and I had to look very closely to see what was wrong.

Upvotes: 0

Views: 160

Answers (1)

ShadowRanger
ShadowRanger

Reputation: 155363

You're misreading the error code. SHFileOperation uses its own set of error codes separate from the system error codes; in this case, 0x78/120 is:

DE_ACCESSDENIEDSRC: Security settings denied access to the source.

That doesn't seem like it's the likely error (the destination is the problem), but this function is deprecated (replaced in Vista by IFileOperation) and while it still exists in Vista+, they may not have been particularly careful about returning entirely accurate error codes for situations (like UAC) that didn't exist pre-Vista.

Per the docs:

  • These are pre-Win32 error codes and are no longer supported or defined in any public header file. To use them, you must either define them yourself or compare against the numerical value.
  • These error codes are subject to change and have historically done so.
  • These values are provided only as an aid in debugging. They should not be regarded as definitive.

Upvotes: 1

Related Questions