微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用Python而不使用pywin32来确定Windows上的文件所有者

我正在写一个脚本,需要确定窗口上文件的所有者的用户名

虽然我发现了一个使用pywin32的解决scheme,但我犹豫不决,因为我不想添加模块依赖。

该脚本将为python 2.6编写,并且必须在32位和64位平台上运行。

我想知道是否有不同的方法,可能与ctypes,来确定这个信息

我在哪里可以findsql语句日志postgresql

发送由GetAsyncKeyState()忽略的虚拟鼠标点击?

在Windows上使用PHPStorm开发SASS

临时文件关联为单个cmd.exe会话

在Windows中获得纳秒执行时间

rpy2安装在Windows 7上

Windows:语言栏不会显示我的一些窗口的input法选项

如何在程序集级别剖析C ++函数

任何人都知道如何解决Android Studio中的“无法parsing符号”注入“错误

如何在Windows右键菜单添加自己的控件?

下面的示例使用ctypes访问问题中链接代码段中的WinAPI函数

ctypes的定义

import ctypes as ctypes from ctypes import wintypes as wintypes advapi32 = ctypes.WinDLL('advapi32',use_last_error=True) # required constants ERROR_INSUFFICIENT_BUFFER = 0x007A OWNER_Security_@R_730_4045@ION = 0x00000001 # related constants ERROR_INVALID_FUNCTION = 0x0001 ERROR_FILE_NOT_FOUND = 0x0002 ERROR_PATH_NOT_FOUND = 0x0003 ERROR_ACCESS_DENIED = 0x0005 GROUP_Security_@R_730_4045@ION = 0x00000002 DACL_Security_@R_730_4045@ION = 0x00000004 SACL_Security_@R_730_4045@ION = 0x00000008 LABEL_Security_@R_730_4045@ION = 0x00000010 ATTRIBUTE_Security_@R_730_4045@ION = 0x00000020 ScopE_Security_@R_730_4045@ION = 0x00000040 BACKUP_Security_@R_730_4045@ION = 0x00010000 UNPROTECTED_SACL_Security_@R_730_4045@ION = 0x10000000 UNPROTECTED_DACL_Security_@R_730_4045@ION = 0x20000000 PROTECTED_SACL_Security_@R_730_4045@ION = 0x40000000 PROTECTED_DACL_Security_@R_730_4045@ION = 0x80000000 # type deFinitions LPBOOL = ctypes.POINTER(wintypes.BOOL) LPDWORD = ctypes.POINTER(wintypes.DWORD) PSID = ctypes.POINTER(wintypes.BYTE) PSecurity_DESCRIPTOR = ctypes.POINTER(wintypes.BYTE) Security_@R_730_4045@ION = wintypes.DWORD class SID_NAME_USE(wintypes.DWORD): _sid_types = dict(enumerate(''' User Group Domain Alias WellKNownGroup DeletedAccount Invalid UnkNown Computer Label'''.split(),1)) def __init__(self,value=None): if value is not None: if value not in self.sid_types: raise ValueError('invalid SID type') wintypes.DWORD.__init__(value) def __str__(self): if self.value not in self._sid_types: raise ValueError('invalid SID type') return self._sid_types[self.value] PSID_NAME_USE = ctypes.POINTER(SID_NAME_USE) # function pointer prototypes def _check_bool(result,func,args,WinError=ctypes.WinError,get_last_error=ctypes.get_last_error): if not result: raise WinError(get_last_error()) return args # msdn.microsoft.com/en-us/library/aa446639 advapi32.GetFileSecurityW.errcheck = _check_bool advapi32.GetFileSecurityW.argtypes = ( wintypes.LPCWSTR,# _In_ lpFileName Security_@R_730_4045@ION,# _In_ Requested@R_730_4045@ionRequested PSecurity_DESCRIPTOR,# _Out_opt_ pSecurityDescriptor wintypes.DWORD,# _In_ nLength LPDWORD) # _Out_ lpnLengthNeeded # msdn.microsoft.com/en-us/library/aa446651 advapi32.GetSecurityDescriptorOwner.errcheck = _check_bool advapi32.GetSecurityDescriptorOwner.argtypes = ( PSecurity_DESCRIPTOR,# _In_ pSecurityDescriptor ctypes.POINTER(PSID),# _Out_ pOwner LPBOOL) # _Out_ lpbOwnerDefaulted # msdn.microsoft.com/en-us/library/aa379166 advapi32.LookupAccountSidW.errcheck = _check_bool advapi32.LookupAccountSidW.argtypes = ( wintypes.LPCWSTR,# _In_opt_ lpSystemName PSID,# _In_ lpSid wintypes.LPCWSTR,# _Out_opt_ lpName LPDWORD,# _Inout_ cchName wintypes.LPCWSTR,# _Out_opt_ lpReferencedDomainName LPDWORD,# _Inout_ cchReferencedDomainName PSID_NAME_USE) # _Out_ peUse

函数定义

def get_file_security(filename,request): length = wintypes.DWORD() # NB This query may fail with ERROR_INVALID_FUNCTION # for some filesystems. try: advapi32.GetFileSecurityW(filename,request,None,ctypes.byref(length)) except WindowsError as e: if e.winerror != ERROR_INSUFFICIENT_BUFFER: raise if not length.value: return None sd = (wintypes.BYTE * length.value)() advapi32.GetFileSecurityW(filename,sd,length,ctypes.byref(length)) return sd def look_up_account_sid(sid): SIZE = 256 name = ctypes.create_unicode_buffer(SIZE) domain = ctypes.create_unicode_buffer(SIZE) cch_name = wintypes.DWORD(SIZE) cch_domain = wintypes.DWORD(SIZE) sid_type = SID_NAME_USE() advapi32.LookupAccountSidW(None,sid,name,ctypes.byref(cch_name),domain,ctypes.byref(cch_domain),ctypes.byref(sid_type)) return name.value,domain.value,sid_type def get_file_owner(filename): sd = get_file_security(filename,OWNER_Security_@R_730_4045@ION) sid = PSID() sid_defaulted = wintypes.BOOL() advapi32.GetSecurityDescriptorOwner(sd,ctypes.byref(sid),ctypes.byref(sid_defaulted)) name,sid_type = look_up_account_sid(sid) return name,sid_type

示例脚本

if __name__ == '__main__': import sys filename = sys.argv[1] if isinstance(filename,bytes): filename = filename.decode('mbcs') name,sid_type = get_file_owner(filename) if domain: name = '{0}\{1}'.format(domain,name) print("File : {0}".format(filename)) print("Owner: {0} ({1})".format(name,sid_type))

演示

C:>get_file_owner.py C:Windows File : C:Windows Owner: NT SERVICETrustedInstaller (WellKNownGroup) C:>get_file_owner.py C:Users File : C:Users Owner: NT AUTHORITYSYstem (WellKNownGroup)

你可以调用一个windows shell命令“dir / q”并解析输出以找到所有者。

subprocess.call("dir /q",shell=True)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐