【发布时间】:2018-01-20 09:28:56
【问题描述】:
问题:如何使用 Python 脚本更改 Windows 10 PC 上的文件权限?
我编写了一个Python script,它获取由专有软件创建的文件夹,并将它们移动到带有shutil.move() 的网络驱动器。
似乎专有软件会默认创建只读文件夹。我需要更改这些文件夹的文件权限,以便shutil.move() 在将文件夹复制到网络驱动器后删除它们。
我在 SO 上进行了搜索,发现 os.chmod(path, 0o777) 仅适用于授予 Unix 系统上的访问权限。在 Windows 上,它修改文件或文件夹的只读属性。 This question 似乎产生了一个解决方案,我尝试如下:
import win32security
import ntsecuritycon as con
account = r"admin"
userx, domain, type = win32security.LookupAccountName ("", account)
sd = win32security.GetFileSecurity(path, win32security.DACL_SECURITY_INFORMATION)
dacl = sd.GetSecurityDescriptorDacl() # instead of dacl = win32security.ACL()
dacl.AddAccessAllowedAce(win32security.ACL_REVISION, con.FILE_GENERIC_READ | con.FILE_GENERIC_WRITE, userx)
sd.SetSecurityDescriptorDacl(1, dacl, 0) # may not be necessary
win32security.SetFileSecurity(path, win32security.DACL_SECURITY_INFORMATION, sd)
但它似乎不起作用。另外,我不明白我在用模块win32security 和ntsecuritycon 做什么。也许有人可以给出一个简单的解释。
编辑:好的,所以我看了一些东西。这是引发的异常:
Traceback (most recent call last):
File "copyscript.py", line 108, in <module>
copyscript()# the loop needs to be called as a function to delete all assigned variables after each loop
File "copyscript.py", line 93, in copyscript
shutil.move(run, str(target_dir2))#move files renamed to user folder
File "C:\Users\admin\AppData\Local\Programs\Python\Python35\lib\shutil.py", line 550, in move
rmtree(src)
File "C:\Users\admin\AppData\Local\Programs\Python\Python35\lib\shutil.py", line 488, in rmtree
return _rmtree_unsafe(path, onerror)
File "C:\Users\admin\AppData\Local\Programs\Python\Python35\lib\shutil.py", line 378, in _rmtree_unsafe
_rmtree_unsafe(fullname, onerror)
File "C:\Users\admin\AppData\Local\Programs\Python\Python35\lib\shutil.py", line 383, in _rmtree_unsafe
onerror(os.unlink, fullname, sys.exc_info())
File "C:\Users\admin\AppData\Local\Programs\Python\Python35\lib\shutil.py", line 381, in _rmtree_unsafe
os.unlink(fullname)
PermissionError: [WinError 5] Access is denied: 'THG126.D\\AcqData\\sample_info.xml'
- 此文件的完整路径为
D:\MSD_Data\THG126.D\AcqData\sample_info.xml。 - 用户帐户名为“admin”,属于“Administrators”组。
- “admin”是所有者,根据
MSD_Data、THG126.D、sample_info.xml和 python 脚本的“高级安全设置”具有“完全控制权”。 - 我还尝试使用“以管理员身份运行”通过 CLI 运行脚本。发生同样的错误。
我查看了文件夹中的所有文件,发现只有sample_info.xml具有RA属性,而所有其他都只有A,所以我添加了
path2 = r"D:\\MSD_data\\"+run+r"\\AcqData\\sample_info.xml"
subprocess.check_call(["attrib", "-r", path2, "/S", "/D"])
到脚本,它现在似乎可以工作了。我需要稍等片刻,让其他软件生成新文件夹,看看脚本现在是否正常工作。
【问题讨论】:
-
Windows 安全性没有简单的解释。它很复杂。在您可以完全描述您希望执行的操作之前,您希望谁编写代码?反复试验不太可能成功。
-
@Tomalak,文件夹的只读属性对
shutil.move来说通常不是没有意义的。如果设置了只读属性,则删除文件夹本身(而不是其内容)将失败。但问题是缺少回溯,没有显示 attrib.exe(或oct(stat.S_IMODE(os.stat(path).st_mode))的文件夹属性,也没有显示 icacls.exe 的安全性,所以我们没有足够的信息来真的很有帮助。 -
另外,
SetFileSecurity已过时。去年四月,我为使用SetEntriesInAcl和SetNamedSecurityInfo的链接问题添加了更新答案。 -
@Tomalak,在一个卷中,
os.rename调用(即 WinAPIMoveFile[Ex])将成功,因为它只是一个重新链接;该目录不会被删除。对于跨卷移动,它必须删除目录,如果它是只读的,这将失败。当文档说目录不支持只读时,他们的意思是它不会阻止您从目录中添加或删除文件,而不是它不会阻止删除目录本身。 -
@Tomalak,没有看到文件安全性,我们不能说当前访问令牌是否授予修改 DACL 的权限。如果用户是所有者,或者它由用户访问令牌中的某个组所拥有,或者用户可以通过
SeTakeOwnershipPrivilege取得所有权,那么我们就没有死路。
标签: python winapi windows-10 file-permissions