C#更改檔案訪問許可權所有者(適用於各個Windows版本)

@Me發表於2015-10-10

前面也提到了,前段時間在做Online Judge系統,在正式上線前有幾個比較老的版本,其中第一個版本使用ACL來控制許可權以確保安全(但是這個版本完全建立在IIS上,所以這樣做是沒效果的),遇到了一些問題,至於問題是什麼以後有機會再說,那麼解決這些問題曾想到一個辦法,更改檔案的所有者。

在搜尋引擎裡搜尋“C# 修改檔案所有者”都會搜尋到很多類似《c# 更改檔案訪問許可權 所有者(適用於win7以下版本) 》,但是就沒出現過《c# 更改檔案訪問許可權 所有者(適用於各個Windows版本) 》。為什麼要特意強調適用於win7以下版本,是因為

FileInfo fi = new FileInfo(@"d:\囧.txt");
FileSecurity fs = fi.GetAccessControl();
NTAccount currentAccount = (NTAccount)fs.GetOwner(typeof(NTAccount));
Console.WriteLine("先前的所有者為 " + currentAccount.Value);
NTAccount admins = new NTAccount("administrators");//注意 這裡是administrators 而不是administrator 他表示管理員組而非一個單個的帳號
fs.SetOwner(admins);
fi.SetAccessControl(fs);
Console.WriteLine("當前的所有者為 " + fi.GetAccessControl().GetOwner(typeof(NTAccount)).Value); 

這樣做會在Windows 7以及更高版本上go die(不允許將安全識別符號作為此物件的所有者),高版本Windows需要用Win32API,如果手工去操作會複雜很多。偶然在StackOverflow上找到一篇文章說到了一個解決方案,由於年代久遠不可考(其實是懶當時沒記忘了)所以就不貼原文了。

爆棧網上的答主給的方法是使用一個外部庫,這個庫看名字就知道是幹什麼的,用起來也特別方便:

貼段老程式碼(應該是這麼用的,這個版本還能跑起來):

File.Copy(outfileName, tempfileName);
var everyone = new SecurityIdentifier(WellKnownSidType.WorldSid, null);
var domain = new FileInfo(outfileName).GetAccessControl().GetOwner(typeof(NTAccount)).Value.Split('\\')[0];
var user = new FileInfo(outfileName).GetAccessControl().GetOwner(typeof(NTAccount)).Value.Split('\\')[1];
var ediFileOwner = new NTAccount(domain, user);
var fileSecurity = File.GetAccessControl(outfileName);
File.SetAccessControl(outfileName, fileSecurity);
File.Delete(outfileName);
File.Move(tempfileName, outfileName);
var aosSID = (SecurityIdentifier)ediFileOwner.Translate(typeof(SecurityIdentifier));
File.SetAccessControl(outfileName, fileSecurity);
using (new Impersonator(/*UserName*/, domain, /*UserPassword*/))
{
    fileSecurity = File.GetAccessControl(outfileName);
    fileSecurity.SetOwner(ediFileOwner);
    File.SetAccessControl(outfileName, fileSecurity);
}

在註釋處填寫要更改為的所有者的賬戶名和密碼。雖然看起來很複雜的樣子,其實過程非常簡單:建立原始檔的副本,獲得它的資訊,幹掉原始檔,改名副本然後呼叫Impersonator來設定所有者。

使用前,這個鍋是楊某的:

enter image description here

執行後,這個鍋就甩了:

enter image description here

相關文章