问题描述
有时候磁盘里面一些文件会被一些程序设置了复杂的权限,请原谅本人才疏学浅无法对Windows的权限系统进行合理的解释。这种设置后表现出来的问题是当你想删除该文件夹时提示文件夹访问被拒绝 你需要权限来执行此操作 需要来自??的权限才能对此文件夹进行更改如图所示
本人在这里遇到的是WindowsApps文件夹删不掉的问题,在百度,bing上找了很多方法都不行,英语表达不好,谷歌上没怎么找。我甚至尝试了引导ubuntu,使用了sudo rm -rf来删除,仍然无济于事。
手动方法解决
在探索的过程中我发现,网络上一般说法是对根文件夹进行权限设置,但我这里行不通,我的情况是如果要删除需要找到文件夹内每一个文件,经过以下步骤进行设置,便可删除。原谅本人孤陋寡闻,为什么需要对文件手动单独设置才行这个原理还是无法给大伙解释。
- 右键 属性 安全 高级 所有者更改为Administrators
- 在下方权限条目添加Everyone的权限
- 此时再删除文件便可一路删除掉了
但是这种方法有个明显的缺点,万一文件很多很杂就费时费力,所以本人使用python写了个小脚本自动完成上述的操作,理论上还可用于删除任何文件夹。若大佬觉得多此一举或有方便的方法还请轻喷
使用python自动删除
废话不多说,直接上代码,管理员运行的逻辑有参考如下链接。因为本人使用效果很好,以防误操作加入了简单的验证码验证的机制。虽然但是,使用本脚本风险请自己承担,本人测试完美删除有上述问题的各种文件夹。
https://blog.csdn.net/xianjie0318/article/details/108604171
# coding:utf8
import sys
import os
import random
import subprocess
import ctypes
def getFiles(currentDir):
files = []
subprocess.run(
f"takeown /f {currentDir} /a",
shell=True)
subprocess.run(
f"icacls {currentDir} /RESET /C",
shell=True)
subprocess.run(
f"icacls {currentDir} /grant:r everyone:f",
shell=True)
currentDirFiles = os.listdir(currentDir)
for i in range(0,len(currentDirFiles)):
currentPath = os.path.join(currentDir,currentDirFiles[i])
if os.path.isdir(currentPath):
files.extend(getFiles(currentPath))
if os.path.isfile(currentPath):
files.append(currentPath)
return files
# https://blog.csdn.net/xianjie0318/article/details/108604171
def is_admin():
try:
return ctypes.windll.shell32.IsUserAnAdmin()
except:
return False
def main():
print("输入要获取权限并删除的文件夹")
dir = input()
if not os.path.isdir(dir):
print("路径不是文件夹")
input("回车键退出")
exit(0)
verifyCode = random.randint(100000, 999999)
print("")
print("")
print("")
print(f"===!!!警告!!!===")
print(f"将尝试获取权限后完全删除 {dir} 的内容")
print(f"请核对路径并输入确认码 {verifyCode} 回车键确认")
inputVerifyCode = input()
if inputVerifyCode != str(verifyCode):
print("确认码输入错误")
input("回车键退出")
exit(0)
files = getFiles(dir)
for each in files:
subprocess.run(
f"takeown /f {each} /a",
shell=True)
subprocess.run(
f"icacls {each} /grant:r everyone:f",
shell=True)
subprocess.run(
f"rmdir /s /q {dir}",
shell=True)
print("")
print("")
input("处理完成 回车键退出")
if is_admin():
main()
else:
if sys.version_info[0] == 3:
ctypes.windll.shell32.ShellExecuteW(None, "runas", sys.executable, __file__, None, 1)
else:#in python2.x
ctypes.windll.shell32.ShellExecuteW(None, u"runas", unicode(sys.executable), unicode(__file__), None, 1)