הפעלת שרת אינטרנט פשוט של HTTP באמצעות PowerShell


למטרות בדיקה או כ-stub פשוט בשלב פריסת השירות, אני צריך באופן קבוע להפעיל שרת אינטרנט פשוט ב-Windows. כדי להימנע מהתקנת IIS בעלת תכונות מלאות, באפשרותך להפעיל שרת אינטרנט פשוט מסוג HTTP ישירות ממסוף PowerShell. באפשרותך להפעיל שרת אינטרנט כזה בכל יציאת TCP באמצעות המחלקה המובנית System.Net.HttpListener .NET.

פתח את מסוף PowerShell וצור מאזין HTTP:

$httpListener = New-Object System.Net.HttpListener

לאחר מכן ציין את היציאה להאזנה. בדוגמה זו, ברצוני להפעיל שרת אינטרנט מסוג HTTP ביציאה 9090.

$httpListener.Prefixes.Add("http://localhost:9090/")
  • ודא שיציאה זו אינה נמצאת בשימוש על-ידי תהליכים אחרים. תוכל לגלות איזה תהליך מאזין ב- TCP או UDP ב- Windows.

  • כדי להאזין בכל ממשקי הרשת, השתמש בלחצן

    http://+:9090/

    כתובת.

התחל את המאזין:

$httpListener.Start()

באפשרותך להשתמש בסוגי אימות שונים (בסיסי, תקציר, Windows, משא ומתן או NTLM) באובייקט HttpListener שלך או לאגד אישור SSL כדי ליישם HTTPS.

אם אתה מפעיל קוד זה, תהליך נפרד הממתין לחיבור ביציאה 9090 מופיע ב- Windows. בדוק זאת באמצעות הפקודה:

nestat -na 9090

או להציג רשימה של יציאות פתוחות באמצעות PowerShell:

Get-NetTCPConnection -State Listen | Select-Object -Property LocalAddress, LocalPort, State | Sort-Object LocalPort |ft

זכור לפתוח יציאה זו בחומת האש של Windows Defender. באפשרותך ליצור במהירות כלל לפתיחת יציאת חומת אש באמצעות הפקודה PowerShell:

New-NetFirewallRule -DisplayName "AllowTestWebServer" -Direction Inbound -Protocol TCP -LocalPort 9090 -Action Allow

כעת צור קובץ טקסט בכונן הקשיח עם קוד HTML שברצונך ששרת האינטרנט יציג. לדוגמה:

<!DOCTYPE html>
<html>
<head>
<title>
Lightweight PowerShell Web Server</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
body {background-color:#ffffff;background-repeat:no-repeat;background-position:top left;background-attachment:fixed;}
h1{font-family:Arial, sans-serif;color:#000000;background-color:#ffffff;}
p {font-family:Georgia, serif;font-size:14px;font-style:normal;font-weight:normal;color:#000000;background-color:#ffffff;}
</style>
</head>
<body>
<h1>Test web page </h1>
<p>This web page was generated by PowerShell using the System.Net.HttpListener class</p>
</body>
</html>

שמרתי קוד HTML זה ב- C:\PS\testwebpage.html עם קידוד UTM-8.

לאחר מכן הפעל את הפקודות הבאות כדי לקרוא את קובץ HTML ולשלוח תגובה לדפדפן של משתמש.

$context = $httpListener.GetContext()
$context.Response.StatusCode = 200
$context.Response.ContentType = 'text/HTML'
$WebContent = Get-Content  -Path "C:\PS\testwebpage.html" -Encoding UTF8
$EncodingWebContent = [Text.Encoding]::UTF8.GetBytes($WebContent)
$context.Response.OutputStream.Write($EncodingWebContent , 0, $EncodingWebContent.Length)
$context.Response.Close()

פתח את כתובת ה- URL של שרת ה- HTTP שלך בדפדפן (

http://localhost:9090

) או השתמש ב- PowerShell כדי לקבל את התוכן של דף אינטרנט. הסקריפט מחזיר קוד HTML פעם אחת בלבד, ולאחר מכן המאזין שלך יופסק באופן אוטומטי (רק בקשת משתמש אחת מעובדת).

שחרר את יציאת TCP:

$httpListener.Close()

אם ברצונך ששרת HTTP ימשיך להחזיר את הדף שלך, עליך להוסיף קוד PowerShell ללולאה. הדוגמה הבאה מפעילה שרת HTTP בלולאה המסתיימת בעת לחיצה על מקש כלשהו במסוף PowerShell.

write-host "Press any key to stop the HTTP listener after next request"
while (!([console]::KeyAvailable)) {
$context = $httpListener.GetContext()
$context.Response.StatusCode = 200
$context.Response.ContentType = 'text/HTML'
$WebContent = Get-Content -Path "C:\PS\testwebpage.html" -Encoding UTF8
$EncodingWebContent = [Text.Encoding]::UTF8.GetBytes($WebContent)
$context.Response.OutputStream.Write($EncodingWebContent , 0, $EncodingWebContent.Length)
$context.Response.Close()
Write-Output "" # Newline
}
$httpListener.Close()

שרת HTTP של PowerShell נשאר בחיים עד שתסגור את מסוף PowerShell או תסיים את ההפעלה באמצעות

.Close

שיטה.

באפשרותך להפעיל קובץ script זה של PowerShell כשירות Windows.

באפשרותך להפעיל שרת אינטרנט קל משקל כזה בכל מארח Windows ללא Internet Information Services או התקנת תוכנה אחרת של צד שלישי. אין צורך בהרשאות מנהל. באפשרותך להשתמש ב- HTTPListener זה כשרת REST פשוט או כדי לקבל מידע ממחשב מרוחק באמצעות HTTP.