VB.NET设置Windows.old文件夹权限后无法删除文件问题求助
VB.NET修改Windows.old权限失败问题解决方案
原有代码失效原因
- 权限规则参数配置错误:你使用的
InheritanceFlags.ObjectInherit+PropagationFlags.InheritOnly组合只会将权限应用到子文件,不会作用于C:\Windows.old根目录本身,根目录权限没改自然无法删除 - 未取得文件夹所有权:Windows.old默认所有者为系统内置的
TrustedInstaller账户,未修改所有者的前提下直接新增访问规则会被系统拒绝,操作实际未生效 - 程序缺少管理员权限:修改系统级目录的安全属性必须要求程序以管理员身份运行,未提权时权限修改操作会静默失败
- 未递归应用权限:仅修改根目录权限不会自动同步到内部的子文件、子文件夹,即使根目录有权限,内部文件依然会因为权限不足删除失败
修复方案
前置配置
首先在项目中添加应用程序清单(app.manifest),将requestedExecutionLevel节点修改为以下配置,强制程序启动时申请管理员权限:
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
修正后的完整代码
代码逻辑顺序为:先取得文件夹所有权→添加完全控制权限→递归应用权限到所有子对象
Imports System.IO Imports System.Security.AccessControl Imports System.Security.Principal ' 目标文件夹路径 Dim targetPath As String = "C:\Windows.old" Dim myDirectoryInfo As DirectoryInfo = New DirectoryInfo(targetPath) Dim myDirectorySecurity As DirectorySecurity = myDirectoryInfo.GetAccessControl() ' 1. 先将文件夹所有者修改为当前用户 Dim currentUser As String = WindowsIdentity.GetCurrent().Name myDirectorySecurity.SetOwner(New NTAccount(currentUser)) myDirectoryInfo.SetAccessControl(myDirectorySecurity) ' 2. 重新获取更新后的权限配置,添加完全控制规则,同时应用到根目录、子文件夹和子文件 myDirectorySecurity = myDirectoryInfo.GetAccessControl() Dim userRule As FileSystemAccessRule = New FileSystemAccessRule( currentUser, FileSystemRights.FullControl, InheritanceFlags.ContainerInherit Or InheritanceFlags.ObjectInherit, PropagationFlags.None, AccessControlType.Allow ) myDirectorySecurity.AddAccessRule(userRule) myDirectoryInfo.SetAccessControl(myDirectorySecurity) ' 3. 递归应用权限到所有子文件和子文件夹 For Each dir In myDirectoryInfo.GetDirectories("*", SearchOption.AllDirectories) Dim dirSec = dir.GetAccessControl() dirSec.SetOwner(New NTAccount(currentUser)) dirSec.AddAccessRule(userRule) dir.SetAccessControl(dirSec) Next For Each file In myDirectoryInfo.GetFiles("*", SearchOption.AllDirectories) Dim fileSec = file.GetAccessControl() fileSec.SetOwner(New NTAccount(currentUser)) fileSec.AddAccessRule(New FileSystemAccessRule(currentUser, FileSystemRights.FullControl, AccessControlType.Allow)) file.SetAccessControl(fileSec) Next ' 权限设置完成后即可执行删除操作 myDirectoryInfo.Delete(True)
补充说明
如果遇到文件被系统进程占用导致删除失败的情况,可以调用系统自带的磁盘清理工具完成Windows.old的删除,命令如下:
cleanmgr /sageset:99 /sagerun:99
调用后系统会自动勾选旧系统文件清理选项,无需手动操作。
内容的提问来源于stack exchange,提问作者Ziyaretçi Google
相关产品推荐
相关产品推荐

