If you ever tried using permissions in TFS, you know that there are four kinds of permission settings that can be set for the user or group(Explicit/Implicit Allow and Explicit/Implicit Deny). Specific effective permission is defined as combination of permission settings set for user and all groups the user belongs to; the settings are combined according to the following order of precedence (from more potent to less potent setting)
- Implicit Allow is defined when user is a member of Team Foundation Administrators group or [Project]/Project Administrators group
- Explicit Deny is defined when Deny is explicitly set for user/group
- Explicit Allow is defined when Allow is explicitly set for user/group
- Implicit Deny (None) is in effect when no setting is specified
Two most important rules out of four (that are frequently forgotten and lead to “unexplained” effective permissions) are “Implicit Allow” (if the user is in admin group, the effective permissions are “everything is allowed” no matter what) and “Explicit Deny” (if Deny is set somewhere and user is not an admin, you better find that somewhere; no amount of additional “Allow” set will help).
Let’s illustrate the above with the example. Assume that there are four groups defined: Team Foundation Administrators, Contractors, Developers and Testers; and the permission settings for “Read” permission on $/Project folder are defined as following:
|Team Foundation Administrators|
In the example below, the users effective Read access will depend on the combined group membership (as an exercise, the last column is made invisible – select it to see the answer):
|User name||Team Foundation |
Since current version of TFS does not provide effective permission indication in UI, the exercise above is something you will have to perform now and again.
This piece of wisdom (together with lots of additional pieces) can be found on MSDN; if you are planning permissions rollout or find yourself in a tight place staring at permissions set and not understanding why the things do not work as desired this is where you go.
Thanks to Brian Randell and Sam Heald for this post idea.