Dargslan.WinNetworkShare.psm1

<#
.SYNOPSIS
    Windows network share enumeration and security toolkit — accessible shares, null sessions, anonymous access, and share permission audit
.DESCRIPTION
    2026 Edition — Dargslan Windows Admin Toolkit.
    https://dargslan.com | https://dargslan.com/cheat-sheets
.LINK
    https://dargslan.com
#>


function Get-NetworkShareSecurity {
    <#
    .SYNOPSIS
        Audit network share security and anonymous access
    .DESCRIPTION
        Part of Dargslan.WinNetworkShare (2026 Edition) — https://dargslan.com
    #>

    [CmdletBinding()] param([switch]$Json)
    $report = [ordered]@{
        LocalShares = Get-SmbShare -ErrorAction SilentlyContinue | Select-Object Name, Path, Description, CurrentUsers, ShareType, @{N="Special";E={$_.Special}}
        SharePermissions = Get-SmbShare -ErrorAction SilentlyContinue | Where-Object { -not $_.Special } | ForEach-Object {
            $share = $_.Name
            Get-SmbShareAccess -Name $share -ErrorAction SilentlyContinue | Select-Object @{N="Share";E={$share}}, AccountName, AccessControlType, AccessRight
        }
        NullSession = [PSCustomObject]@{
            RestrictAnonymous = (Get-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\Lsa" -ErrorAction SilentlyContinue).RestrictAnonymous
            RestrictAnonymousSAM = (Get-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\Lsa" -ErrorAction SilentlyContinue).RestrictAnonymousSAM
            EveryoneIncludesAnonymous = (Get-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\Lsa" -ErrorAction SilentlyContinue).EveryoneIncludesAnonymous
        }
        OpenSessions = Get-SmbSession -ErrorAction SilentlyContinue | Select-Object ClientComputerName, ClientUserName, NumOpens | Select-Object -First 10
        Warnings = @()
    }
    if ($report.NullSession.RestrictAnonymous -eq 0) { $report.Warnings += "Anonymous access not restricted" }
    if ($report.NullSession.EveryoneIncludesAnonymous -eq 1) { $report.Warnings += "Everyone includes anonymous users" }
    $report.SharePermissions | Where-Object { $_.AccountName -match "Everyone" -and $_.AccessRight -match "Full|Change" } | ForEach-Object { $report.Warnings += "Share $($_.Share) gives $($_.AccessRight) to Everyone" }
    $report.Summary = [PSCustomObject]@{ TotalShares = ($report.LocalShares | Measure-Object).Count; NonSpecial = ($report.LocalShares | Where-Object {-not $_.Special} | Measure-Object).Count; ActiveSessions = ($report.OpenSessions | Measure-Object).Count; Warnings = $report.Warnings.Count }
    if ($Json) { return $report | ConvertTo-Json -Depth 3 }
    Write-Host "`n [Network Share Security - 2026]" -ForegroundColor Cyan
    $report.Summary | Format-List
    $report.LocalShares | Where-Object {-not $_.Special} | Format-Table Name, Path, CurrentUsers -AutoSize
    if ($report.Warnings) { $report.Warnings | ForEach-Object { Write-Host " Warning: $_" -ForegroundColor Yellow } }
    return $report
}

Export-ModuleMember -Function *