如何在Windows 7中获取文件的所有者?

4
我有一个问题 - 在窗口中打开文件时显示最后修改文件的人的姓名。如果您右键单击文件并选择“属性”和“详细信息”选项卡,则可以获取此信息...我看到所有者行和名称,但不知道如何从我的脚本中获取它。
让我们查看文件的属性:
\\server\project\sequences\ttt_sRnd.v016.mb

enter image description here

我使用Python2.7,但无法找到如何获取数据的解决方案...在Linux中可以工作,但在Windows中不行。 我尝试了在Windows中使用控制台工具。 dir /Q - 它适用于本地文件。
C:\temp>dir /Q file.ext
11/06/2004  15:33           290,304 COMP\user       file.ext
               1 File(s)        290,304 bytes
               0 Dir(s)  316,720,226,304 bytes free

但是当文件在服务器上时不起作用:
\\server\project\sequences\>dir /Q file.ext
21/12/2016  16:00            66,372 ...                    file.ext
               1 File(s)         66,372 bytes
               0 Dir(s)  52,561,190,912 bytes free

很奇怪,因为在浏览器中我可以看到数据并且它们是可用的

好的,请尝试另一个工具subinacl.exe

一样的情况- 可以在本地文件上使用,但无法在服务器上使用:

C:\temp>subinacl.exe /file file.ext /display=owner
/owner             =comp\user

C:\temp>subinacl.exe /file \\server\project\sequences\file.ext  /display=owner
\\server\project\sequences\file.ext - CreateFile Error : 1314 A required privilege is not held by the client.

我尝试使用takeown,但只能在本地文件上工作:

C:\temp>takeown /F file.ext
SUCCESS: The file (or folder): "C:\temp\file.ext" now owned by user "COMP\user".

\\server\project\sequences\>takeown /F file.ext
ERROR: Access is denied.

它在Windows中可能有其他实用程序?我甚至准备自己编写这样的工具并从Python中调用它。但我不知道如何获取这些信息?告诉我如何在任何编程语言中解决问题?我相信在C / C ++或C#代码中,这只是五行代码并输出到控制台...如果是这样-我很乐意提供帮助,并从Python中调用此实用程序。


1
标准查找(现已在此处两次无耻地抄袭了Tim的网站,没有归属)将是sd = win32security.GetFileSecurity(filename, win32security.OWNER_SECURITY_INFORMATION);``sid = sd.GetSecurityDescriptorOwner()。然后调用win32security.LookupAccountSid(machine, sid)将SID映射到域和名称。 - Eryk Sun
从已删除的答案中我们知道,最后一部分失败了,错误代码是“ERROR_TRUSTED_RELATIONSHIP_FAILURE”(1789),因为您在传递机器名时使用了“None”,并且在域控制器上遇到了某些配置问题。尝试直接查询“server”来传递机器名。 - Eryk Sun
@eryksun,已删除的答案又出现了。 - Ari Gold
@AriGold,显然你没有看到,但是在你回答之前,有人抄袭了Tim的网站,然后删除了那个答案。当你基本上从某人的网站复制并粘贴时,你需要引用来源,否则人们会对你进行投票。 - Eryk Sun
@eryksun,也许你知道如何用C++/C#编写它吗?因为在Autodesk Maya中安装win32 Python库太难了(我认为简单的控制台实用程序是更好的方式)。 - Massimo
显示剩余3条评论
1个回答

5

Python 2.7

尝试使用win32security库中的函数(GetFileSecurity和LookupAccountSid),您将获得有关所有者的信息。

import win32security

def GetOwner(filename):
    f = win32security.GetFileSecurity(filename, win32security.OWNER_SECURITY_INFORMATION)
    (username, domain, sid_name_use) =  win32security.LookupAccountSid(None, f.GetSecurityDescriptorOwner())
    return username

print GetOwner(r"\\some_shared_location\somefile.txt")

1
可以确认这个函数在Python 3.6中也能正常工作! - xjcl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接