美文网首页
2021-12-15 powershell 简单web程序

2021-12-15 powershell 简单web程序

作者: randyliu6 | 来源:发表于2021-12-15 16:18 被阅读0次

    function Get-DirectoryContent {

    <#

        .SYNOPSIS

            Function to get directory content

        .EXAMPLE

            Get-DirectoryContent -Path "C:\" -HeaderName "poshserver.net" -RequestURL "http://poshserver.net" -SubfolderName "/"

    #>

    [CmdletBinding(SupportsShouldProcess = $true)]

    param (

        [Parameter(

            Mandatory = $true,

            HelpMessage = 'Directory Path')]

        [string]$Path,

        [Parameter(

            Mandatory = $false,

            HelpMessage = 'Header Name')]

        [string]$HeaderName,

        [Parameter(

            Mandatory = $false,

            HelpMessage = 'Request URL')]

        [string]$RequestURL,

        [Parameter(

            Mandatory = $false,

            HelpMessage = 'Subfolder Name')]

        [string]$SubfolderName,

        [string]$Root

    )

    @"

    <html>

    <head>

    <title>$($HeaderName)</title>

    </head>

    <body>

    <h1>$($HeaderName) - $($SubfolderName)</h1>

    <hr>

    "@

    @"

    <a href="./../">[To Parent Directory]</a><br><br>

    <table cellpadding="5">

    "@

    $Files = (Get-ChildItem "$Path")

    foreach ($File in $Files)

    {

    $FileURL = ($File.FullName -replace [regex]::Escape($Root), "" ) -replace "\\","/"

    if (!$File.Length) { $FileLength = "[dir]" } else { $FileLength = $File.Length }

    @"

    <tr>

    <td align="right">$($File.LastWriteTime)</td>

    <td align="right">$($FileLength)</td>

    <td align="left"><a href="$($FileURL)">$($File.Name)</a></td>

    </tr>

    "@

    }

    @"

    </table>

    <hr>

    </body>

    </html>

    "@

    }

    [System.Reflection.Assembly]::LoadWithPartialName("System.Web")

    $listener = New-Object System.Net.HttpListener

    $listener.Prefixes.Add("http://localhost:8080/")

    $listener.AuthenticationSchemes = [System.Net.AuthenticationSchemes]::IntegratedWindowsAuthentication

    $listener.Start()

    New-PSDrive -Name FileServe -PSProvider FileSystem -Root $PWD.Path

    $Root = $PWD.Path

    cd FileServe:\

    do {

        $context = $listener.GetContext()

        $requestUrl = $context.Request.Url

        $response = $context.Response

        $context.User.Identity.Impersonate()

        Write-Host "> $requestUrl"

        $Content = ""

        $localPath = $requestUrl.LocalPath

        try{

            $RequestedItem = Get-Item -LiteralPath "FileServe:\$localPath" -Force -ErrorAction Stop

            $FullPath = $RequestedItem.FullName

            if($RequestedItem.Attributes -match "Directory") {

                $Content = Get-DirectoryContent -Path $FullPath -HeaderName "PowerShell FileServer" -RequestURL "http://localhost:8080" -SubfolderName $localPath -Root $Root

                $Encoding = [system.Text.Encoding]::UTF8

                $Content = $Encoding.GetBytes($Content)

                $response.ContentType = "text/html"

            } else {

                $Content = [System.IO.File]::ReadAllBytes($FullPath)

                $response.ContentType = [System.Web.MimeMapping]::GetMimeMapping($FullPath)

            }

        } catch [System.UnauthorizedAccessException] {

            Write-Host "Access Denied"

            Write-Host "Current user:  $([System.Security.Principal.WindowsIdentity]::GetCurrent().Name)"

            Write-Host "Requested File: FileServe:\$localPath"

            $response.StatusCode = 404

            $Content = [System.Text.Encoding]::UTF8.GetBytes("<h1>404 - Page not found</h1>")

        } catch [System.Management.Automation.ItemNotFoundException] {

            Write-Host "No route found for:  FileServe:\$localPath"

            $response.StatusCode = 404

            $Content = [System.Text.Encoding]::UTF8.GetBytes("<h1>404 - Page not found</h1>")

        } catch {

            $_

            $Content =  "$($_.InvocationInfo.MyCommand.Name) : $($_.Exception.Message)"

            $Content +=  "$($_.InvocationInfo.PositionMessage)"

            $Content +=  "    + $($_.CategoryInfo.GetMessage())"

            $Content +=  "    + $($_.FullyQualifiedErrorId)"

            $Content = [System.Text.Encoding]::UTF8.GetBytes($Content)

            $response.StatusCode = 500

        }

        $response.ContentLength64 = $Content.Length

        $response.OutputStream.Write($Content, 0, $Content.Length)

        $response.Close()

        $responseStatus = $response.StatusCode

        Write-Host "< $responseStatus"

    } while ($listener.IsListening)

    相关文章

      网友评论

          本文标题:2021-12-15 powershell 简单web程序

          本文链接:https://www.haomeiwen.com/subject/pidpfrtx.html