删除 Vista 或 Windows 7 下无法删除的文件夹






4.73/5 (18投票s)
一个小工具,可帮助您摆脱难以移除的受保护或系统文件夹。

引言
如果你像我一样,你可能遇到过一个不肯被删除的文件夹。
这篇文章的目的是编写一个小程序来帮助我们删除这个文件夹。这有多难呢?
背景
这篇文章是原始技巧和窍门的后续:删除 Windows 7 中的受保护文件夹。
使用应用程序
- 运行可执行文件:VistaDeleteFolder.exe
- 小心选择你要删除的文件夹
- 按下开始按钮
幕后
嘿,这里是 CodeProject。你想看一些源代码,对吧?
这个程序的核心思想是修复每个文件和文件夹的访问权限。
private static void FixAccess(FileSystemSecurity sec)
{
string currentUser = WindowsIdentity.GetCurrent().Name;
sec.AddAccessRule(new FileSystemAccessRule
(currentUser, FileSystemRights.FullControl, AccessControlType.Allow));
}
我还清除了所有现有的规则,希望避免冲突。
foreach (FileSystemAccessRule fsar in sec.GetAccessRules
(true, true, typeof(System.Security.Principal.NTAccount)).OfType<filesystemaccessrule />().ToArray())
{
sec.RemoveAccessRuleAll(fsar);
}
不幸的是,一开始大部分都失败了,我无法弄清楚原因。我以为解决方案是修复文件的所有权。
private static void FixOwner(FileSystemSecurity sec)
{
var sid = sec.GetOwner(typeof(SecurityIdentifier));
string currentUser = WindowsIdentity.GetCurrent().Name;
var ntAccount = new NTAccount(currentUser);
sec.SetOwner(ntAccount);
}
不幸的是,这还不够。应用程序需要在管理员模式下运行。可以通过更改可执行文件的清单文件来强制执行。
<asmv1:assembly manifestVersion="1.0" ...>
<assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
</requestedPrivileges>
</security>
</trustInfo>
...
</asmv1:assembly>
更糟糕的是,即使这样仍然无法工作。我遇到一个异常,由于某种无法解释的原因,所有者的更改被拒绝。我继续在 Google 上搜索这个异常,偶然发现了 http://processprivileges.codeplex.com/。使用他们的库很简单。我添加了这一行。
using (new ProcessPrivileges.PrivilegeEnabler
(Process.GetCurrentProcess(), Privilege.TakeOwnership))
{
<original code here>
}
我没有深入研究这个库是如何做到的,但它奏效了。那个顽固的文件夹消失了。
历史
- 2011 年 6 月 28 日:改进并发布为一篇文章
- 2011 年 3 月 22 日:首次发布为技巧和窍门