Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 在linux上使用python从smb共享获取文件所有者_Python 3.x_Linux_Smb_Cifs_Cacls - Fatal编程技术网

Python 3.x 在linux上使用python从smb共享获取文件所有者

Python 3.x 在linux上使用python从smb共享获取文件所有者,python-3.x,linux,smb,cifs,cacls,Python 3.x,Linux,Smb,Cifs,Cacls,我需要找出我正在编写的脚本谁是smb共享中文件的真正所有者(当然是使用mount-t cifs在我的服务器上装载,并通过windows计算机使用net use) 事实证明,在linux服务器上使用python查找这些信息是一个真正的挑战 我尝试使用许多smb库(如smb协议、smbclient和其他库),但没有任何效果。 我发现很少有针对windows的解决方案,它们都使用pywin32或其他特定于windows的软件包。 我还通过bash使用smbcalcs实现了这一点,但无法干净地实现,只能

我需要找出我正在编写的脚本谁是smb共享中文件的真正所有者(当然是使用
mount-t cifs
在我的服务器上装载,并通过windows计算机使用
net use

事实证明,在linux服务器上使用python查找这些信息是一个真正的挑战

我尝试使用许多smb库(如smb协议、smbclient和其他库),但没有任何效果。
我发现很少有针对windows的解决方案,它们都使用pywin32或其他特定于windows的软件包。
我还通过bash使用
smbcalcs
实现了这一点,但无法干净地实现,只能使用
subprocess.popen('smbcacls')


关于如何解决这个问题有什么想法吗?

这不是一个令人难以置信的琐碎任务,不幸的是,答案并不像我希望的那样简单

如果将来有人会遇到同样的问题,我会发布这个答案,但希望有人能早点发布更好的解决方案

为了找到我使用的所有者:

从smb.SMBConnection导入SMBConnection
conn=SMBConnection(用户名=“”,密码=“”,域=“”,我的\u名称=“”,远程\u名称=“”)
连接(“”)
sec_att=conn.getSecurity(“”,r'\some\file\path')
所有者\u sid=第二个附件所有者
问题是
pysmb
包只会给您所有者的SID,而不是他的名字。
为了得到他的名字,你需要(重新发布代码):

从ldap3导入服务器,连接,全部
从ldap3.utils.conv导入转义字节
s=Server('my_Server',get_info=ALL)
c=连接,“我的用户”、“我的密码”)
c、 绑定()
binary_sid=b'..'#您的sid必须为二进制格式
c、 搜索('my_base','(objectsid='+escape_bytes(binary_sid)+'),attributes=['objectsid','samaccountname'])
打印(c.条目)
但当然没有什么是容易的,我花了几个小时才找到一种在python中将字符串SID转换为二进制SID的方法:

#发布所需函数并省略类部分
def字节(STRID):
'''
将SID转换为字节
strdsid-要转换为字节的SID
'''
sid=str.split(strId,'-')
ret=bytearray()
sid.remove('S')
对于范围内的i(len(sid)):
sid[i]=int(sid[i])
sid.插入(1,长度(sid)-2)
ret+=长字节(sid[0],大小=1)
ret+=长字节(sid[1],大小=1)
ret+=长字节(sid[2],假,6)
对于范围(3,len(sid))中的i:
ret+=cls.longToByte(sid[i])
回程网
def byteToLong(字节,little_endian=True):
'''
将字节转换为Python整数
字节-要转换的字节
little_endian-对于little endian或big endian,为True(默认值)或False
'''
如果len(字节)>8:

raise Exception('字节太长。需要该死,这是对基本功能的位洗牌…:D