Imports System.Collections
Imports System.Collections.Generic
Imports Microsoft.VisualBasic
Imports System.Security.AccessControl
Imports Newtonsoft.Json.Linq
Imports Newtonsoft.Json.Converters
Imports Newtonsoft.Json.Serialization
Public Module DirectoryExtensions
Function GetFileSystemAccessRules(d As DirectoryInfo) As IEnumerable(Of FileSystemAccessRule)
Dim ds As DirectorySecurity = d.GetAccessControl()
Dim arrRules As AuthorizationRuleCollection = ds.GetAccessRules(True, True, GetType(Security.Principal.NTAccount))
Return arrRules.Cast(Of FileSystemAccessRule)()
Public Function SerializeFileAccessRules(ByVal curDirectory As String, Optional ByVal formatting As Formatting = Formatting.Indented)
Dim di As DirectoryInfo = New DirectoryInfo(curDirectory)
Dim directoryQuery = RecursiveEnumerableExtensions.Traverse(di, Function(d) d.GetDirectories())
Dim list = directoryQuery.Select(
.permissions = GetFileSystemAccessRules(d).Select(
.IdentityReference = a.IdentityReference.ToString(),
.AccessControlType = a.AccessControlType.ToString(),
.FileSystemRights = a.FileSystemRights.ToString(),
.IsInherited = a.IsInherited.ToString()
Return JsonConvert.SerializeObject(list, formatting)
Public Module RecursiveEnumerableExtensions
Iterator Function Traverse(Of T)(ByVal root As T, ByVal children As Func(Of T, IEnumerable(Of T)), ByVal Optional includeSelf As Boolean = True) As IEnumerable(Of T)
If includeSelf Then Yield root
Dim stack = New Stack(Of IEnumerator(Of T))()
stack.Push(children(root).GetEnumerator())
Dim enumerator = stack.Peek()
If Not enumerator.MoveNext() Then
stack.Push(children(enumerator.Current).GetEnumerator())
For Each enumerator In stack
Test(Directory.GetCurrentDirectory())
Friend Sub Test(ByVal curDirectory As String)
Dim json As String = DirectoryExtensions.SerializeFileAccessRules(curDirectory)
File.WriteAllText("ABCD.json", json)
Console.WriteLine("Environment version: " & Environment.Version.ToString())
Console.WriteLine("Json.NET version: " & GetType(JsonSerializer).Assembly.FullName)
TestClass.Test("C:\TEMP")
Console.WriteLine("Unhandled exception: ")