Need expert help—fast? Use the Help Bell for personalized assistance getting answers to your important questions.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Management;
using System.Xml.Linq;
using System.IO;
using System.Security;
using System.Security.AccessControl;
using System.Security.Principal;
using System.DirectoryServices.ActiveDirectory;
using System.DirectoryServices;
using System.Windows.Forms;
namespace DirectoryScan
{
public class ACL
{
/// <summary>
/// Variables
/// </summary>
private String mDirectoryName = string.Empty;
private String mAccountName = string.Empty;
private String mTyp = string.Empty;
private String mRights = string.Empty;
private String mInherited = string.Empty;
private String mInheritanceFlags = string.Empty;
private String mPropagationFlags = string.Empty;
private int mDirectoryCount = 0;
/// <summary>
/// Default Constructor
/// </summary>
public ACL()
{
}
public static Dictionary<String, List<ACL>> GetACLInformation(List<Object> includePath, List<Object> excludePath, bool recursive)
{
// Create Collection Instance
Dictionary<String,List<ACL>> aclSet = new Dictionary<String,List<ACL>>();
foreach (String driveInfo in includePath)
{
// Call recursive private Method
readDir(new DirectoryInfo(driveInfo), excludePath, aclSet, recursive);
}
// Return Dictionary
return new Dictionary<string,List<ACL>>(aclSet);
}
private static void readDir(DirectoryInfo directory, List<Object> excludePath, Dictionary<String,List<ACL>> lAclSet, bool recursive)
{
try
{
// Check exclude Paths
if (! excludePath.Contains(directory.FullName.ToString().Trim()))
{
// Save Directory Name
String dirName = directory.FullName.ToString();
// Count Subfolders
DirectoryInfo[] subDirs = directory.GetDirectories();
String dirCount = subDirs.Length.ToString();
// Create Key
String key = dirName + ";" + dirCount;
// Security Object
DirectorySecurity ds = directory.GetAccessControl(AccessControlSections.Access);
// Showing access rules data
AuthorizationRuleCollection arc = ds.GetAccessRules(true, true, typeof(NTAccount));
// Create List
List<ACL> aclList = new List<ACL>();
foreach (FileSystemAccessRule ar in arc)
{
// Create Object
ACL acl = new ACL();
// Set Values
acl.AccountName = ar.IdentityReference.Value.ToString();
acl.Typ = ar.AccessControlType.ToString();
acl.Rights = ar.FileSystemRights.ToString();
acl.Inherited = ar.IsInherited.ToString();
acl.InheritanceFlags = ar.InheritanceFlags.ToString();
acl.PropagationFlags = ar.PropagationFlags.ToString();
// Add to List
aclList.Add(acl);
}
// Add to Dictionary
if (! lAclSet.ContainsKey(key))
{
lAclSet.Add(key, aclList);
}
}
// Search in Subfolders if recursive true
if (recursive)
{
foreach (DirectoryInfo subDirectory in directory.GetDirectories())
{
readDir(subDirectory, excludePath, lAclSet, recursive);
}
}
}
catch
{
return;
}
}
public String DirectoryName
{
get { return mDirectoryName; }
set { mDirectoryName = value; }
}
public String AccountName
{
get { return mAccountName; }
set { mAccountName = value; }
}
public String Typ
{
get { return mTyp; }
set { mTyp = value; }
}
public String Rights
{
get { return mRights; }
set { mRights = value; }
}
public String Inherited
{
get { return mInherited; }
set { mInherited = value; }
}
public String InheritanceFlags
{
get { return mInheritanceFlags; }
set { mInheritanceFlags = value; }
}
public String PropagationFlags
{
get { return mPropagationFlags; }
set { mPropagationFlags = value; }
}
public int DirectoryCount
{
get { return mDirectoryCount; }
set { mDirectoryCount = value; }
}
}
}
method([your arguments], int depth)
{
if (depth > maxDepth) return;
[your code...]
foreach (directory in directories)
{
method([your arguments], depth + 1);
}
}
Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.
Have a better answer? Share it in a comment.
From novice to tech pro — start learning today.
Open in new window