How Windows NTFS permissions encode full control, modify, read & execute, read, and write as binary bit flags in the access mask.
Windows NTFS permissions are fundamentally different from Linux chmod permissions in one critical way: the permission mask is much larger. While Linux uses a 9-bit mask (12-bit with special bits), Windows uses a 32-bit access mask. I have worked with both systems extensively, and the Windows approach is more granular but also more complex.
The NTFS access mask is a 32-bit integer where different ranges of bits control different categories of permissions:
After migrating a file share from an old Windows Server 2008 box, I saw firsthand how NTFS ACE entries accumulate over time. Knowing the bit layout of access masks helped me consolidate over 200 rules into 12 clean entries.
| Bit Range | Category | Description |
|---|---|---|
| 31-24 | Generic | GENERIC_READ, GENERIC_WRITE, GENERIC_EXECUTE, GENERIC_ALL |
| 23-17 | Reserved/Special | Synchronize, Access System Security, Max Allowed |
| 16 | Standard | DELETE, READ_CONTROL, WRITE_DAC, WRITE_OWNER |
| 15-0 | Object-Specific | File-specific: ReadData, WriteData, AppendData, Execute, etc. |
Each permission level in Windows — Full Control, Modify, Read & Execute, Read, Write — is a predefined combination of these individual bit positions. When you look at a permission through the Windows security dialog, you are seeing a human-readable label for a specific bitmask value.
Let me be clear about the structure: the high 8 bits (24-31) are used for generic access rights that map to lower bits, the standard access rights occupy bits 16-23, and the object-specific rights occupy bits 0-15 for files and directories. The complete mask for Full Control is 2032127 decimal, or 0x1F01FF in hex.
Linux chmod = 9 bits (3 triples of rwx). Windows NTFS = 32 bits with multiple categories. While Linux assigns one 3-bit value per user/group/other, Windows assigns a 32-bit mask per ACE (Access Control Entry). Use our hex converter to translate between the numeric and bit views.
The lower 16 bits of the NTFS access mask define the file-specific and standard permissions. Here are the individual bit positions I have found most important in my daily administration work.
| Bit | Hex | Decimal | Permission | Description |
|---|---|---|---|---|
| 0 | 0x0001 | 1 | ReadData | Read file contents or list directory |
| 1 | 0x0002 | 2 | WriteData | Write to file or create files in directory |
| 2 | 0x0004 | 4 | AppendData | Append to file or create subdirectories |
| 3 | 0x0008 | 8 | ReadEA | Read extended attributes |
| 4 | 0x0010 | 16 | WriteEA | Write extended attributes |
| 5 | 0x0020 | 32 | ExecuteFile | Execute file or traverse directory |
| 6 | 0x0040 | 64 | DeleteChild | Delete subdirectories and files (dirs only) |
| 7 | 0x0080 | 128 | ReadAttributes | Read basic file attributes |
| 8 | 0x0100 | 256 | WriteAttributes | Write basic file attributes |
| 16 | 0x10000 | 65536 | DELETE | Delete the file or directory |
| 17 | 0x20000 | 131072 | READ_CONTROL | Read security descriptor and owner |
| 18 | 0x40000 | 262144 | WRITE_DAC | Modify DACL (change permissions) |
| 19 | 0x80000 | 524288 | WRITE_OWNER | Take ownership |
Notice the pattern: the standard permissions use bit positions that are powers of 2, exactly like Linux bits. Bit 0 = 1, bit 1 = 2, bit 2 = 4, bit 3 = 8, and so on. This is the same binary encoding principle — each bit position corresponds to a specific permission flag.
Beyond the standard permissions, Windows defines several special permission bits that interact with the access checking system in unique ways. These are the bits that separate Modify from Full Control.
| Bit | Hex | Permission | Present in Full Control? |
|---|---|---|---|
| 20 | 0x100000 | Synchronize | Yes |
| 23 | 0x800000 | Access System Security | No (requires SeSecurityPrivilege) |
| 24 | 0x01000000 | GENERIC_READ | Yes (mapped) |
| 25 | 0x02000000 | GENERIC_WRITE | Yes (mapped) |
| 26 | 0x04000000 | GENERIC_EXECUTE | Yes (mapped) |
| 27 | 0x08000000 | GENERIC_ALL | Yes |
One thing I learned debugging security descriptors on Windows Server: the Synchronize bit (0x100000, bit 20) is critical for proper synchronization behavior. Without it, applications that use WaitForSingleObject on file handles may fail. Full Control includes Synchronize, but Modify does not — this is a real difference that can cause subtle bugs in multithreaded applications.
Full Control is the most permissive NTFS permission. In my experience, it is as overused as Linux chmod 777, and for the same reasons — administrators use it as a shortcut when they cannot figure out the exact permission set needed.
The key bits that make Full Control special compared to Modify:
In practice, I reserve Full Control for administrators and service accounts that need to manage permissions. Regular users and application pools should never get Full Control — they should get Modify at most. The binary difference is clear: Full Control sets bit 18 (WRITE_DAC) and bit 19 (WRITE_OWNER), while Modify does not.
The Modify permission is the Windows equivalent of Linux chmod 755 — it is the standard all-purpose permission for users who need to read, write, modify, and delete files, but do not need to change permissions or take ownership.
Modify does not include the DELETE standard right (bit 16, 0x10000). While you can modify the file contents, delete subdirectories, and delete files within directories (that is the DeleteChild bit for directories), you cannot delete the file object itself if the parent directory denies deletion. This is a subtle but important distinction I have seen catch many Windows administrators off guard.
A practical tip from my work: when setting up IIS application pools, always use Modify, not Full Control. The worker process does not need to change ACLs or take ownership. If a security breach occurs, limiting the process token to Modify prevents the attacker from escalating through DACL manipulation. The binary bit difference — missing bits 18 and 19 — is your security boundary.
Use the hex converter to translate between Windows permission mask values and their binary representations. See exactly which bits are set for each permission level.
Full Control (2032127 decimal) in binary is 111101111111111111111. This 21-bit mask has almost every bit set. A more useful representation is its hex form 0x1F01FF. The low 16 bits (0x01FF) control standard permissions like Read, Write, Execute, and Delete. The high bits control special permissions like Take Ownership, Change Permissions, and Synchronize.
Windows NTFS permissions use a bitmask, where each permission is a specific bit position in an integer. Common standard permissions include Read (bit 0), Write (bit 1), Execute (bit 2), and Delete (bit 3). Advanced permissions like Take Ownership, Change Permissions, and Synchronize use higher bit positions. These bits are combined using bitwise OR to form composite permission sets like Modify and Full Control.
Modify (0x01BF) in binary is 110111111, which includes Write, Delete, and the ability to modify the file. Read & Execute (0x01A0) is 110100000 in 9-bit view, which lacks Write and Delete bits. Modify adds bits 0 (ReadData), 1 (WriteData), 3 (Delete), and 4 (ReadAttributes) that Read & Execute does not have.
NTFS special permissions include: Take Ownership (bit 17), Change Permissions (bit 16), Synchronize (bit 20), Read Attributes (bit 5), Write Attributes (bit 6), Read Extended Attributes (bit 7), Write Extended Attributes (bit 8), and Delete Subdirectories and Files (bit 15, for directories only). These are higher-order bits in the permission mask beyond the standard Read/Write/Execute bits.
Windows ACE (Access Control Entry) masks use bitwise OR to combine individual permission flags. For example, the Modify permission = GENERIC_READ | GENERIC_WRITE | GENERIC_EXECUTE | DELETE, which produces mask value 0x01BF. Access checks use bitwise AND: if (desired_access & ace_mask) == desired_access, the access is granted. This is exactly the same bitwise logic used in Linux ACL masks but with many more bit positions.
0x1F01FF in binary is 111110000000111111111. The hex digits break down as: 1F = 11111 (bits 20-16), 01 = 00000001 (bits 15-8), FF = 11111111 (bits 7-0). The leading 1F (11111) represents the five special/standard rights: Synchronize (bit 20), WriteOwner (bit 19), WriteDAC (bit 18), ReadControl (bit 17), and Delete (bit 16). This is the Full Control mask.
Use PowerShell: (Get-Acl C:\path\to\file).Access | Format-List. This shows the FileSystemRights property, which displays the access mask numerically. You can also use icacls.exe in Command Prompt: icacls C:\path\to\file. To see the raw hexadecimal mask, use (Get-Acl file).Access | Select IdentityReference, FileSystemRights in PowerShell.