Windows 中的文件权限为 Python 10
file permissions in Windows 10 with Python
问题: 如何使用 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" 是所有者,根据 "advanced security settings"
MSD_Data
、THG126.D
、sample_info.xml
和 python脚本。
- 我也尝试过 运行 通过 CLI 使用 "run as administrator" 脚本。出现同样的错误。
我查看了文件夹中的所有个文件,发现只有sample_info.xml
有RA属性,而其他的都只有A,所以我添加了
path2 = r"D:\MSD_data\"+run+r"\AcqData\sample_info.xml"
subprocess.check_call(["attrib", "-r", path2, "/S", "/D"])
添加到脚本中,它现在似乎可以工作了。我需要稍微等待其他软件生成新文件夹,以查看脚本现在是否正常工作。
问题似乎是某个文件具有 "RA" 属性,这意味着 "read-only" 和 "archived"。即使使用的用户帐户是所有文件和文件夹的所有者,shutil.move()
在复制到目标位置后尝试删除文件时失败。
此问题的解决方法是使用
subprocess.check_call(["attrib", "-r", path])
删除只读文件属性。这解决了我的问题。如果您仍然无法使用 shutil.move()
,您也可以尝试 this solution。
问题: 如何使用 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" 是所有者,根据 "advanced security settings"
MSD_Data
、THG126.D
、sample_info.xml
和 python脚本。 - 我也尝试过 运行 通过 CLI 使用 "run as administrator" 脚本。出现同样的错误。
我查看了文件夹中的所有个文件,发现只有sample_info.xml
有RA属性,而其他的都只有A,所以我添加了
path2 = r"D:\MSD_data\"+run+r"\AcqData\sample_info.xml"
subprocess.check_call(["attrib", "-r", path2, "/S", "/D"])
添加到脚本中,它现在似乎可以工作了。我需要稍微等待其他软件生成新文件夹,以查看脚本现在是否正常工作。
问题似乎是某个文件具有 "RA" 属性,这意味着 "read-only" 和 "archived"。即使使用的用户帐户是所有文件和文件夹的所有者,shutil.move()
在复制到目标位置后尝试删除文件时失败。
此问题的解决方法是使用
subprocess.check_call(["attrib", "-r", path])
删除只读文件属性。这解决了我的问题。如果您仍然无法使用 shutil.move()
,您也可以尝试 this solution。