Taking ownership of a file or folder
Before I pull out the rest of my hair I'd like to get some input on this.
I'm trying to take ownership of a folder. I'm running the program as administrator of course and I do have rights to take ownership since I can change the owner in explorer.I can however change the owner if either administrator or my account owns it, and I can change permissions if I already have ownership.
If I try to give myself ownership of a file, lets say owned by SYSTEM, then I get an unauthorizedexception.I've tried some different things with the accesscontrol methods but nothing works, this latest method I think is directly by the book.
private static void makePerm(string file, NTAccount account)
{
FileInfo finfo = new FileInfo(file);
FileSecurity fsecurity = finfo.GetAccessControl();
//also tried it like this //fsecurity.ResetAccessRule(new FileSystemAccessRule(str开发者_开发知识库ing.Format(@"{0}\{1}", Environment.UserDomainName.ToString(), Environment.UserDomainName.ToString()), FileSystemRights.FullControl, AccessControlType.Allow));
fsecurity.SetOwner(account);
finfo.SetAccessControl(fsecurity);
}
I'm trying this on Windows 7 btw.
What am I missing here?I had the same problem and just posting here for anybody else who may come here searching like me:
You need to explicitly enable SeTakeOwnershipPrivilege in code as Luke mentions above. I found this Process Privileges to be really helpful dealing with this sort of thing.
Here is how it fixed my code:
using System;
using System.Diagnostics;
// ...
using (new ProcessPrivileges.PrivilegeEnabler(Process.GetCurrentProcess(), Privilege.TakeOwnership))
{
directoryInfo = new DirectoryInfo(path);
directorySecurity = directoryInfo.GetAccessControl();
directorySecurity.SetOwner(WindowsIdentity.GetCurrent().User);
Directory.SetAccessControl(path, directorySecurity);
}
Did you elevate your process via UAC first? On Windows 7, without UAC escalation, your process is running with the lower privileged token.
精彩评论