Unfortunately it's not possible to filter out all directories without the required permissions. You need to implement your own recursive function to deal with the problem by catching the UnauthorizedAccessException. Since there could be many exceptions the way is not very fast but reliable like explained in this question:
[...] permissions (even file existence) are volatile — they can change at any time [...]
Here is my possible solution:
public static void GetDirectories(string path, Action<string> foundDirectory)
{
string[] dirs;
try
{
dirs = Directory.GetDirectories(path, "*", SearchOption.TopDirectoryOnly);
}
catch (UnauthorizedAccessException)
{
//Ignore a directory if an unauthorized access occured
return;
}
foreach (string dir in dirs)
{
foundDirectory(dir);
//Recursive call to get all subdirectories
GetDirectories(dir, foundDirectory);
}
}
Simply call the function like
List<string> allDirectories = new List<string>();
GetDirectories(@"C:\Users\", d => allDirectories.Add(d));