Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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(string.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?

like image 884
Steinthor.palsson Avatar asked Mar 20 '11 13:03

Steinthor.palsson


2 Answers

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);    
}
like image 74
Maverik Avatar answered Sep 23 '22 03:09

Maverik


Did you elevate your process via UAC first? On Windows 7, without UAC escalation, your process is running with the lower privileged token.

like image 43
pjulien Avatar answered Sep 21 '22 03:09

pjulien