2008-09-30 44 views
24

Tôi có yêu cầu đọc và hiển thị chủ sở hữu tệp (cho mục đích kiểm tra) và có khả năng thay đổi tệp đó (đây là yêu cầu phụ). Có bất kỳ wrapper C# tốt đẹp?Nhận/thiết lập chủ sở hữu tệp trong C#

Sau một google nhanh chóng, tôi thấy chỉ the WMI solution và một gợi ý để PInvoke GetSecurityInfo

+0

Xem thêm http://stackoverflow.com/questions/5241718/taking-ownership-of-files-with-broken-permissions và http://stackoverflow.com/questions/5368825/taking-ownership- of-a-file-or-folder –

Trả lời

42

Không cần phải P/Invoke. System.IO.File.GetAccessControl sẽ trả về đối tượng FileSecurity, có phương thức GetOwner.

Edit: Đọc sách chủ sở hữu là khá đơn giản, mặc dù đó là một chút của một API cồng kềnh:

const string FILE = @"C:\test.txt"; 

var fs = File.GetAccessControl(FILE); 

var sid = fs.GetOwner(typeof(SecurityIdentifier)); 
Console.WriteLine(sid); // SID 

var ntAccount = sid.Translate(typeof(NTAccount)); 
Console.WriteLine(ntAccount); // DOMAIN\username 

Thiết chủ sở hữu đòi hỏi một cuộc gọi đến SetAccessControl để lưu thay đổi. Ngoài ra, bạn vẫn bị ràng buộc bởi các quy tắc sở hữu Windows - bạn không thể chỉ định quyền sở hữu cho một tài khoản khác. Bạn có thể trao quyền sở hữu, và họ phải sở hữu.

var ntAccount = new NTAccount("DOMAIN", "username"); 
fs.SetOwner(ntAccount); 

try { 
    File.SetAccessControl(FILE, fs); 
} catch (InvalidOperationException ex) { 
    Console.WriteLine("You cannot assign ownership to that user." + 
    "Either you don't have TakeOwnership permissions, or it is not your user account." 
    ); 
    throw; 
} 
+4

Khi tôi thử nó, nó chỉ trả về "\\ BUILTIN \ Administrators" với tư cách là chủ sở hữu. Mặc dù trong thám hiểm nó cho thấy chủ sở hữu như đăng nhập của tôi trên tên miền chính xác, vv –

Các vấn đề liên quan