
Setting NTFS Permissions with C#
Originally published on my old blog at cumps.be on February 8, 2004.
Today I needed to set NTFS permissions in C# on some newly created directories.
No problem I thought, the CLR will have something for it somewhere in Security, so I checked Google in the hopes to find which class to use.
But Google didn’t find anything… This amazed me. “Why can’t I control NTFS permissions with .NET?!?”
After looking for an hour or so, I found a GotDotNet User Sample, called ‘ACLs in .NET’. Finally I thought, now it’s going to be plug-in and set rights.
Well this library is great. It makes setting NTFS rights so easy.
But it lacks a bit in documentation. Therefore I’m providing some of the code I used with it, it could help you. (or it could show my possibly bad coding style, as far as I know, it should be fine)
Reference the DLL, and use it:
using Microsoft.Win32.Security;
Here’s a method to add a dir, and set NTFS permissions on it for a given user:
private Boolean CreateDir(String strSitePath, String strUserName) {
Boolean bOk;
try {
Directory.CreateDirectory(strSitePath);
SecurityDescriptor secDesc = SecurityDescriptor.GetFileSecurity(strSitePath, SECURITY_INFORMATION.DACL_SECURITY_INFORMATION);
Dacl dacl = secDesc.Dacl;
Sid sidUser = new Sid (strUserName);
// allow: folder, subfolder and files
// modify
dacl.AddAce (new AceAccessAllowed (sidUser, AccessType.GENERIC_WRITE | AccessType.GENERIC_READ | AccessType.DELETE | AccessType.GENERIC_EXECUTE , AceFlags.OBJECT_INHERIT_ACE | AceFlags.CONTAINER_INHERIT_ACE));
// deny: this folder
// write attribs
// write extended attribs
// delete
// change permissions
// take ownership
DirectoryAccessType DAType = DirectoryAccessType.FILE_WRITE_ATTRIBUTES | DirectoryAccessType.FILE_WRITE_EA | DirectoryAccessType.DELETE | DirectoryAccessType.WRITE_OWNER | DirectoryAccessType.WRITE_DAC;
AccessType AType = (AccessType)DAType;
dacl.AddAce (new AceAccessDenied (sidUser, AType));
secDesc.SetDacl(dacl);
secDesc.SetFileSecurity(strSitePath, SECURITY_INFORMATION.DACL_SECURITY_INFORMATION);
bOk = true;
} catch {
bOk = false;
}
return bOk;
} /* CreateDir */
The AceFlags determine the level of inheritance on the object.
And the DirectoryAccessType is used to create an AccessType with some permissions not in the AccessType enum.
I hope this is useful.
Update: since .NET 2.0, System.Security.AccessControl (DirectorySecurity, FileSystemAccessRule) does this without an extra library.
You May Also Like

How This Blog Is Served
The machinery behind the words you're reading: Hugo, an unprivileged nginx, a strict CSP, and a deploy script.

Keeping the Old Addresses Alive
Nobody migrates email in one day. Fetchmail, a receive-only alias domain, and permanent redirects bridge the old world into the new one.

Making Roundcube Not Look Like 2012
Webmail is the face of the platform, so it got a Gmail-shaped skin, real calendar and contacts integration, and some money spent on polish.



