注意:
有多種方式來刪除目前使用者沒有許可權的檔案(或檔案夾),這裡僅討論使用.NET中的存取控制API來做上述事情,不對其他方法作評價。
起因是安裝了Windows 8,然後想把它卸載掉,由於Windows 8安裝到了F盤,而且F盤還包含其他重要檔案,因此不能格式化,於是把啟動項中的Windows 8刪除掉後,接下來就要手動刪除這些Windows 8遺留下來的檔案夾。
問題就是某些(多數)檔案夾和檔案都是以一個叫“TrustedInstaller”做所有權的,目前使用者對其只有限制許可權。事實上,當前電腦的使用者組(Users使用者組)只有對檔案夾內容的唯讀許可權,而當前電腦群組管理使用者組(Administrators使用者組)有可以進行所有者(Owner)設定的權利。
那麼首先我們必須把檔案夾的所有者改成自己的使用者賬戶(而不是那個TrustedInstaller賬戶)。
注意:
我嘗試使用.NET存取控制API進行所有者設定(當目標所有者不是目前使用者,比如本例中的TrustedInstaller),但是即便是以管理員方式運行程式,仍然會拋出沒有許可權異常(System.UnauthorizedAccessException),所以修改貌似只能在Windows屬性對話方塊中進行。(當然我希望我是錯的,如果你知道怎樣在.NET下把TrustedInstaller賬戶改成當前賬戶,那麼請留言告訴我)
那麼我們就用Windows檔案夾(或檔案)屬性中的安全選項卡來先把所有者改成自己的賬戶。
在安全選項卡中選進階:
然後出現這個對話方塊,然後選擇所有者(我不知道中文系統中的Owner是不是”所有者”,不過無所謂了,意思類似,你肯定不會找不到吧):
上面列出了目前使用者賬戶,點擊下面的編輯把所有者改成自己的賬戶。(最後把下面的將所有者應用到子檔案和檔案夾也選上),如:
接下來等Windows把所有者都設定稱目前使用者:
注意此時某些檔案可能還是無法刪除,因為當前賬戶的許可權還是不夠的(僅僅是唯讀許可權),如:
你可以再通過屬性中的安全選項卡來瀏覽一下檔案夾的存取控制許可權定義,目前使用者仍然只有唯讀和修改所有者許可權。
接下來要做的就是去掉檔案夾內的所有這些限制我們進行刪除操作的自訂的存取控制許可權定義。這就可以使用我前幾天寫過的文章中的知識(.NET(C#):設定檔案系統對象的存取控制),我們使用文中結尾的那個清除自訂的存取控制選項的方法,如下:
//+ using System.IO;
//+ using System.Security.Principal;
//+ using System.Security.AccessControl;
static void ClearMyAccessRules(string folder)
{
foreach (var file in Directory.GetFiles(folder))
{
//建立空的ACL
var fileSecurity = new FileSecurity();
//設定繼承
fileSecurity.SetAccessRuleProtection(false, true);
//設定檔案
File.SetAccessControl(file, fileSecurity);
}
foreach (var dir in Directory.GetDirectories(folder))
{
//建立空的ACL
var dirSecurity = new DirectorySecurity();
//設定繼承
dirSecurity.SetAccessRuleProtection(false, true);
//設定檔案夾
Directory.SetAccessControl(dir, dirSecurity);
ClearMyAccessRules(dir);
}
}
使用上面的方法清除檔案夾內所有子檔案夾和子檔案的存取控制定義:
ClearMyAccessRules("F:\\Program Files");
等它執行完後(需要一段時間,如果檔案夾比較大的話),再看一下那些頑固檔案的屬性:
我們現在有全部許可權了。
最後直接刪除檔案夾,一切順利執行完畢,不會提示“沒有許可權”這類的錯誤了。
使用學到的編程知識,自己寫程式解決電腦的問題,這種感覺,呵呵,很有意思。