C#更改檔案訪問許可權所有者(適用於各個Windows版本)
前面也提到了,前段時間在做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來設定所有者。
使用前,這個鍋是楊某的:
執行後,這個鍋就甩了:
相關文章
- android:各種訪問許可權PermissionAndroid訪問許可權
- Android7.0檔案訪問許可權Android訪問許可權
- win共享檔案沒有許可權訪問怎麼辦 win10共享檔案許可權訪問的方法Win10
- Linux更改檔案及目錄許可權問題Linux
- 關於oracle檔案許可權的問題Oracle
- 怎樣提高Windows Azure Cloud Service中的WebRole的檔案訪問許可權WindowsCloudWeb訪問許可權
- Windows 11 資料夾訪問被拒絕,如何奪取檔案許可權Windows
- java的訪問許可權Java訪問許可權
- hdfs檔案本地許可權問題
- linux檔案許可權問題Linux
- 改變檔案或目錄的訪問許可權命令(轉)訪問許可權
- linux 檔案許可權 s 許可權和 t 許可權解析Linux
- postgresql關於訪問檢視需要的許可權SQL
- 淺析Windows的訪問許可權檢查機制Windows訪問許可權
- Java 訪問許可權控制(6)Java訪問許可權
- mongoDB 3.0 安全許可權訪問MongoDB
- Swift4.0 訪問許可權Swift訪問許可權
- AndroidPermission訪問許可權大全Android訪問許可權
- public, private, protected 訪問許可權訪問許可權
- Laravel 日誌檔案許可權問題Laravel
- Android 7.0之訪問檔案的許可權和FileProvider類AndroidIDE
- Linux改變檔案或目錄的訪問許可權命令Linux訪問許可權
- 如何更改某個檔案的只讀許可權為可編輯許可權 張翠娉2022-07-20
- 【LIUNX】目錄或檔案許可權,許可權授予
- 自定義Android應用的訪問許可權Android訪問許可權
- Windows7如何取得檔案管理員許可權?Windows
- 開放windows 7 APPLICATION DA他的訪問許可權WindowsAPP訪問許可權
- Quarkus中基於角色的許可權訪問控制教程
- win10共享檔案沒有許可權訪問該怎麼辦Win10
- Linux命令:改變檔案或目錄的訪問許可權(轉)Linux訪問許可權
- Linux檔案許可權Linux
- chomd檔案許可權授予
- 修改檔案的許可權
- oracle許可權整理檔案Oracle
- Linux 檔案許可權Linux
- 使用nginx控制ElasticSearch訪問許可權NginxElasticsearch訪問許可權
- Think IN JAVA --------JAVA訪問許可權控制Java訪問許可權
- Atitit godaddy 檔案許可權 root許可權設定Go