using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using Alphaleonis.Win32.Filesystem; using Security2; namespace NTFSSecurity { public partial class ShowSimpleAccessForm : Form { private IEnumerable directoryList; private IQueryable aceList; private IEnumerable searchResultByFolder; private int searchResultByFolderIndex; public IEnumerable DirectoryList { get { return directoryList; } } public IEnumerable AceList { get { return aceList; } } public ShowSimpleAccessForm() { InitializeComponent(); } public void BuildDirectoryTreeNodes() { string previousPath = string.Empty; DirectoryTreeNode previousNode; DirectoryTreeNode rootNode; var rootDirectory = directoryList.First(); rootNode = new DirectoryTreeNode(rootDirectory.FullName, rootDirectory.Name, aceList.Where(ace => ace.FullName == rootDirectory.Name)); previousNode = rootNode; trvDirectories.Nodes.Add(rootNode); foreach (var directory in directoryList.Skip(1)) { if (previousNode.Name == directory.GetParent().FullName) { var node = new DirectoryTreeNode(directory.FullName, directory.Name, aceList.Where(ace => ace.FullName == directory.FullName)); previousNode.Nodes.Add(node); } else { previousNode = (DirectoryTreeNode)trvDirectories.Nodes.Find(directory.GetParent().FullName, true).FirstOrDefault(); if (previousNode != null) { var node = new DirectoryTreeNode(directory.FullName, directory.Name, aceList.Where(ace => ace.FullName == directory.FullName)); previousNode.Nodes.Add(node); } else { var node = new DirectoryTreeNode(directory.FullName, directory.Name, aceList.Where(ace => ace.FullName == directory.FullName)); previousNode.Nodes.Add(node); } } } } public void BuildDirectoryTreeNodes(IEnumerable directoryList, IQueryable aceList) { this.directoryList = directoryList; this.aceList = aceList; this.BuildDirectoryTreeNodes(); } private void trvDirectories_AfterSelect(object sender, TreeViewEventArgs e) { lstPermissions.Items.Clear(); foreach (var ace in aceList.Where(ace => ace.FullName == e.Node.Name)) { ListViewItem listItem = new ListViewItem(); listItem.Name = e.Node.Name; listItem.Text = ace.Identity.AccountName; listItem.SubItems.AddRange(new string[] { ace.AccessRights.ToString(), ace.AccessControlType.ToString(), e.Node.FullPath }); listItem.ImageIndex = 1; lstPermissions.Items.Add(listItem); } if (lstPermissions.Items.Count > 0) { foreach (ColumnHeader column in lstPermissions.Columns) { column.AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent); } } } private void chkRemoveFoldersWithoutAccess_CheckedChanged(object sender, EventArgs e) { if (chkRemoveFoldersWithoutAccess.Checked) { RemoveFoldersWithoutAccess((DirectoryTreeNode)trvDirectories.Nodes[0]); } else { trvDirectories.Nodes.Clear(); BuildDirectoryTreeNodes(); } } public void RemoveFoldersWithoutAccess(DirectoryTreeNode node) { for (int i = 0; i < node.Nodes.Count; i++) { if (node.Nodes[i].GetNodeCount(false) > 0) RemoveFoldersWithoutAccess((DirectoryTreeNode)node.Nodes[i]); if (node.Nodes[i].Nodes.Count == 0 & ((DirectoryTreeNode)node.Nodes[i]).Acl.Count() == 0) { node.Nodes.Remove(node.Nodes[i]); i--; } } } private void btnSearchForFolder_Click(object sender, EventArgs e) { searchResultByFolder = null; searchResultByFolderIndex = 0; trvDirectories.HideSelection = false; searchResultByFolder = FindNodeByFolder((DirectoryTreeNode)trvDirectories.Nodes[0], txtSearchForFolder.Text); if (searchResultByFolder.Count() > 0) { btnSearchForFolderNext.Enabled = true; btnSearchForFolderPrev.Enabled = true; trvDirectories.SelectedNode = searchResultByFolder.First(); searchResultByFolderIndex = 0; } else { btnSearchForFolderNext.Enabled = false; btnSearchForFolderPrev.Enabled = false; } } private IEnumerable FindNodeByFolder(DirectoryTreeNode node, string search) { if (node.Text.ToLower().Contains(search.ToLower())) { yield return node; } foreach (DirectoryTreeNode childNode in node.Nodes) { foreach (DirectoryTreeNode match in this.FindNodeByFolder(childNode, search)) { yield return match; } } } private IEnumerable FindNodeByIdentity(DirectoryTreeNode node, string search) { if (node.Acl.Where(ace => ace.Identity.AccountName.ToLower().Contains(search.ToLower())).Count() > 0) { yield return node; } foreach (DirectoryTreeNode childNode in node.Nodes) { foreach (DirectoryTreeNode match in this.FindNodeByIdentity(childNode, search)) { yield return match; } } } private void btnSearchForFolderNext_Click(object sender, EventArgs e) { if (searchResultByFolder.Count() > searchResultByFolderIndex + 1) { searchResultByFolderIndex++; trvDirectories.SelectedNode = searchResultByFolder.ElementAt(searchResultByFolderIndex); } } private void btnSearchForFolderPrev_Click(object sender, EventArgs e) { if (searchResultByFolderIndex - 1 > -1) { searchResultByFolderIndex--; trvDirectories.SelectedNode = searchResultByFolder.ElementAt(searchResultByFolderIndex); } } private void btnSearchForIdentity_Click(object sender, EventArgs e) { trvDirectories.HideSelection = false; searchResultByFolder = null; searchResultByFolderIndex = 0; searchResultByFolder = FindNodeByIdentity((DirectoryTreeNode)trvDirectories.Nodes[0], txtSearchForIdentity.Text); if (searchResultByFolder.Count() > 0) { btnSearchForIdentityNext.Enabled = true; btnSearchForIdentityPrev.Enabled = true; trvDirectories.SelectedNode = searchResultByFolder.First(); searchResultByFolderIndex = 0; } else { btnSearchForIdentityNext.Enabled = false; btnSearchForIdentityPrev.Enabled = false; } } private void btnSearchForIdentityPrev_Click(object sender, EventArgs e) { if (searchResultByFolder.Count() > searchResultByFolderIndex + 1) { searchResultByFolderIndex++; trvDirectories.SelectedNode = searchResultByFolder.ElementAt(searchResultByFolderIndex); } } private void btnSearchForIdentityNext_Click(object sender, EventArgs e) { if (searchResultByFolderIndex - 1 > -1) { searchResultByFolderIndex--; trvDirectories.SelectedNode = searchResultByFolder.ElementAt(searchResultByFolderIndex); } } } public class DirectoryTreeNode : TreeNode { private IList acl; public IList Acl { get { return acl; } } public DirectoryTreeNode(string key, string text) : base(text) { this.Name = key; } public DirectoryTreeNode(string key, string text, IQueryable acl) : this(key, text) { this.acl = acl.ToList(); if (acl.Count() == 0) { this.ForeColor = Color.Gray; } } } }