I recently had to make a quick Backup & Restore of ACLs three levels deep. Nothing fancy, just two functions, but that got me thinking…
Why not make a class of this?
And so I did! Here’s the framework for the class:
Here’s a list of the methods:
- Backup. Backup SDDL from the property $Folder of the class
- Restore. Restore SDDL to the property $Folder of the class
- Clone. Clone will take a target Folder and clone the SDDL of $Folder to it
- ConvertSDDLToAccess. This will enumerate what the SDDL stands for
The default constructor will evaluate the folder used to instantiate the object. If successful, the SDDL, Owner and Access is retrieved using the Backup() method. All actions are registered for future reference.
Instantiating is pretty straightforward:
This will retrieve the SDDL for the folder and enumerate the Access.
Restore is a bit tricky. For one you need to make sure it isn’t empty. Set-Acl has no problem setting an empty SDDL, blowing everything open (worst case scenario, and that’s why you should test this in a lab first!). The other challenge is having a valid SDDL string. You can change the SDDL string if you want to something gibberish, hence the typecast as a precaution.
The same goes for cloning. In this case we need to test the target path. Alternatively, you could also change the Folder to a new path… It works, you’d just have misleading ActionHistory entries… I wonder if there’s a way to make this read-only, just thinking out loud here… (note to self)
This is just a lil’ something extra. Like I said in a previous blog SDDL really gives more information. For one, the SID will let you know which domain this object belongs to. One thing I ran into with ReACL is that SIDHistory will resolve to the current NTAccount. This had me puzzled for a while until I saw that the SIDs in SDDL where different.
Here’s what the ouput looks like:
Now for those of you that are wondering just what is this AccessMask, wonder no more! 🙂
Remember the RoboCopy ExitCodes blog I did a while back? Well it’s the same principal 🙂 This is why classes & everything related should be on your radar…
Here’s how this works…
Say I wanted to evaluate the AccessMask of a SDDL entry
Here I have the SID & the NTAccount. This is the builtin administrators account but it also works for Domain accounts.
There’s a private function that will translate the SID accordingly.
To see what the account can actually do we can enumerate the AccessMask
This is what we’d see using the advanced Security GUI tab of a folder.
Not bad… Not bad at all…
I can’t state this enough, SDDL is NOT to be be trifled with. Yes you need admin rights and please try this is a testlab first. SDDL is very potent, if used with caution, it could do a whole bit of good!
So finally, here’s the code…
Hope it’s worth something to you…