@@ -63,84 +63,84 @@ function Get-Shares {
6363 $stopwatch = New-Object System.Diagnostics.Stopwatch
6464 $stopwatch.Start ()
6565
66- $PermissionFlags = @ {
67- 0x1 = " Read-List"
68- 0x2 = " Write-Create"
69- 0x4 = " Append-Create Subdirectory"
70- 0x20 = " Execute file-Traverse directory"
71- 0x40 = " Delete child"
72- 0x10000 = " Delete"
73- 0x40000 = " Write access to DACL"
74- 0x80000 = " Write Owner"
75- }
66+ $accessMask = [Ordered ]@ {
67+ [uint32 ]' 0x80000000' = ' GenericRead'
68+ [uint32 ]' 0x40000000' = ' GenericWrite'
69+ [uint32 ]' 0x20000000' = ' GenericExecute'
70+ [uint32 ]' 0x10000000' = ' GenericAll'
71+ [uint32 ]' 0x02000000' = ' MaximumAllowed'
72+ [uint32 ]' 0x01000000' = ' AccessSystemSecurity'
73+ [uint32 ]' 0x00100000' = ' Synchronize'
74+ [uint32 ]' 0x00080000' = ' WriteOwner'
75+ [uint32 ]' 0x00040000' = ' WriteDAC'
76+ [uint32 ]' 0x00020000' = ' ReadControl'
77+ [uint32 ]' 0x00010000' = ' Delete'
78+ [uint32 ]' 0x00000100' = ' WriteAttributes'
79+ [uint32 ]' 0x00000080' = ' ReadAttributes'
80+ [uint32 ]' 0x00000040' = ' DeleteChild'
81+ [uint32 ]' 0x00000020' = ' Execute/Traverse'
82+ [uint32 ]' 0x00000010' = ' WriteExtendedAttributes'
83+ [uint32 ]' 0x00000008' = ' ReadExtendedAttributes'
84+ [uint32 ]' 0x00000004' = ' AppendData/AddSubdirectory'
85+ [uint32 ]' 0x00000002' = ' WriteData/AddFile'
86+ [uint32 ]' 0x00000001' = ' ReadData/ListDirectory'
87+ }
7688 }
7789
7890 process {
7991
80- $SharesArray = Get-WmiObject - class Win32_share
92+ $Shares = Get-SmbShare
93+ $ResultsArray = foreach ($Share in $Shares ) {
8194
82- if ( $SharesArray ) {
95+ $ShareAccessArray = Get-SmbShareAccess - InputObject $Share
8396
84- $ResultsArray = foreach ($Share in $SharesArray ) {
85-
86- $ShareName = $Share.Name
87-
88- try {
89- $ShareSettings = Get-WmiObject - class Win32_LogicalShareSecuritySetting - Filter " Name='$ShareName '"
90-
91- $DACLArray = $ShareSettings.GetSecurityDescriptor ().Descriptor.DACL
97+ $SharePermissions = " "
98+
99+ foreach ($ShareAccess in $ShareAccessArray ) {
100+
101+ $SharePermissions += " {0} - {1} - {2}`n " -f $ShareAccess.AccountName , $ShareAccess.AccessControlType , $ShareAccess.AccessRight
102+ }
92103
93- foreach ($DACL in $DACLArray ) {
104+
105+ try { $NTFSAccessArray = Get-Acl - Path $Share.Path } catch {}
106+
107+ $NTFSPermissions = " "
108+
109+ foreach ($NTFSAccess in $NTFSAccessArray.Access ) {
110+
111+ if ($NTFSAccess.FileSystemRights.value__ -match " -\d+" ){
112+ $NTFSAccessFileSystemRights = $accessMask.Keys |
113+ Where-Object { $NTFSAccess.FileSystemRights.value__ -band $_ } |
114+ ForEach-Object { $accessMask [$_ ] }
115+ $NTFSAccessFileSystemRights = $NTFSAccessFileSystemRights -join " , "
116+ }
117+ else
118+ {
119+ $NTFSAccessFileSystemRights = $NTFSAccess.FileSystemRights
120+ }
121+
122+ $NTFSPermissions += " {0} - {1} - {2}`n " -f $NTFSAccess.IdentityReference.Value , $NTFSAccess.AccessControlType , $NTFSAccessFileSystemRights
123+ }
94124
95- $TrusteeName = $DACL.Trustee.Name
96- $TrusteeDomain = $DACL.Trustee.Domain
97- $TrusteeSID = $DACL.Trustee.SIDString
125+ $output = New-Object - TypeName PSObject
98126
99- $DACLAceType = " "
127+ $output | Add-Member - MemberType NoteProperty - Name Name - Value $Share.Name
128+ $output | Add-Member - MemberType NoteProperty - Name Path - Value $Share.Path
129+ $output | Add-Member - MemberType NoteProperty - Name Description - Value $Share.Description
130+ $output | Add-Member - MemberType NoteProperty - Name SharePermissions - Value $SharePermissions
131+ $output | Add-Member - MemberType NoteProperty - Name NTFSPermissions - Value $NTFSPermissions
100132
101- # 1 Deny 0 Allow
102- if ($DACL.AceType )
103- { $DACLAceType = " Deny" }
104- else
105- { $DACLAceType = " Allow" }
106-
107- $SharePermission = foreach ($Key in $PermissionFlags.Keys ) { # Convert AccessMask to human-readable format
108-
109- if ($Key -band $DACL.AccessMask ) {
110-
111- $PermissionFlags [$Key ]
112- }
113- }
114- }
115- } catch {}
116-
117- $output = New-Object - TypeName PSObject
118-
119- $output | Add-Member - MemberType NoteProperty - Name Computer - Value $Share.PSComputerName
120- $output | Add-Member - MemberType NoteProperty - Name Name - Value $Share.Name
121- $output | Add-Member - MemberType NoteProperty - Name Path - Value $Share.Path
122- $output | Add-Member - MemberType NoteProperty - Name DESCRIPTION - Value $Share.DESCRIPTION
123- $output | Add-Member - MemberType NoteProperty - Name TrusteeName - Value $TrusteeName
124- $output | Add-Member - MemberType NoteProperty - Name TrusteeDomain - Value $TrusteeDomain
125- $output | Add-Member - MemberType NoteProperty - Name TrusteeSID - Value $TrusteeSID
126- $output | Add-Member - MemberType NoteProperty - Name AccessType - Value $DACLAceType
127- $output | Add-Member - MemberType NoteProperty - Name AccessMask - Value $DACL.AccessMask
128- $output | Add-Member - MemberType NoteProperty - Name SharePermissions - Value ($SharePermission -join " , " )
129-
130- $output
131-
132- }
133-
134- foreach ($Result in $ResultsArray ) {
135-
136- $Result | Add-Member - MemberType NoteProperty - Name " Host" - Value $env: COMPUTERNAME
137- $Result | Add-Member - MemberType NoteProperty - Name " DateScanned" - Value $DateScanned
138- $Result | Add-Member - MemberType NoteProperty - Name " ModuleVersion" - Value $ModuleVersion
139- }
133+ $output
134+ }
135+
136+ foreach ($Result in $ResultsArray ) {
140137
141- return $ResultsArray | Select-Object Host, DateScanned, Name, Path, Description, TrusteeName,
142- TrusteeDomain, TrusteeSID, AccessType, AccessMask, SharePermissions
138+ $Result | Add-Member - MemberType NoteProperty - Name " Host" - Value $env: COMPUTERNAME
139+ $Result | Add-Member - MemberType NoteProperty - Name " DateScanned" - Value $DateScanned
140+ $Result | Add-Member - MemberType NoteProperty - Name " ModuleVersion" - Value $ModuleVersion
143141 }
142+
143+ return $ResultsArray | Select-Object Host, DateScanned, Name, Path, Description, SharePermissions, NTFSPermissions
144144 }
145145
146146 end {
0 commit comments