PowerShell 是管理 IIS 和 Windows Server 2025 上 Web 服务的强大工具。它支持自动化配置、管理站点、应用程序池、证书、身份验证等多种功能。通过 PowerShell 脚本,您可以大大简化日常管理任务,提高服务器的可维护性和效率。

在 Windows Server 2025 中,您可以使用 PowerShell 来管理 IIS(Internet Information Services)。PowerShell 提供了丰富的 cmdlet 用于配置、管理和自动化 IIS 的任务。以下是一些常用的 PowerShell 命令和操作示例,用于管理 IIS:

1. 安装 IIS 角色

要在 Windows Server 2025 中安装 IIS,可以使用以下命令:

powershellCopy Code
Install-WindowsFeature -Name Web-Server -IncludeManagementTools

此命令会安装 IIS 服务器角色以及相关的管理工具。

2. 启动 IIS 服务

如果 IIS 服务未运行,可以使用以下命令启动它:

powershellCopy Code
Start-Service -Name W3SVC

3. 停止 IIS 服务

如果您需要停止 IIS 服务,可以使用以下命令:

powershellCopy Code
Stop-Service -Name W3SVC

4. 检查 IIS 服务状态

要检查 IIS 服务的状态,您可以使用:

powershellCopy Code
Get-Service -Name W3SVC

5. 查看已安装的 IIS 功能

要查看 IIS 中已安装的功能,可以使用以下命令:

powershellCopy Code
Get-WindowsFeature -Name Web-*

6. 启用或禁用 IIS 功能

要启用或禁用某个 IIS 功能,例如启用 ASP.NET 功能:

powershellCopy Code
Install-WindowsFeature -Name Web-Asp-Net

要禁用某个功能,例如禁用 FTP 服务:

powershellCopy Code
Uninstall-WindowsFeature -Name Web-Ftp-Server

7. 创建和配置网站

使用 PowerShell 管理 IIS 网站时,您可以执行以下操作:

  • 创建网站
powershellCopy Code
New-WebSite -Name "MyWebsite" -Port 80 -HostHeader "www.example.com" -PhysicalPath "C:\inetpub\wwwroot\MyWebsite"

这将创建一个新的 IIS 网站,名称为 MyWebsite,监听端口 80,绑定主机头 www.example.com,并将物理路径设置为 C:\inetpub\wwwroot\MyWebsite

  • 获取网站列表
powershellCopy Code
Get-WebSite
  • 修改现有网站的属性
powershellCopy Code
Set-WebSite -Name "MyWebsite" -Port 8080

这将把 MyWebsite 网站的端口修改为 8080。

  • 删除网站
powershellCopy Code
Remove-WebSite -Name "MyWebsite"

8. 管理应用程序池

PowerShell 也允许您管理 IIS 中的应用程序池:

  • 列出所有应用程序池
powershellCopy Code
Get-WebAppPool
  • 创建新的应用程序池
powershellCopy Code
New-WebAppPool -Name "MyAppPool"
  • 修改应用程序池的设置
powershellCopy Code
Set-WebAppPool -Name "MyAppPool" -State "Started"
  • 停止应用程序池
powershellCopy Code
Stop-WebAppPool -Name "MyAppPool"
  • 删除应用程序池
powershellCopy Code
Remove-WebAppPool -Name "MyAppPool"

9. 配置绑定和主机头

要为网站配置绑定(例如,添加新的端口或域名),可以使用以下命令:

powershellCopy Code
New-WebBinding -Name "MyWebsite" -BindingInformation "*:80:www.example.com" -Protocol "http"

这将为 MyWebsite 网站添加一个 HTTP 协议的绑定,使用端口 80 和主机头 www.example.com

10. 启用或禁用 IIS 请求过滤器

IIS 中的请求过滤器可以帮助您控制传入请求的内容。要启用请求过滤器,可以使用以下命令:

powershellCopy Code
Set-WebConfigurationProperty -Filter "system.webServer/security/requestFiltering" -Name "enabled" -Value "true"

要禁用它:

powershellCopy Code
Set-WebConfigurationProperty -Filter "system.webServer/security/requestFiltering" -Name "enabled" -Value "false"

11. 配置 IIS 日志

如果您想查看或修改 IIS 的日志设置,可以使用以下 PowerShell 命令:

  • 启用日志记录
powershellCopy Code
Set-WebConfigurationProperty -Filter "system.applicationHost/sites/siteDefaults/logFile" -Name "enabled" -Value "True"
  • 查看日志文件目录
powershellCopy Code
Get-WebConfigurationProperty -Filter "system.applicationHost/sites/siteDefaults/logFile" -Name "directory"

12. 设置 URL 重写规则

IIS 通过 URL 重写模块允许您创建和管理重写规则:

  • 获取所有 URL 重写规则
powershellCopy Code
Get-WebConfiguration -Filter "/system.webServer/rewrite/rules"
  • 添加 URL 重写规则
powershellCopy Code
Add-WebConfigurationProperty -Filter "/system.webServer/rewrite/rules" -Name "." -Value @{name="Rule1"; stopProcessing="true"; matchUrl="^old-page$"; actionType="Rewrite"; url="new-page"}

这个示例将创建一个新的重写规则,将访问 old-page 的请求重定向到 new-page

 

PowerShell 在 Windows Server 中为 IIS 提供了强大的管理功能,可以通过自动化任务、批量配置、修改网站、应用程序池和其他 IIS 设置来简化管理任务。通过结合这些命令,您可以高效地管理 IIS 环境中的各个方面。


探讨在 Windows Server 2025 中通过 PowerShell 管理 IIS 的一些更高级的操作和命令。

13. 配置 SSL/TLS 证书绑定

要为 IIS 网站配置 SSL/TLS(HTTPS),首先需要一个有效的 SSL 证书。以下是配置 SSL 证书的步骤:

  • 列出已安装的证书
powershellCopy Code
Get-ChildItem -Path Cert:\LocalMachine\My

该命令会列出所有安装在本地计算机上的证书。找到要绑定到网站的证书。

  • 为网站添加 SSL 绑定

假设您已经获取了 SSL 证书的指纹(例如,1234567890ABCDEF),并且您希望将其绑定到 MyWebsite 网站上。以下命令可以帮助您设置 HTTPS 绑定:

powershellCopy Code
New-WebBinding -Name "MyWebsite" -BindingInformation "*:443:" -Protocol "https"

然后,使用以下命令将 SSL 证书绑定到该端口:

powershellCopy Code
$cert = Get-ChildItem -Path Cert:\LocalMachine\My | Where-Object { $_.Thumbprint -eq "1234567890ABCDEF" }
$binding = Get-WebBinding -Name "MyWebsite" -BindingInformation "*:443:"
$binding.AddSslCertificate($cert.GetCertHash(), "My")

这将为 MyWebsite 网站的 443 端口绑定 SSL 证书。

14. 管理 URL 重写模块

IIS 中的 URL 重写模块(URL Rewrite Module)非常强大,能够帮助您对传入请求进行灵活的重写。使用 PowerShell 配置 URL 重写规则,您可以实现复杂的重定向、代理和路径重写功能。

  • 创建重定向规则

以下命令创建一个简单的 HTTP 到 HTTPS 的重定向规则,确保所有通过 HTTP 访问网站的请求都被重定向到 HTTPS:

powershellCopy Code
Add-WebConfigurationProperty -Filter "/system.webServer/rewrite/rules" -Name "." -Value @{
    name="Redirect to HTTPS"; 
    stopProcessing="true"; 
    matchUrl="(.*)";
    actionType="Redirect"; 
    url="https://{HTTP_HOST}/{R:1}"; 
    redirectType="Permanent"
}
  • 列出所有重写规则
powershellCopy Code
Get-WebConfiguration -Filter "/system.webServer/rewrite/rules"
  • 删除重写规则

如果您需要删除某个特定的重写规则,可以使用以下命令:

powershellCopy Code
Remove-WebConfigurationProperty -Filter "/system.webServer/rewrite/rules/rule[@name='Redirect to HTTPS']" -Name "."

15. 配置身份验证

IIS 支持多种身份验证方法,例如基本身份验证、Windows 身份验证和摘要身份验证。您可以使用 PowerShell 配置这些身份验证方法:

  • 启用 Windows 身份验证
powershellCopy Code
Set-WebConfigurationProperty -Filter "/system.webServer/security/authentication/windowsAuthentication" -Name "enabled" -Value "True"
  • 禁用基本身份验证
powershellCopy Code
Set-WebConfigurationProperty -Filter "/system.webServer/security/authentication/basicAuthentication" -Name "enabled" -Value "False"
  • 启用匿名身份验证
powershellCopy Code
Set-WebConfigurationProperty -Filter "/system.webServer/security/authentication/anonymousAuthentication" -Name "enabled" -Value "True"

16. 配置 HTTP 响应头

IIS 允许您为网站或应用程序设置自定义 HTTP 响应头。您可以通过 PowerShell 来配置这些响应头。

  • 添加自定义响应头
powershellCopy Code
Add-WebConfigurationProperty -Filter "/system.webServer/httpProtocol/customHeaders" -Name "." -Value @{
    name="X-Powered-By"; 
    value="MyCustomApp"
}

此命令会为 HTTP 响应添加一个名为 X-Powered-By 的自定义响应头,其值为 MyCustomApp

  • 删除自定义响应头
powershellCopy Code
Remove-WebConfigurationProperty -Filter "/system.webServer/httpProtocol/customHeaders/customHeader[@name='X-Powered-By']" -Name "."

17. 配置 HTTP 错误页面

IIS 允许您为常见的 HTTP 错误(如 404 错误)配置自定义页面。您可以使用 PowerShell 来设置这些错误页面。

  • 设置 404 错误页面
powershellCopy Code
Set-WebConfigurationProperty -Filter "/system.webServer/httpErrors/error[@statusCode='404']" -Name "path" -Value "/error-pages/404.html"
  • 启用详细错误信息(通常用于开发环境):
powershellCopy Code
Set-WebConfigurationProperty -Filter "/system.webServer/httpErrors" -Name "showDetailedErrors" -Value "True"

18. 管理 IIS 服务器证书

如果您希望管理服务器证书(如导入、导出或删除证书),可以使用以下 PowerShell 命令:

  • 导入证书
powershellCopy Code
Import-PfxCertificate -FilePath "C:\Path\To\Certificate.pfx" -CertStoreLocation "Cert:\LocalMachine\My" -Password (ConvertTo-SecureString -String "your_password" -AsPlainText -Force)
  • 导出证书
powershellCopy Code
Export-Certificate -Cert "Cert:\LocalMachine\My\1234567890ABCDEF" -FilePath "C:\Path\To\ExportedCert.cer"
  • 删除证书
powershellCopy Code
Remove-Item -Path "Cert:\LocalMachine\My\1234567890ABCDEF"

19. 配置请求筛选

IIS 的请求筛选器允许您对传入请求的内容进行过滤,例如限制 URL 长度、禁止某些 HTTP 方法等。

  • 限制 URL 长度
powershellCopy Code
Set-WebConfigurationProperty -Filter "/system.webServer/security/requestFiltering" -Name "maxUrl" -Value "4096"
  • 禁用 HTTP TRACE 方法
powershellCopy Code
Set-WebConfigurationProperty -Filter "/system.webServer/security/requestFiltering" -Name "denyMethods" -Value "TRACE"

20. 自动化和脚本化管理任务

PowerShell 提供强大的自动化功能,可以通过脚本批量管理 IIS 服务器的多个站点、应用程序池、SSL 配置等。例如,您可以定期检查 IIS 日志,自动配置网站的 SSL 证书,或者按计划清理和重启应用程序池。

例如,以下脚本定期检查并重启所有已停止的应用程序池:

powershellCopy Code
Get-WebAppPool | Where-Object { $_.state -eq 'Stopped' } | ForEach-Object { Restart-WebAppPool -Name $_.Name }

此脚本会检查所有应用程序池的状态,如果状态为 Stopped,则会重启相应的应用程序池。

 

PowerShell 是管理 IIS 和 Windows Server 2025 上 Web 服务的强大工具。它支持自动化配置、管理站点、应用程序池、证书、身份验证等多种功能。通过 PowerShell 脚本,您可以大大简化日常管理任务,提高服务器的可维护性和效率。


21. 配置应用程序池的回收策略

在 IIS 中,应用程序池是一个非常重要的组件,负责管理网站或应用程序的进程。为了确保应用程序池在长时间运行后不发生内存泄漏或性能下降,您可以配置回收策略。PowerShell 允许您轻松地管理这些设置。

  • 查看应用程序池的回收设置
powershellCopy Code
Get-WebAppPool | ForEach-Object {
    $appPool = $_
    Get-WebConfigurationProperty -Filter "/system.applicationHost/applicationPools/applicationPool[@name='$($appPool.Name)']/recycling" -Name "periodicRestart"
}
  • 设置应用程序池的回收间隔(例如:每天凌晨 2 点回收):
powershellCopy Code
Set-WebConfigurationProperty -Filter "/system.applicationHost/applicationPools/applicationPool[@name='DefaultAppPool']/recycling/periodicRestart" -Name "time" -Value "02:00:00"
  • 设置内存回收阈值
powershellCopy Code
Set-WebConfigurationProperty -Filter "/system.applicationHost/applicationPools/applicationPool[@name='DefaultAppPool']/recycling/periodicRestart" -Name "privateMemory" -Value 512MB

这会将应用程序池的内存回收阈值设置为 512 MB,当内存使用达到此值时,应用程序池将被回收。

22. 配置 IIS 日志记录

IIS 日志记录是监控 Web 服务器性能、调试应用程序问题以及审计用户行为的关键。您可以使用 PowerShell 配置 IIS 的日志记录功能,以便更加灵活地处理日志文件。

  • 启用日志记录并设置日志格式
powershellCopy Code
Set-WebConfigurationProperty -Filter "/system.webServer/loging" -Name "enabled" -Value "True"
Set-WebConfigurationProperty -Filter "/system.webServer/loging" -Name "logFormat" -Value "W3C"
  • 修改日志文件的存储位置
powershellCopy Code
Set-WebConfigurationProperty -Filter "/system.webServer/logging" -Name "directory" -Value "C:\IISLogs"
  • 清理过期的日志文件

可以编写 PowerShell 脚本定期删除旧的 IIS 日志文件。例如,删除 30 天前的日志:

powershellCopy Code
Get-ChildItem -Path "C:\IISLogs" -Recurse | Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-30) } | Remove-Item

23. 使用 PowerShell 管理 IIS 请求过滤

IIS 请求过滤模块允许您过滤和限制请求,以提高安全性和防止恶意请求。您可以通过 PowerShell 配置 HTTP 请求过滤规则。

  • 配置请求头大小限制
powershellCopy Code
Set-WebConfigurationProperty -Filter "/system.webServer/security/requestFiltering" -Name "maxRequestHeadersTotalSize" -Value 16384

这会将请求头的最大总大小设置为 16 KB。

  • 禁用不必要的 HTTP 方法(例如:PUT 和 DELETE)
powershellCopy Code
Set-WebConfigurationProperty -Filter "/system.webServer/security/requestFiltering" -Name "denyMethods" -Value "PUT, DELETE"
  • 设置 URL 长度限制
powershellCopy Code
Set-WebConfigurationProperty -Filter "/system.webServer/security/requestFiltering" -Name "maxUrl" -Value 4096

24. 配置动态内容压缩

IIS 提供了动态内容压缩功能,可以在传输时压缩动态生成的内容(如 ASP.NET 页面)。这有助于减少带宽消耗并加速内容传输。可以通过 PowerShell 启用或配置动态压缩。

  • 启用动态内容压缩
powershellCopy Code
Set-WebConfigurationProperty -Filter "/system.webServer/httpCompression" -Name "enabled" -Value "True"
Set-WebConfigurationProperty -Filter "/system.webServer/httpCompression" -Name "dynamicCompression" -Value "True"
  • 配置动态内容压缩的文件类型
powershellCopy Code
Add-WebConfigurationProperty -Filter "/system.webServer/httpCompression/dynamicTypes" -Name "." -Value @{
    mimeType="text/javascript"; 
    enabled="True"
}

这将启用 JavaScript 文件的动态内容压缩。

25. 配置 URL 路由和反向代理

IIS 的 URL 重写和反向代理功能可以帮助您处理复杂的请求路由和代理需求。通过 PowerShell,您可以自动化这些设置。

  • 为 IIS 启用反向代理

首先,您需要确保安装了 URL Rewrite 模块,并且启用了反向代理功能:

powershellCopy Code
Install-WindowsFeature Web-URL-Rewrite
  • 创建反向代理规则

以下示例创建了一个将所有请求代理到内部服务器的规则:

powershellCopy Code
Add-WebConfigurationProperty -Filter "/system.webServer/rewrite/rules" -Name "." -Value @{
    name="ReverseProxy"; 
    matchUrl="(.*)"; 
    actionType="Rewrite"; 
    url="http://internal-server/{R:1}"; 
    stopProcessing="true"
}

此规则将所有请求转发到 http://internal-server,并保持 URL 的路径。

26. 配置应用程序池身份

应用程序池的身份决定了它如何访问操作系统资源、网络共享和数据库。通常,您会使用 ApplicationPoolIdentity,但在某些情况下,您可能需要配置为自定义账户。

  • 查看应用程序池的身份
powershellCopy Code
Get-WebAppPool | ForEach-Object {
    $appPool = $_
    Get-WebConfigurationProperty -Filter "/system.applicationHost/applicationPools/applicationPool[@name='$($appPool.Name)']/processModel" -Name "identity"
}
  • 更改应用程序池身份(例如:使用特定的 Windows 用户账户):
powershellCopy Code
Set-WebConfigurationProperty -Filter "/system.applicationHost/applicationPools/applicationPool[@name='MyAppPool']/processModel" -Name "identity" -Value "NetworkService"

或者,如果您想要使用自定义账户:

powershellCopy Code
Set-WebConfigurationProperty -Filter "/system.applicationHost/applicationPools/applicationPool[@name='MyAppPool']/processModel" -Name "identity" -Value "SpecificUser"
Set-WebConfigurationProperty -Filter "/system.applicationHost/applicationPools/applicationPool[@name='MyAppPool']/processModel" -Name "userName" -Value "domain\username"
Set-WebConfigurationProperty -Filter "/system.applicationHost/applicationPools/applicationPool[@name='MyAppPool']/processModel" -Name "password" -Value "password"

27. 配置 HTTP/2 支持

IIS 支持 HTTP/2 协议,默认情况下会启用,但您也可以通过 PowerShell 来查看或配置它。

  • 查看 HTTP/2 配置
powershellCopy Code
Get-WebConfigurationProperty -Filter "/system.webServer/protocols" -Name "http2"
  • 启用 HTTP/2
powershellCopy Code
Set-WebConfigurationProperty -Filter "/system.webServer/protocols" -Name "http2" -Value "True"

28. 配置 IIS 动态内容压缩

IIS 支持动态内容压缩,可以减小传输数据的大小,提升性能。通过 PowerShell,您可以配置压缩选项。

  • 启用动态内容压缩
powershellCopy Code
Set-WebConfigurationProperty -Filter "/system.webServer/httpCompression" -Name "dynamicCompression" -Value "True"
  • 设置动态压缩的最小文件大小
powershellCopy Code
Set-WebConfigurationProperty -Filter "/system.webServer/httpCompression/dynamicCompression" -Name "minFileSize" -Value "1024"

29. 配置请求筛选规则

IIS 的请求筛选器能够拦截并过滤掉非法的 HTTP 请求。通过 PowerShell,您可以根据具体的规则来管理请求。

  • 允许特定的 HTTP 方法
powershellCopy Code
Set-WebConfigurationProperty -Filter "/system.webServer/security/requestFiltering" -Name "allowMethods" -Value "GET, POST"
  • 禁止某些 IP 地址的访问
powershellCopy Code
Add-WebConfigurationProperty -Filter "/system.webServer/security/ipSecurity" -Name "." -Value @{
    ipAddress="192.168.1.100"; 
    allowed="False"
}

 

PowerShell 提供了一个强大的工具集,帮助管理员和开发者在 Windows Server 环境下高效地管理 IIS 配置和优化。通过这些命令和脚本,您可以实现自动化的 Web 服务器管理、故障排除和性能优化,确保 IIS 的高效运行。无论是配置 SSL 证书、设置 URL 重写规则,还是管理应用程序池,PowerShell 都能帮助您简化任务,提升管理效率。


30. 配置 IIS 连接限制和超时设置

IIS 提供了多个配置项来限制客户端的连接数和超时设置,这对于防止恶意攻击、确保服务器稳定性和优化资源分配至关重要。使用 PowerShell,您可以很容易地调整这些配置。

  • 设置最大连接数限制
powershellCopy Code
Set-WebConfigurationProperty -Filter "/system.webServer/serverRuntime" -Name "maxConcurrentRequestsPerCPU" -Value 500

这会将每个 CPU 核心的最大并发请求数设置为 500。当达到此限制时,IIS 会开始排队新的请求。

  • 配置连接超时设置
powershellCopy Code
Set-WebConfigurationProperty -Filter "/system.webServer/httpRequestHandling" -Name "connectionTimeout" -Value "00:00:30"

这将将连接超时设置为 30 秒,超出此时间未完成的连接将被关闭。

  • 配置请求超时设置
powershellCopy Code
Set-WebConfigurationProperty -Filter "/system.webServer/httpRequestHandling" -Name "executionTimeout" -Value "00:05:00"

这将请求的最大执行时间设置为 5 分钟。

31. 配置 SSL 和 TLS 设置

为了提高网站的安全性,使用 SSL/TLS 加密是必不可少的。通过 PowerShell,您可以配置 SSL/TLS 协议和证书绑定。

  • 查看当前启用的 SSL 协议
powershellCopy Code
Get-WebConfigurationProperty -Filter "/system.webServer/security/ssl" -Name "enabledSslProtocols"
  • 禁用 SSL 3.0 和启用 TLS 1.2
powershellCopy Code
Set-WebConfigurationProperty -Filter "/system.webServer/security/ssl" -Name "enabledSslProtocols" -Value "TLSv1.2"

这将禁用不安全的 SSL 3.0 协议,仅启用 TLS 1.2。

  • 绑定 SSL 证书到网站
powershellCopy Code
New-WebBinding -Name "Default Web Site" -BindingInformation "*:443:" -CertificateThumbprint "your-certificate-thumbprint" -CertificateStoreName "My" -Protocol "https"

此命令将指定的 SSL 证书绑定到 Default Web Site 上,端口为 443。

32. 配置应用程序池的启动模式

IIS 应用程序池的启动模式决定了应用程序池如何启动。可以选择按需启动或在启动时始终保持运行。您可以使用 PowerShell 来修改应用程序池的启动模式。

  • 设置应用程序池的启动模式为自动
powershellCopy Code
Set-WebConfigurationProperty -Filter "/system.applicationHost/applicationPools/applicationPool[@name='MyAppPool']/processModel" -Name "startMode" -Value "AlwaysRunning"
  • 设置应用程序池的启动模式为按需启动
powershellCopy Code
Set-WebConfigurationProperty -Filter "/system.applicationHost/applicationPools/applicationPool[@name='MyAppPool']/processModel" -Name "startMode" -Value "OnDemand"

按需启动意味着应用程序池仅在第一个请求到达时才会启动,这对于资源管理和节约内存非常有用。

33. 配置 IIS 安全性和身份验证

IIS 支持多种身份验证机制,包括基本身份验证、Windows 身份验证和表单身份验证。通过 PowerShell,您可以轻松配置这些身份验证方式。

  • 启用 Windows 身份验证
powershellCopy Code
Set-WebConfigurationProperty -Filter "/system.webServer/security/authentication/windowsAuthentication" -Name "enabled" -Value "True"
  • 启用基本身份验证
powershellCopy Code
Set-WebConfigurationProperty -Filter "/system.webServer/security/authentication/basicAuthentication" -Name "enabled" -Value "True"
  • 禁用匿名身份验证
powershellCopy Code
Set-WebConfigurationProperty -Filter "/system.webServer/security/authentication/anonymousAuthentication" -Name "enabled" -Value "False"

34. 配置请求过滤规则以防止常见攻击

IIS 请求过滤模块可以帮助您阻止常见的攻击,如 SQL 注入、XSS 攻击等。通过 PowerShell,您可以配置请求过滤规则。

  • 禁止特定的文件扩展名
powershellCopy Code
Add-WebConfigurationProperty -Filter "/system.webServer/security/requestFiltering/fileExtensions" -Name "." -Value @{
    fileExtension=".exe"; 
    allowed="False"
}

此命令将禁止 .exe 扩展名的文件请求。

  • 配置 URL 字符限制
powershellCopy Code
Set-WebConfigurationProperty -Filter "/system.webServer/security/requestFiltering" -Name "maxUrl" -Value 2048

这将限制请求 URL 的最大长度为 2048 个字符。

  • 限制 HTTP 请求体的大小
powershellCopy Code
Set-WebConfigurationProperty -Filter "/system.webServer/security/requestFiltering" -Name "maxRequestBodySize" -Value 1048576

此设置将请求体的最大大小限制为 1 MB。

35. 配置 HTTP 响应头

HTTP 响应头可以提供有关 Web 服务器的很多信息。为了增加安全性,您可以删除不必要的响应头,防止潜在的信息泄露。通过 PowerShell,您可以管理 IIS 响应头。

  • 删除 X-Powered-By 响应头
powershellCopy Code
Set-WebConfigurationProperty -Filter "/system.webServer/httpHeaders/custom" -Name "X-Powered-By" -Value ""
  • 添加自定义 HTTP 响应头
powershellCopy Code
Add-WebConfigurationProperty -Filter "/system.webServer/httpHeaders/custom" -Name "." -Value @{
    name="X-Frame-Options"; 
    value="DENY"
}

这将添加一个 X-Frame-Options 响应头,防止点击劫持攻击。

36. 配置 IIS 确保高可用性和负载均衡

IIS 支持多台 Web 服务器之间的负载均衡。通过配置 IIS 和相关的网络设备(如硬件负载均衡器或软件负载均衡代理),可以实现高可用性和负载分担。PowerShell 可以帮助您配置这些负载均衡设置。

  • 配置 ARR(应用程序请求路由)

应用程序请求路由(ARR)是一种 IIS 模块,它通过将请求转发到不同的服务器实现负载均衡。首先,您需要安装 ARR 模块:

powershellCopy Code
Install-WindowsFeature Web-Application-Request-Routing
  • 启用 ARR 并设置负载均衡规则
powershellCopy Code
Set-WebConfigurationProperty -Filter "/system.webServer/applicationRequestRouting/proxy" -Name "enabled" -Value "True"

此命令将启用 ARR,并允许 IIS 进行请求的反向代理和负载均衡。

37. 使用 PowerShell 进行 IIS 服务器的定期备份

IIS 服务器的配置和内容需要定期备份,以防止系统崩溃或其他问题导致数据丢失。通过 PowerShell,您可以自动化备份过程。

  • 备份 IIS 配置文件
powershellCopy Code
$backupPath = "C:\IISBackup\Backup_$(Get-Date -Format yyyyMMddHHmmss)"
New-Item -Path $backupPath -ItemType Directory
Backup-WebConfiguration -BackupPath $backupPath

这将备份 IIS 的配置文件到指定的目录。

  • 备份网站内容
powershellCopy Code
$sourcePath = "C:\inetpub\wwwroot"
$backupPath = "D:\Backup\wwwroot_$(Get-Date -Format yyyyMMddHHmmss)"
Copy-Item -Path $sourcePath -Destination $backupPath -Recurse

这将备份网站内容到指定的备份目录。

38. 配置 IIS 健康检查和监控

为了确保 IIS 服务器的稳定性,您需要对其进行健康检查和性能监控。PowerShell 可以帮助您获取 IIS 的相关性能数据。

  • 获取 IIS 网站的状态
powershellCopy Code
Get-WebSiteState -Name "Default Web Site"
  • 获取应用程序池的状态
powershellCopy Code
Get-WebAppPoolState -Name "DefaultAppPool"
  • 获取 IIS 性能计数器数据
powershellCopy Code
Get-Counter '\Web Service(*)\Current Connections'

这将返回当前所有 Web 服务连接的数量。

 

使用 PowerShell 管理 IIS 可以极大地提高服务器管理效率。无论是配置安全性、优化性能、设置负载均衡还是进行备份,PowerShell 都提供了强大的支持。通过自动化这些任务,您可以减少手动操作错误,提高系统的可靠性和安全性。此外,PowerShell 还允许您对 IIS 进行细粒度的配置,确保 Web 服务器能够在不同的业务需求和安全要求下高效运行。


39. 配置 IIS 日志记录

IIS 日志记录是进行故障排除和性能监控的一个重要工具。通过 PowerShell,您可以管理 IIS 的日志配置,包括设置日志格式、日志文件位置、以及启用或禁用特定日志功能。

  • 启用日志记录
powershellCopy Code
Set-WebConfigurationProperty -Filter "/system.webServer/log" -Name "enabled" -Value "True"

这将启用 IIS 日志记录。

  • 设置日志文件的路径
powershellCopy Code
Set-WebConfigurationProperty -Filter "/system.webServer/log" -Name "directory" -Value "C:\inetpub\logs\LogFiles"

此命令将日志文件目录设置为 C:\inetpub\logs\LogFiles,你可以根据需要更改路径。

  • 更改日志格式(W3C 格式)
powershellCopy Code
Set-WebConfigurationProperty -Filter "/system.webServer/log" -Name "logFile" -Value @{logFormat="W3C"}

将日志格式设置为 W3C 格式,这通常用于分析和处理。

  • 设置日志文件的最大大小
powershellCopy Code
Set-WebConfigurationProperty -Filter "/system.webServer/log/logFile" -Name "maxLogFileSize" -Value 100MB

这将每个日志文件的最大大小设置为 100 MB,超过此大小时,IIS 会自动创建新文件。

  • 启用日志详细级别
powershellCopy Code
Set-WebConfigurationProperty -Filter "/system.webServer/log" -Name "verbosity" -Value "Detailed"

这将日志记录详细级别设置为“详细”,可以帮助捕获更多的调试信息。

40. 配置 URL 重写规则

IIS 提供了强大的 URL 重写模块(URL Rewrite Module),允许您根据某些规则重写请求 URL,进行重定向等。通过 PowerShell,您可以自动化和管理这些 URL 重写规则。

  • 安装 URL 重写模块(如果尚未安装):
powershellCopy Code
Install-WindowsFeature Web-Url-Rewrite
  • 创建一个简单的 URL 重写规则
powershellCopy Code
Add-WebConfigurationProperty -Filter "/system.webServer/rewrite/rules" -Name "." -Value @{
    name = "RedirectRule";
    stopProcessing = "true";
    match = @{url = "^old-page$"};
    action = @{type = "Redirect"; url = "/new-page"; redirectType = "Permanent"}
}

此命令将会把访问 /old-page 的请求永久重定向到 /new-page

  • 创建一个条件重写规则
powershellCopy Code
Add-WebConfigurationProperty -Filter "/system.webServer/rewrite/rules" -Name "." -Value @{
    name = "RewriteRuleWithCondition";
    match = @{url = "^old/(.*)"};
    conditions = @(@{input = "{HTTP_HOST}"; pattern = "www.example.com"});
    action = @{type = "Rewrite"; url = "/new/{R:1}"}
}

该规则会在请求符合特定条件时重写 URL。例如,仅当主机名为 www.example.com 时,将 /old/ 路径的请求重写为 /new/

41. 配置跨域资源共享(CORS)

跨域资源共享(CORS)是指浏览器允许一个网站的资源能够被另一个网站的页面访问。IIS 可以通过 HTTP 头部配置 CORS。通过 PowerShell,您可以快速配置 CORS。

  • 允许所有域访问
powershellCopy Code
Add-WebConfigurationProperty -Filter "/system.webServer/httpHeaders/custom" -Name "." -Value @{
    name="Access-Control-Allow-Origin"; value="*"
}

这将允许所有域访问您的服务器资源。

  • 限制特定域的访问
powershellCopy Code
Add-WebConfigurationProperty -Filter "/system.webServer/httpHeaders/custom" -Name "." -Value @{
    name="Access-Control-Allow-Origin"; value="https://example.com"
}

这将仅允许 https://example.com 域名的资源访问。

  • 配置其他 CORS 相关头部(如 Access-Control-Allow-Methods 和 Access-Control-Allow-Headers):
powershellCopy Code
Add-WebConfigurationProperty -Filter "/system.webServer/httpHeaders/custom" -Name "." -Value @{
    name="Access-Control-Allow-Methods"; value="GET, POST, PUT, DELETE";
}

Add-WebConfigurationProperty -Filter "/system.webServer/httpHeaders/custom" -Name "." -Value @{
    name="Access-Control-Allow-Headers"; value="Content-Type, Authorization"
}

这样设置后,您的 IIS 将允许跨域请求并配置支持的方法和头部。

42. 配置 HTTP/2

IIS 10.0 支持 HTTP/2 协议,HTTP/2 提供了更高效的传输和更低的延迟。通过 PowerShell,您可以启用或禁用 HTTP/2。

  • 启用 HTTP/2
powershellCopy Code
Set-WebConfigurationProperty -Filter "/system.webServer/httpProtocol" -Name "enableHttp2" -Value "True"
  • 禁用 HTTP/2
powershellCopy Code
Set-WebConfigurationProperty -Filter "/system.webServer/httpProtocol" -Name "enableHttp2" -Value "False"

启用 HTTP/2 可以提高网站性能,特别是在移动设备或慢速网络连接上。

43. 配置 IP 限制

IIS 提供了 IP 限制功能,允许您限制特定 IP 地址的访问。通过 PowerShell,您可以设置 IP 地址限制或访问白名单。

  • 允许特定 IP 地址访问
powershellCopy Code
Add-WebConfigurationProperty -Filter "/system.webServer/security/ipSecurity" -Name "." -Value @{
    ipAddress = "192.168.1.100";
    allowed = "True"
}

这将允许来自 192.168.1.100 的 IP 地址访问网站。

  • 拒绝特定 IP 地址访问
powershellCopy Code
Add-WebConfigurationProperty -Filter "/system.webServer/security/ipSecurity" -Name "." -Value @{
    ipAddress = "192.168.1.200";
    allowed = "False"
}

这将阻止来自 192.168.1.200 的 IP 地址访问网站。

44. 配置 HTTP 请求限速

为防止恶意攻击(如 DoS 攻击),您可以限制单个客户端的请求速率。通过 PowerShell,您可以设置请求速率限制。

  • 限制每个 IP 地址的请求速率
powershellCopy Code
Set-WebConfigurationProperty -Filter "/system.webServer/security/requestFiltering" -Name "requestLimits" -Value @{
    maxRequestsPerSecond=20
}

这将每秒最大请求数限制为 20。

45. 配置动态内容压缩

IIS 允许您压缩动态生成的内容(如 ASPX 页面),这可以大大减少带宽消耗并提高加载速度。通过 PowerShell,您可以启用或配置动态内容压缩。

  • 启用动态内容压缩
powershellCopy Code
Set-WebConfigurationProperty -Filter "/system.webServer/httpCompression" -Name "enabled" -Value "True"
  • 禁用动态内容压缩
powershellCopy Code
Set-WebConfigurationProperty -Filter "/system.webServer/httpCompression" -Name "enabled" -Value "False"

启用压缩可以显著减少传输的字节数,尤其是对于文本格式的响应(如 HTML、CSS 和 JavaScript)。

46. 配置自动应用程序池回收

应用程序池回收是保持 IIS 性能和稳定性的一个重要机制。通过 PowerShell,您可以设置应用程序池的自动回收策略。

  • 启用应用程序池回收
powershellCopy Code
Set-WebConfigurationProperty -Filter "/system.applicationHost/applicationPools/applicationPool[@name='DefaultAppPool']/recycling" -Name "enabled" -Value "True"
  • 设置特定的回收规则(如按时间或内存限制):
powershellCopy Code
Set-WebConfigurationProperty -Filter "/system.applicationHost/applicationPools/applicationPool[@name='DefaultAppPool']/recycling" -Name "periodicRestart" -Value @{
    time="00:30:00"
}

这会使应用程序池每 30 分钟进行一次回收。

 

PowerShell 为 IIS 提供了强大的自动化管理功能,能够极大地提高系统配置、监控和故障排除的效率。从配置安全设置到优化性能,再到管理日志和应用程序池,PowerShell 都能为您提供灵活的控制和快速的操作。通过精确的配置,您可以确保 IIS 服务器在高负载情况下的稳定性,同时提升网站的安全性和用户体验。


详细探讨 日志记录URL 重写 的 PowerShell 配置。

日志记录配置

IIS 日志记录是网站性能监控和故障排除的一个重要工具。通过日志,您可以分析请求来源、请求类型、错误代码等信息。通过 PowerShell 配置日志记录,可以轻松调整日志的存储位置、格式、日志轮换等。

1. 启用 IIS 日志记录

首先,确保 IIS 的日志记录功能已经启用:

powershellCopy Code
Set-WebConfigurationProperty -Filter "/system.webServer/log" -Name "enabled" -Value "True"

该命令确保 IIS 日志功能开启。如果禁用了日志记录,您将无法获取访问日志,造成故障排查困难。

2. 设置日志文件的存储目录

您可以自定义日志存储目录,这对于长时间运行的站点尤其重要,避免默认的日志目录满溢或不易管理。

powershellCopy Code
Set-WebConfigurationProperty -Filter "/system.webServer/log" -Name "directory" -Value "D:\IISLogs"

上面的命令将日志文件存储位置设置为 D:\IISLogs。您可以根据自己的需求更改路径。

3. 选择日志格式

IIS 支持多种日志格式,最常用的是 W3C 格式。通过 PowerShell 配置日志格式:

powershellCopy Code
Set-WebConfigurationProperty -Filter "/system.webServer/log" -Name "logFile" -Value @{logFormat="W3C"}

W3C 格式非常适合后续的日志分析工具(如 AWStats、Log Parser 等),它能够详细记录请求、响应和其他必要信息。

4. 设置日志文件的最大大小

为了防止日志文件无限制增长,您可以限制日志文件的大小,超过指定大小时会自动创建新文件:

powershellCopy Code
Set-WebConfigurationProperty -Filter "/system.webServer/log/logFile" -Name "maxLogFileSize" -Value 100MB

这将限制日志文件的最大大小为 100 MB。超过该大小后,IIS 会自动创建新的日志文件。

5. 设置日志轮换规则

日志轮换对于防止日志文件过大或过长时间不清理至关重要。您可以设置日志轮换的频率,例如按日、周或月轮换:

powershellCopy Code
Set-WebConfigurationProperty -Filter "/system.webServer/log/logFile" -Name "period" -Value "Daily"

该命令将日志文件按日轮换。您还可以选择 WeeklyMonthly 进行轮换。

6. 更改日志记录的详细级别

默认情况下,IIS 记录基本的访问信息。如果需要更详细的日志记录,您可以调整日志的详细级别。可以选择记录更多的请求参数和响应数据。

powershellCopy Code
Set-WebConfigurationProperty -Filter "/system.webServer/log" -Name "verbosity" -Value "Detailed"

这会将日志详细级别设置为 Detailed,包括客户端请求的更多信息(如请求的 Cookie、查询字符串等)。


URL 重写配置

IIS 提供了强大的 URL 重写功能,可以根据特定规则修改请求的 URL,进行重定向、代理等操作。通过 PowerShell,您可以实现 URL 重写规则的自动化管理。

1. 安装 URL 重写模块

在使用 URL 重写功能之前,确保您的 IIS 已经安装了 URL 重写模块。如果尚未安装,您可以使用以下命令进行安装:

powershellCopy Code
Install-WindowsFeature Web-Url-Rewrite

安装完成后,您可以开始配置 URL 重写规则。

2. 创建一个简单的 URL 重定向规则

假设您需要将 old-page 重定向到 new-page。可以使用以下 PowerShell 命令添加重定向规则:

powershellCopy Code
Add-WebConfigurationProperty -Filter "/system.webServer/rewrite/rules" -Name "." -Value @{
    name = "RedirectRule";
    stopProcessing = "true";
    match = @{url = "^old-page$"};
    action = @{type = "Redirect"; url = "/new-page"; redirectType = "Permanent"}
}

这个命令会将所有访问 /old-page 的请求永久重定向到 /new-page。这里的 redirectType 可以是以下几种类型:

  • Permanent: 301 永久重定向
  • Found: 302 临时重定向
  • SeeOther: 303 重定向到另一个 URL

3. 创建带条件的 URL 重写规则

如果您希望根据请求的某些条件(例如主机名、用户代理等)来决定是否重写 URL,可以使用条件。以下示例展示了如何在满足特定主机名的情况下重写 URL:

powershellCopy Code
Add-WebConfigurationProperty -Filter "/system.webServer/rewrite/rules" -Name "." -Value @{
    name = "RewriteRuleWithCondition";
    match = @{url = "^old/(.*)"};
    conditions = @(@{input = "{HTTP_HOST}"; pattern = "www.example.com"});
    action = @{type = "Rewrite"; url = "/new/{R:1}"}
}

此规则的作用是:当请求来自 www.example.com,且 URL 匹配 ^old/(.*) 的正则表达式时,会将请求重写为 /new/{R:1}。这里的 {R:1} 是匹配正则表达式中的第一个捕获组。

4. 设置 URL 重写的反向代理规则

IIS 的 URL 重写模块支持反向代理功能。假设您希望将来自 /api/* 的请求代理到其他服务器(如 http://backend.example.com),可以使用以下配置:

powershellCopy Code
Add-WebConfigurationProperty -Filter "/system.webServer/rewrite/rules" -Name "." -Value @{
    name = "ReverseProxyRule";
    stopProcessing = "true";
    match = @{url = "^api/(.*)"};
    action = @{
        type = "Rewrite";
        url = "http://backend.example.com/{R:1}";
        appendQueryString = "true"
    }
}

此规则将所有请求 /api/* 转发到 http://backend.example.com/api/*,同时保留查询字符串。

5. 启用或禁用 URL 重写规则

您可以轻松启用或禁用现有的 URL 重写规则。如果某个规则不再需要,可以禁用它以避免影响服务器性能:

  • 启用 URL 重写规则
powershellCopy Code
Set-WebConfigurationProperty -Filter "/system.webServer/rewrite/rules/rule[@name='RedirectRule']" -Name "enabled" -Value "True"
  • 禁用 URL 重写规则
powershellCopy Code
Set-WebConfigurationProperty -Filter "/system.webServer/rewrite/rules/rule[@name='RedirectRule']" -Name "enabled" -Value "False"

6. 删除 URL 重写规则

如果某个重写规则已经不需要,您可以通过 PowerShell 删除该规则:

powershellCopy Code
Remove-WebConfigurationProperty -Filter "/system.webServer/rewrite/rules/rule[@name='RedirectRule']" -Name "."

这样会从 IIS 配置中删除名为 RedirectRule 的 URL 重写规则。


 

通过 PowerShell 管理 IIS 日志记录和 URL 重写规则,可以极大地提高网站管理的效率与灵活性。以下是要点回顾:

  • 日志记录:可以配置日志的存储路径、格式、详细级别等,帮助更好地监控网站的访问情况。
  • URL 重写:可以设置简单的重定向规则,或者基于请求的不同条件重写 URL。此外,URL 重写还支持反向代理功能,可以将请求代理到其他服务器。

通过这些配置,您能够更好地控制和管理您的 IIS 网站,确保其性能、稳定性和安全性。


深入探讨一些其他常见的 PowerShell 管理 IIS 配置的高级操作,主要包括 安全性配置性能优化自动化部署。这些设置能进一步提升 IIS 网站的安全性和性能,并为日常管理和自动化操作提供支持。

IIS 安全性配置

确保您的 IIS 服务器和网站具备高安全性是非常重要的,尤其是在面对潜在的网络攻击时。以下是一些常见的安全配置及其 PowerShell 管理方法。

1. 启用 SSL/TLS 加密

SSL/TLS 加密可以确保您的网站与客户端之间的数据传输是安全的。首先,您需要为站点配置 SSL 证书。然后,通过 PowerShell 配置启用 HTTPS。

配置 SSL 证书
powershellCopy Code
# 为网站绑定 SSL 证书
New-WebBinding -Name "YourSite" -BindingInformation "*:443:" -CertificateThumbprint "YourCertificateThumbprint" -CertificateStoreName "My" -Protocol "https"

其中,YourCertificateThumbprint 是您 SSL 证书的指纹。通过此命令,将证书与指定站点绑定并启用 HTTPS。

强制使用 HTTPS

要确保网站只通过 HTTPS 访问,您可以通过 URL 重写规则强制将 HTTP 请求重定向到 HTTPS:

powershellCopy Code
Add-WebConfigurationProperty -Filter "/system.webServer/rewrite/rules" -Name "." -Value @{
    name = "ForceHttps";
    stopProcessing = "true";
    match = @{url = "^(.*)$"};
    conditions = @(@{input = "{HTTPS}"; pattern = "off"});
    action = @{type = "Redirect"; url = "https://{HTTP_HOST}/{R:1}"; redirectType = "Permanent"}
}

该规则会将所有通过 HTTP 协议的请求重定向到 HTTPS。

2. 禁用不安全的 HTTP 方法

某些 HTTP 方法,如 TRACEOPTIONS,可能被攻击者利用来获取敏感信息。您可以通过 PowerShell 禁用这些不安全的 HTTP 方法。

powershellCopy Code
Set-WebConfigurationProperty -Filter "/system.webServer/httpRequestHandling" -Name "allowTrace" -Value "false"

这会禁用 TRACE 方法,从而防止攻击者通过该方法获取有关服务器的信息。

3. 配置目录浏览权限

为了防止网站暴露敏感文件,您可以禁用 IIS 的目录浏览功能。这样,如果网站目录中没有 default.htmlindex.html 文件,访问者将无法看到目录内容。

powershellCopy Code
Set-WebConfigurationProperty -Filter "/system.webServer/directoryBrowse" -Name "enabled" -Value "false"

通过该命令禁用目录浏览,可以增强网站的安全性。

4. 设置 WebSocket 安全配置

WebSocket 是一种常用的用于实时通信的协议。如果您不需要 WebSocket,可以将其禁用,以减少潜在的安全风险。

powershellCopy Code
Set-WebConfigurationProperty -Filter "/system.webServer/webSocket" -Name "enabled" -Value "false"

禁用 WebSocket 可以减少被恶意使用的可能性,尤其是在不需要实时通信的场景下。


IIS 性能优化配置

提升 IIS 性能对于处理高流量的网站至关重要。以下是一些常见的性能优化配置,可以帮助您提高 IIS 网站的响应速度和处理能力。

1. 启用动态压缩

动态内容压缩可以显著减少通过网络传输的数据量,从而提高加载速度和响应时间。您可以通过 PowerShell 启用动态压缩。

powershellCopy Code
Set-WebConfigurationProperty -Filter "/system.webServer/httpCompression" -Name "enabled" -Value "True"

启用后,IIS 会自动压缩 HTML、CSS、JavaScript 等动态内容。

2. 启用静态内容压缩

与动态压缩类似,静态内容压缩也有助于提升性能。压缩图片、CSS 和 JavaScript 文件可以减少加载时间,尤其是在低带宽环境下。

powershellCopy Code
Set-WebConfigurationProperty -Filter "/system.webServer/httpCompression" -Name "staticCompression" -Value "True"

此命令启用静态内容的压缩。

3. 增加应用池的最大工作进程数

如果您的网站访问量较大,可以增加 IIS 应用池的最大工作进程数,从而提高并发处理能力。

powershellCopy Code
Set-ItemProperty -Path "IIS:\AppPools\YourAppPool" -Name "processModel.maxProcesses" -Value 10

此命令将 YourAppPool 应用池的最大进程数设置为 10。根据实际需求,您可以调整此值。

4. 配置请求超时设置

为了防止请求超时导致的性能问题,您可以调整请求超时时间,以提高网站的响应性。

powershellCopy Code
Set-WebConfigurationProperty -Filter "/system.webServer/asp" -Name "executionTimeout" -Value 3600

此命令将 ASP 请求的超时时间设置为 3600 秒(即 1 小时)。对于长时间运行的操作,可以适当增加此值。

5. 启用请求队列限制

当服务器处理大量并发请求时,可以启用请求队列限制,以防止资源被过度占用,导致系统崩溃。

powershellCopy Code
Set-WebConfigurationProperty -Filter "/system.webServer/serverRuntime" -Name "maxConcurrentRequestsPerCPU" -Value 500

此命令将最大并发请求数设置为 500,有助于避免过多请求对服务器造成过大的负担。


自动化部署

通过 PowerShell 脚本,您可以实现 IIS 网站的自动化部署,减少手动操作的繁琐,确保环境的一致性。

1. 创建并部署新的 IIS 网站

假设您需要将新的网站部署到 IIS,可以使用以下 PowerShell 脚本:

powershellCopy Code
# 创建新的应用池
New-WebAppPool -Name "NewAppPool" 

# 创建新网站并绑定域名和端口
New-Website -Name "NewSite" -Port 80 -HostHeader "www.newsite.com" -PhysicalPath "C:\inetpub\wwwroot\newsite" -ApplicationPool "NewAppPool"

# 配置 SSL 证书绑定
New-WebBinding -Name "NewSite" -BindingInformation "*:443:" -CertificateThumbprint "YourCertificateThumbprint" -CertificateStoreName "My" -Protocol "https"

此脚本会创建一个新的应用池,并为新的网站配置 HTTP 和 HTTPS 绑定。

2. 自动化文件同步与部署

在部署更新或新版本时,您可能需要同步文件到 IIS 网站的根目录。可以使用 PowerShell 实现这一功能:

powershellCopy Code
$sourcePath = "D:\Deployment\NewVersion"
$destinationPath = "C:\inetpub\wwwroot\newsite"

# 复制文件到 IIS 网站根目录
Copy-Item -Path $sourcePath\* -Destination $destinationPath -Recurse -Force

该命令会将部署包中的文件递归复制到 IIS 网站目录。

3. 自动化回滚

如果更新部署后出现问题,您可能需要快速回滚到上一个版本。通过 PowerShell 自动化回滚流程,您可以节省大量时间。

powershellCopy Code
$previousVersionPath = "D:\Deployment\PreviousVersion"
$destinationPath = "C:\inetpub\wwwroot\newsite"

# 回滚到上一个版本
Remove-Item -Path $destinationPath\* -Recurse
Copy-Item -Path $previousVersionPath\* -Destination $destinationPath -Recurse -Force

该脚本会将网站目录恢复为上一个稳定版本。


 

通过 PowerShell 配置和自动化管理 IIS,您可以实现以下目标:

  • 安全性:配置 SSL/TLS 加密、禁用不安全的 HTTP 方法、管理 WebSocket 和目录浏览等安全功能。
  • 性能优化:启用压缩、调整应用池配置、增加最大进程数、配置请求超时等性能增强。
  • 自动化部署:使用 PowerShell 实现网站创建、文件同步和自动回滚等操作,简化部署流程。

这些配置将帮助您有效管理 IIS 网站,提升其安全性、性能和可靠性。


IIS 管理高级操作:日志和监控配置

在生产环境中,监控和记录网站活动是确保系统健康运行的关键因素。通过 PowerShell 配置 IIS 日志和监控,可以让您快速发现潜在问题并及时解决。

1. 启用和配置 IIS 日志

IIS 日志记录了访问请求的详细信息,可以帮助您进行故障排除和分析流量。通过 PowerShell,您可以配置日志设置以满足您的需求。

配置日志存储位置和格式
powershellCopy Code
Set-WebConfigurationProperty -Filter "/system.webServer/loging" -Name "logFile" -Value @{
    directory = "D:\IISLogs";
    enabled = "True";
    logFormat = "W3C";
    period = "Daily";
    localTimeRollover = "True";
    truncationSize = 10485760  # 10 MB
}

这段代码将日志文件存储到 D:\IISLogs 目录,并使用 W3C 格式进行记录。日志文件会每日生成,并且每个日志文件的最大大小为 10 MB。超过 10 MB 后,日志文件会被截断。

配置日志内容

如果您需要记录特定的请求信息(如客户端 IP 地址、请求的 URL、响应时间等),可以通过 PowerShell 定制日志字段:

powershellCopy Code
Set-WebConfigurationProperty -Filter "/system.webServer/logging" -Name "logExtFileFlags" -Value "Date, Time, ClientIP, ServerIP, Method, UriStem, UriQuery, Status, UserAgent"

这会启用记录日期、时间、客户端 IP、服务器 IP、请求方法、请求 URI、查询字符串、响应状态码和用户代理等信息。

2. 监控 IIS 性能

监控服务器的性能非常重要,特别是在流量较大的网站上。通过 PowerShell,您可以自动化性能监控任务,生成报告并设置报警机制。

启用性能计数器

IIS 提供了一些常见的性能计数器,您可以使用 PowerShell 启用并查看这些计数器。

powershellCopy Code
# 获取 IIS 性能计数器
Get-Counter -Counter "\Web Service(*)\Current Connections"

这个命令将返回有关每个 Web 服务实例的当前连接数,帮助您监控并发请求的数量。

设置性能报警

如果您希望在服务器资源使用达到特定阈值时发出警报,可以创建 PowerShell 脚本进行监控并自动发送通知。

powershellCopy Code
# 设置性能阈值
$threshold = 80  # CPU 使用率超过 80% 时报警
$cpuUsage = (Get-Counter '\Processor(_Total)\% Processor Time').CounterSamples.CookedValue

if ($cpuUsage -gt $threshold) {
    Send-MailMessage -To "admin@domain.com" -From "monitor@domain.com" -Subject "High CPU Usage Alert" -Body "The CPU usage has exceeded $threshold%. Current usage: $cpuUsage%" -SmtpServer "smtp.domain.com"
}

这段脚本会监控 CPU 使用率,并在超过 80% 时通过电子邮件发送警报。您可以根据实际需要调整性能阈值和监控项(例如内存使用率、磁盘空间等)。

3. 配置 IIS 异常日志

IIS 还可以记录发生的错误和异常,以帮助您快速定位问题。可以通过以下 PowerShell 命令来配置异常日志。

启用和配置错误日志
powershellCopy Code
Set-WebConfigurationProperty -Filter "/system.webServer/httpErrors" -Name "existingResponse" -Value "Auto"
Set-WebConfigurationProperty -Filter "/system.webServer/httpErrors" -Name "errorMode" -Value "DetailedLocalOnly"
  • existingResponse = Auto:自动决定是否将现有响应覆盖(例如,用户请求一个不存在的页面时,IIS 会发送 404 错误)。
  • errorMode = DetailedLocalOnly:仅在本地服务器上返回详细错误信息,避免外部用户看到敏感的调试信息。

4. 自动化健康检查

确保网站始终正常运行是管理员的主要责任。通过自动化健康检查,您可以定期监控网站的可用性,并在网站出现问题时快速采取行动。

使用 PowerShell 脚本定期检查网站状态
powershellCopy Code
$websiteUrl = "http://www.yoursite.com"
$response = Invoke-WebRequest -Uri $websiteUrl -Method Head

if ($response.StatusCode -ne 200) {
    Send-MailMessage -To "admin@domain.com" -From "monitor@domain.com" -Subject "Website Down Alert" -Body "The website $websiteUrl is currently down. HTTP status code: $($response.StatusCode)" -SmtpServer "smtp.domain.com"
}

此脚本会定期检查指定网站的状态。如果网站返回的 HTTP 状态码不是 200(正常),则会发送邮件通知管理员。

5. 配置 Application Pool 的监控

监控和管理应用池的健康状况非常重要,尤其是在处理大量用户请求的情况下。PowerShell 可以帮助您自动重启故障的应用池,保证网站的持续可用性。

监控和重启应用池
powershellCopy Code
$appPoolName = "YourAppPool"
$maxRestarts = 5
$restarts = (Get-WebAppPoolState -Name $appPoolName).restarts

if ($restarts -gt $maxRestarts) {
    Restart-WebAppPool -Name $appPoolName
    Send-MailMessage -To "admin@domain.com" -From "monitor@domain.com" -Subject "Application Pool Restarted" -Body "The application pool $appPoolName was restarted after exceeding the maximum restart limit." -SmtpServer "smtp.domain.com"
}

此脚本会监控应用池的重启次数,如果重启次数超过了设定的最大次数,则会自动重启应用池并通知管理员。


IIS 自动化任务和常见脚本

通过 PowerShell,您可以自动化很多常见的 IIS 管理任务。以下是一些常见的任务和脚本,帮助您节省时间并提高管理效率。

1. 自动化应用池清理

IIS 应用池可能会在一段时间后变得无响应,您可以定期重启应用池以确保它们始终处于最佳状态。

powershellCopy Code
$webAppPools = Get-ItemProperty "IIS:\AppPools\*" | Where-Object { $_.state -eq "Stopped" }
foreach ($appPool in $webAppPools) {
    Restart-WebAppPool -Name $appPool.PSChildName
}

该脚本会查找并重启所有停止状态的应用池,确保所有应用池处于运行状态。

2. 定期删除临时文件

为避免服务器存储空间被临时文件占用,您可以定期删除 IIS 临时目录中的文件。

powershellCopy Code
$logPath = "C:\inetpub\logs\LogFiles"
$daysOld = 30
$cutoffDate = (Get-Date).AddDays(-$daysOld)

Get-ChildItem -Path $logPath -Recurse | Where-Object { $_.LastWriteTime -lt $cutoffDate } | Remove-Item -Force

该脚本会删除 30 天前的所有日志文件,释放磁盘空间。

3. 自动化网站备份

为了防止数据丢失,定期备份网站是非常重要的。可以使用 PowerShell 自动化网站文件和配置的备份。

powershellCopy Code
$sourcePath = "C:\inetpub\wwwroot\yourwebsite"
$backupPath = "D:\Backups\YourWebsiteBackup"
$timestamp = Get-Date -Format "yyyyMMddHHmmss"
$backupDir = "$backupPath\Backup_$timestamp"

# 创建备份目录
New-Item -Path $backupDir -ItemType Directory

# 备份网站文件
Copy-Item -Path $sourcePath\* -Destination $backupDir -Recurse -Force

# 备份 IIS 配置
Export-WebConfiguration -FilePath "$backupDir\IIS_Config_$timestamp.xml"

此脚本会备份指定网站的所有文件以及 IIS 配置,保存在 D:\Backups 目录下,并为每次备份添加时间戳。


总结

通过以上的 PowerShell 脚本和配置,您可以:

  • 实现 日志管理 和 监控,帮助您跟踪网站性能和发现潜在问题。
  • 配置 应用池 和 健康检查,确保 IIS 网站的高可用性。
  • 自动化常见的管理任务,如 应用池清理临时文件删除网站备份 等。
  • 提高 IIS 性能和安全性,减少手动操作,简化管理工作。

这些自动化脚本和配置方法将极大地提升您的 IIS 网站管理效率,确保其高效、稳定、安全地运行。


IIS 自动化管理与脚本进一步优化

为了更好地管理 IIS 网站和应用池,您可以进一步优化 PowerShell 脚本和配置,使得 IIS 管理更加自动化、精细化、灵活化。以下是一些更高级的自动化管理技巧和常见用法,帮助您提高生产环境中的工作效率。


1. 优化 IIS 负载均衡配置

如果您的网站部署在多个 IIS 实例中,您可能需要配置负载均衡。通过 PowerShell,您可以管理集群中的负载均衡设置,并监控各个节点的健康状况。

自动检测并配置负载均衡

假设您有多个 IIS 实例并希望在其中进行负载均衡,您可以设置一个脚本,定期检查各个 IIS 实例的负载状况,并根据当前负载动态调整负载均衡策略。

powershellCopy Code
# 获取集群中所有 IIS 节点的健康状态
$nodes = Get-Content -Path "C:\LoadBalancer\nodes.txt"

foreach ($node in $nodes) {
    $status = Test-Connection -ComputerName $node -Count 1 -Quiet
    if ($status -eq $false) {
        # 如果节点不可达,禁用负载均衡
        Set-WebConfigurationProperty -Filter "/system.webServer/loadBalancing" -Name "enabled" -Value "False" -Location $node
        Write-Host "$node is down. Load balancing disabled."
    } else {
        # 节点正常,启用负载均衡
        Set-WebConfigurationProperty -Filter "/system.webServer/loadBalancing" -Name "enabled" -Value "True" -Location $node
        Write-Host "$node is up. Load balancing enabled."
    }
}

在这个脚本中,我们通过 Test-Connection 命令检测每个节点的可用性。如果某个节点不可用,它会自动禁用该节点的负载均衡设置,避免请求发送到不可用的服务器。

定期优化负载均衡配置

对于使用负载均衡的 IIS 环境,您还可以定期根据流量负载和服务器健康状况调整负载均衡策略。例如,您可以使用 PowerShell 动态调整权重,优先选择健康负载低的服务器来处理请求。

powershellCopy Code
$serverLoadThreshold = 70  # 如果负载超过 70%,禁用该服务器
$servers = Get-WebConfiguration -Filter "/system.webServer/loadBalancing/servers/*"

foreach ($server in $servers) {
    $load = Get-ServerLoad -Server $server.PSChildName  # 获取服务器的当前负载
    if ($load -gt $serverLoadThreshold) {
        # 如果负载过高,禁用该服务器的负载均衡
        Set-WebConfigurationProperty -Filter "/system.webServer/loadBalancing/servers/$($server.PSChildName)" -Name "enabled" -Value "False"
        Write-Host "$($server.PSChildName) is disabled due to high load."
    }
}

此脚本根据每个服务器的负载情况动态调整负载均衡配置,确保流量不被导向负载过重的服务器。


2. IIS 安全性增强自动化

确保 IIS 服务器的安全性是所有管理员的头等大事。通过 PowerShell,您可以定期扫描和修复潜在的安全漏洞,优化安全设置。

自动化 SSL 配置检查

IIS 网站通常需要使用 SSL 加密来保护数据传输。您可以使用 PowerShell 自动化 SSL 证书配置检查,确保所有的 HTTPS 站点都配置了有效的 SSL 证书,并启用了强加密。

powershellCopy Code
# 获取所有启用 HTTPS 的站点
$sites = Get-WebSite | Where-Object { $_.Bindings -match "https" }

foreach ($site in $sites) {
    $sslCert = Get-WebBinding -Name $site.Name -Protocol "https" | Select-Object -ExpandProperty certificateHash
    if (-not $sslCert) {
        Write-Host "$($site.Name) does not have a valid SSL certificate."
    } else {
        Write-Host "$($site.Name) has a valid SSL certificate."
    }
}

此脚本会检查所有启用了 HTTPS 的站点,验证是否已配置有效的 SSL 证书。

定期执行 IIS 安全配置扫描

为了确保 IIS 配置符合最佳安全实践,您可以定期执行安全性扫描,检查是否存在潜在的安全风险,如过时的 TLS 协议、开放的端口或缺乏防火墙保护等。

powershellCopy Code
# 执行安全性配置扫描,检查 TLS 协议版本
$enabledProtocols = Get-WebConfigurationProperty -Filter "/system.webServer/security/ssl/sslProtocols" -Name "enabled"

if ($enabledProtocols -notcontains "TLSv1.2") {
    Write-Host "Warning: TLSv1.2 is not enabled. Please enable it for better security."
}

如果 TLSv1.2 没有启用,该脚本会提醒管理员开启这一协议以增强安全性。


3. IIS 集群和负载均衡的自动扩展

对于大型部署,您可能希望能够基于流量的变化自动扩展 IIS 集群的容量。可以通过 PowerShell 结合云服务(如 Azure)和负载均衡器来实现动态扩展。

动态增加 IIS 节点到负载均衡池

如果您在云环境中运行 IIS 网站,可以结合 PowerShell 和云 API 根据实时流量自动增加或删除 IIS 节点。例如,在 Azure 环境中,您可以使用 PowerShell 脚本增加或删除虚拟机实例。

powershellCopy Code
# 获取流量负载
$currentLoad = Get-WebSite | Select-Object -ExpandProperty CurrentConnections

# 判断是否需要扩展
if ($currentLoad -gt 1000) {
    # 调用 Azure API 增加虚拟机实例
    New-AzVM -ResourceGroupName "WebResourceGroup" -Location "East US" -VMName "IIS-Scale-Out-VM" -Size "Standard_D2s_v3"
    Write-Host "Scaling out IIS by adding a new VM."
}

如果当前流量超过指定阈值(如 1000 个连接),该脚本将调用 Azure API 扩展集群,添加更多虚拟机实例来处理增加的流量。

自动化负载均衡池缩减

同样,您也可以根据流量减少自动缩减 IIS 集群的规模。以下是一个根据负载减少的自动缩减脚本:

powershellCopy Code
# 获取流量负载
$currentLoad = Get-WebSite | Select-Object -ExpandProperty CurrentConnections

# 判断是否需要缩减
if ($currentLoad -lt 500) {
    # 调用 Azure API 删除多余的虚拟机实例
    Remove-AzVM -ResourceGroupName "WebResourceGroup" -Name "IIS-Scale-Out-VM" -Force
    Write-Host "Scaling in IIS by removing a VM."
}

如果流量低于 500 个连接,脚本会调用 Azure API 删除不再需要的虚拟机实例,减少资源消耗。


4. 日志管理与分析

IIS 日志提供了丰富的信息,供您分析和监控网站的健康状况。为了更加高效地使用 IIS 日志,您可以使用 PowerShell 自动化日志管理与分析。

自动化日志存档和清理

为了避免日志文件占用过多磁盘空间,您可以定期将旧的日志文件归档,并删除过期的日志文件。

powershellCopy Code
$logDirectory = "C:\inetpub\logs\LogFiles"
$archiveDirectory = "D:\IISLogs\Archived"
$cutoffDate = (Get-Date).AddDays(-30)

# 创建归档目录(如果不存在)
if (-not (Test-Path -Path $archiveDirectory)) {
    New-Item -Path $archiveDirectory -ItemType Directory
}

# 查找 30 天前的日志文件并归档
Get-ChildItem -Path $logDirectory | Where-Object { $_.LastWriteTime -lt $cutoffDate } | ForEach-Object {
    $archivePath = Join-Path $archiveDirectory $_.Name
    Move-Item -Path $_.FullName -Destination $archivePath
    Write-Host "Archived: $($_.Name)"
}

此脚本会查找并归档 30 天前的日志文件,以防止日志文件过多占用磁盘空间。

 

 

分析日志以检测异常

如果您希望在日志中查找异常(如频繁的 500 错误),可以使用以下脚本:

powershellCopy Code
$logFile = "C:\inetpub\logs\LogFiles\W3SVC1\u_ex230101.log"
$errors = Select-String -Path $logFile -Pattern " 500 "

if ($errors) {
    Write-Host "Found 500 errors in the log:"
    $errors | ForEach-Object { Write-Host $_.Line }
}

此脚本会扫描指定的日志文件,查找所有 500错误并显示相关信息,以便管理员快速响应和解决问题。

定期清理日志文件

为了防止日志文件占用过多的存储空间,您可以设置一个定期清理的脚本,删除过期的日志文件或将它们转移到备份位置:

powershellCopy Code
$logDirectory = "C:\inetpub\logs\LogFiles"
$backupDirectory = "D:\IISLogs\Backup"
$cutoffDate = (Get-Date).AddDays(-60)  # 保留60天内的日志文件

# 创建备份目录(如果不存在)
if (-not (Test-Path -Path $backupDirectory)) {
    New-Item -Path $backupDirectory -ItemType Directory
}

# 查找过期的日志文件并备份
Get-ChildItem -Path $logDirectory | Where-Object { $_.LastWriteTime -lt $cutoffDate } | ForEach-Object {
    $backupPath = Join-Path $backupDirectory $_.Name
    Move-Item -Path $_.FullName -Destination $backupPath
    Write-Host "Archived log file: $($_.Name)"
}

此脚本将检查并转移 60 天前的日志文件,并将其备份到指定的目录中。这有助于确保日志文件不会占用过多的磁盘空间,同时保持对旧日志的访问。


5. 网站性能监控与优化

IIS 性能监控是确保网站运行平稳和高效的关键。通过 PowerShell,您可以定期检查 IIS 网站的性能并自动化优化。

自动检查 CPU 和内存使用情况

高 CPU 或内存使用可能会影响 IIS 网站的性能。通过 PowerShell,您可以定期监控系统资源并在资源过载时采取措施。

powershellCopy Code
# 设置资源阈值
$cpuThreshold = 80  # CPU 使用超过 80% 时触发警报
$memoryThreshold = 80  # 内存使用超过 80% 时触发警报

# 获取当前 CPU 和内存使用情况
$cpuUsage = Get-WmiObject -Class Win32_Processor | Select-Object -ExpandProperty LoadPercentage
$memoryUsage = Get-WmiObject -Class Win32_OperatingSystem | Select-Object -ExpandProperty FreePhysicalMemory

# 计算剩余内存百分比
$totalMemory = (Get-WmiObject -Class Win32_OperatingSystem).TotalVisibleMemorySize
$usedMemory = $totalMemory - $memoryUsage
$memoryUsagePercent = ($usedMemory / $totalMemory) * 100

# 检查 CPU 使用情况
if ($cpuUsage -gt $cpuThreshold) {
    Write-Host "Warning: CPU usage is high ($cpuUsage%). Consider optimizing the website or server performance."
}

# 检查内存使用情况
if ($memoryUsagePercent -gt $memoryThreshold) {
    Write-Host "Warning: Memory usage is high ($memoryUsagePercent%). Consider adding more memory or optimizing resource usage."
}

此脚本将监控服务器的 CPU 和内存使用情况,并在资源使用超过设定的阈值时发出警告。可以根据实际需要调整阈值,或触发相关的自动优化措施,如重启 IIS 服务、清理缓存等。

自动化性能报告生成

为了确保 IIS 网站的性能始终处于最佳状态,您可以定期生成性能报告,并通过电子邮件通知相关人员。以下是一个生成 IIS 性能报告并发送电子邮件的示例脚本:

powershellCopy Code
# 获取网站的当前连接数和请求处理时间
$webSites = Get-WebSite
$report = @()

foreach ($site in $webSites) {
    $siteStats = Get-WebSiteStatistics -Name $site.Name
    $report += [PSCustomObject]@{
        SiteName        = $site.Name
        CurrentConnections = $siteStats.CurrentConnections
        RequestsPerSecond = $siteStats.RequestsPerSecond
        AverageRequestDuration = $siteStats.AvgRequestDuration
    }
}

# 将报告内容转换为表格
$reportContent = $report | Format-Table -AutoSize | Out-String

# 设置电子邮件参数
$emailFrom = "admin@domain.com"
$emailTo = "it-support@domain.com"
$smtpServer = "smtp.domain.com"
$emailSubject = "IIS Performance Report - $(Get-Date -Format 'yyyy-MM-dd')"

# 发送邮件
Send-MailMessage -From $emailFrom -To $emailTo -Subject $emailSubject -Body $reportContent -SmtpServer $smtpServer

该脚本将自动收集网站的统计信息(如当前连接数、请求处理时间等),并生成一份性能报告,通过电子邮件发送给管理员或相关人员。


6. 自动化应用池健康检查与恢复

IIS 中的应用池是网站服务的关键部分。应用池崩溃或停用会影响网站的正常运行。通过 PowerShell,您可以定期检查应用池的健康状况,并在检测到问题时自动重启。

自动检查应用池的状态并重启

以下脚本定期检查 IIS 应用池的状态,如果发现应用池未运行或崩溃,则自动重启应用池。

powershellCopy Code
# 获取所有应用池
$appPools = Get-WebAppPool

foreach ($appPool in $appPools) {
    # 检查应用池的状态
    if ($appPool.state -ne 'Started') {
        Write-Host "App pool '$($appPool.Name)' is not running. Restarting it."
        Restart-WebAppPool -Name $appPool.Name
    }
}

该脚本会检查每个应用池的状态,如果某个应用池没有运行,则会自动重新启动它。

定期重启应用池

为了避免应用池因长时间运行而出现内存泄漏等问题,您可以定期自动重启应用池。例如,每天凌晨 3 点自动重启所有应用池:

powershellCopy Code
# 定义自动重启的时间
$restartTime = "03:00"

# 检查当前时间是否达到重启时间
if ((Get-Date).ToString("HH:mm") -eq $restartTime) {
    $appPools = Get-WebAppPool

    foreach ($appPool in $appPools) {
        Write-Host "Restarting app pool '$($appPool.Name)' for scheduled maintenance."
        Restart-WebAppPool -Name $appPool.Name
    }
}

此脚本将在每天凌晨 3 点自动重启所有应用池,可以避免长时间运行引起的性能问题。


 

通过 PowerShell 自动化管理 IIS,您可以极大提高网站的可靠性、性能、安全性和可维护性。上述脚本和技巧涵盖了从负载均衡、性能监控、日志管理到安全性强化的多个方面,能够帮助您更高效地管理 IIS 环境。定期检查和自动化处理常见任务不仅节省了大量人工操作时间,还能确保服务的持续健康运行。


分享一些有关 IIS 管理自动化脚本 的高级技巧和实际操作,这些脚本可以帮助你高效地管理 IIS 服务器、优化性能、提升安全性,并确保网站的高可用性。


7. 自动化 SSL 证书管理

管理 SSL 证书是确保 IIS 网站安全的关键任务之一。定期更新和更换 SSL 证书对于保护用户数据至关重要。通过 PowerShell 脚本,你可以实现证书的自动化管理,包括安装新证书、更新到期证书、并为多个网站配置证书。

自动安装 SSL 证书

以下是一个自动安装并绑定 SSL 证书到 IIS 网站的脚本示例:

powershellCopy Code
# 设置证书路径和网站绑定信息
$certPath = "C:\path\to\your\certificate.pfx"
$certPassword = "yourCertificatePassword"
$siteName = "YourSiteName"
$bindingPort = 443
$bindingIP = "*"

# 导入证书到本地计算机的证书存储
$cert = Import-PfxCertificate -FilePath $certPath -Password (ConvertTo-SecureString -String $certPassword -AsPlainText -Force) -CertStoreLocation Cert:\LocalMachine\My

# 获取证书指纹
$certThumbprint = $cert.Thumbprint

# 获取网站的现有绑定
$bindings = Get-WebBinding -Name $siteName

# 为网站配置 SSL 绑定
New-WebBinding -Name $siteName -BindingInformation "*:$bindingPort:" -CertificateThumbprint $certThumbprint -CertificateStoreName My -Protocol https

Write-Host "SSL certificate successfully installed and bound to site $siteName."

自动更新到期证书

为了避免 SSL 证书到期导致网站无法访问,你可以设置一个定期检查证书过期日期的脚本,并提前进行更新。以下是一个自动检查证书并更新的示例:

powershellCopy Code
# 获取证书列表(只检查 HTTPS 绑定的证书)
$bindings = Get-WebBinding | Where-Object { $_.protocol -eq "https" }

foreach ($binding in $bindings) {
    # 获取绑定的证书指纹
    $certThumbprint = $binding.CertificateThumbprint

    # 查找证书
    $cert = Get-Item "Cert:\LocalMachine\My\$certThumbprint"
    
    # 检查证书是否过期
    $expiryDate = $cert.NotAfter
    $currentDate = Get-Date

    if ($expiryDate -lt $currentDate.AddDays(30)) {
        Write-Host "Warning: SSL certificate for site '$($binding.Name)' will expire on $expiryDate. Please renew it."

        # 这里你可以加入自动更新证书的逻辑,比如从证书管理系统下载新的证书,或者调用 API 等
    }
}

这个脚本将扫描所有启用 HTTPS 的网站,并检查证书是否即将到期。你可以根据需要,加入证书更新和自动替换的逻辑。


8. 自动化 IIS 网站日志轮换和备份

IIS 网站日志文件随着时间积累会占用大量磁盘空间,尤其在高流量网站中。这些日志需要定期轮换和备份。以下是一个自动化轮换和备份 IIS 网站日志的脚本示例。

自动化日志文件轮换和备份

powershellCopy Code
# 定义日志目录和备份目录
$logDirectory = "C:\inetpub\logs\LogFiles"
$backupDirectory = "D:\IISLogs\Backup"

# 获取今天的日期
$todayDate = Get-Date -Format "yyyy-MM-dd"

# 创建备份目录(如果不存在)
if (-not (Test-Path -Path $backupDirectory)) {
    New-Item -Path $backupDirectory -ItemType Directory
}

# 查找今天的日志文件并备份
Get-ChildItem -Path $logDirectory -Filter "*.log" | Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-1) } | ForEach-Object {
    # 为每个日志文件创建备份
    $backupPath = Join-Path $backupDirectory "$todayDate-$($_.Name)"
    Move-Item -Path $_.FullName -Destination $backupPath
    Write-Host "Backed up log file: $($_.Name) to $backupPath"
}

# 删除超过60天的旧日志
$cutoffDate = (Get-Date).AddDays(-60)
Get-ChildItem -Path $backupDirectory | Where-Object { $_.LastWriteTime -lt $cutoffDate } | ForEach-Object {
    Remove-Item -Path $_.FullName
    Write-Host "Deleted old log file: $($_.Name)"
}

该脚本将:

  1. 自动备份今天的日志文件。
  2. 删除 60 天前的旧日志,节省磁盘空间。

9. 自动化 IIS 安全加固

IIS 安全性对于保护网站免受恶意攻击至关重要。你可以通过 PowerShell 脚本自动化一些常见的安全加固操作,如禁用不必要的 IIS 模块、强化密码策略等。

禁用不必要的 IIS 模块

某些 IIS 模块可能存在安全漏洞,或者不被使用。你可以禁用这些模块来增强安全性。

powershellCopy Code
# 获取所有已启用的 IIS 模块
$modules = Get-WebConfigurationProperty -Filter /system.webServer/modules -Name collection

# 禁用不需要的模块
$modules | Where-Object { $_.name -in @("WebDAVModule", "RequestFilteringModule") } | ForEach-Object {
    Set-WebConfigurationProperty -Filter "/system.webServer/modules" -Name collection -AtElement $_ -Value @{}
    Write-Host "Disabled module: $($_.name)"
}

该脚本会禁用 WebDAV 和请求过滤模块。你可以根据实际需求选择禁用其他模块。

强化密码策略

IIS 还支持对账户的密码策略进行加强,防止弱密码攻击。以下是设置密码复杂度要求的脚本:

powershellCopy Code
# 设置密码复杂度要求
Set-LocalUser -Name "IISAppPool\YourAppPool" -PasswordNeverExpires $false
Set-LocalUser -Name "IISAppPool\YourAppPool" -UserMustChangePassword $true

# 设置密码策略
secpol.msc /set passwordcomplexity enabled
secpol.msc /set minimumpasswordlength 12

这些设置将确保 IIS 应用池账户的密码符合更严格的安全要求。


10. 自动化 IIS 网站备份与恢复

定期备份网站配置和内容是防止数据丢失的重要措施。以下是一个自动化备份 IIS 网站配置和内容的脚本。

自动化网站配置备份

powershellCopy Code
# 获取所有网站配置并备份
$backupDirectory = "D:\IISBackups"
$backupFile = "$backupDirectory\IISConfigBackup_$(Get-Date -Format 'yyyy-MM-dd_HH-mm').zip"

# 创建备份目录(如果不存在)
if (-not (Test-Path -Path $backupDirectory)) {
    New-Item -Path $backupDirectory -ItemType Directory
}

# 备份 IIS 配置
$webConfigBackup = "C:\inetpub\wwwroot\web.config"
$iisConfigBackup = "C:\Windows\System32\inetsrv\config"

# 压缩网站配置文件和 IIS 配置
Compress-Archive -Path $iisConfigBackup, $webConfigBackup -DestinationPath $backupFile

Write-Host "IIS Configuration successfully backed up to $backupFile."

该脚本会将 IIS 配置文件和网站内容进行压缩备份到指定目录。

自动化网站恢复

在需要恢复网站时,你可以使用以下脚本进行恢复:

powershellCopy Code
# 定义备份文件路径
$backupFile = "D:\IISBackups\IISConfigBackup_2024-12-01_12-00.zip"

# 解压备份文件到原始目录
Expand-Archive -Path $backupFile -DestinationPath "C:\inetpub\wwwroot"

Write-Host "IIS Configuration successfully restored."

该脚本会根据指定的备份文件路径恢复 IIS 网站的配置和内容。


 

通过 PowerShell 脚本自动化 IIS 管理任务,不仅能提高管理效率,还能减少人为错误和系统宕机风险。你可以根据自己的需求扩展和定制这些脚本,涵盖从安全加固、证书管理到日志轮换、备份恢复等各个方面。


分享更多关于 IIS 管理自动化脚本 的高级技巧。这些技巧将帮助你更好地管理 IIS 环境,提高自动化运维的效率和安全性。


11. 自动化 IIS 网站的健康检查与重启

IIS 网站的健康检查和定期重启对于确保服务的持续可用性至关重要。通过 PowerShell 脚本,你可以定期检查网站的状态,并在出现问题时自动重启网站或服务。

自动化健康检查

以下是一个示例脚本,用于定期检查 IIS 网站的状态,如果发现网站宕机,则自动重新启动该网站。

powershellCopy Code
# 设置网站名称
$siteName = "YourSiteName"
$maxRetries = 3
$retryInterval = 5  # 重试间隔,单位为秒

# 获取网站状态
function Get-SiteStatus {
    $site = Get-WebSite -Name $siteName
    return $site.state
}

# 尝试检查网站健康状态并重启
$retries = 0
while ($retries -lt $maxRetries) {
    $status = Get-SiteStatus

    if ($status -eq "Started") {
        Write-Host "Site '$siteName' is running."
        break
    } else {
        Write-Host "Site '$siteName' is down. Attempting restart..."
        Restart-WebSite -Name $siteName
        $retries++
        if ($retries -eq $maxRetries) {
            Write-Host "Failed to start the site after $maxRetries attempts. Please check manually."
        } else {
            Start-Sleep -Seconds $retryInterval
        }
    }
}

这个脚本会每隔一段时间检查 IIS 网站的状态,如果网站停止工作,它将尝试重启网站。最多会重试三次,如果三次失败,则需要手动检查。

自动化网站重启

你可以设置一个定期重启 IIS 网站的脚本,以便释放资源、避免内存泄漏或清理日志等。

powershellCopy Code
# 设置要重启的 IIS 网站名称
$siteName = "YourSiteName"

# 每天定期重启网站
$timeToRestart = "03:00"  # 设置重启时间,比如凌晨 3 点

while ($true) {
    $currentTime = Get-Date -Format "HH:mm"
    if ($currentTime -eq $timeToRestart) {
        Write-Host "Restarting site '$siteName' at $currentTime..."
        Restart-WebSite -Name $siteName
        Start-Sleep -Seconds 60  # 防止重复触发
    }
    Start-Sleep -Seconds 60  # 每分钟检查一次
}

这个脚本会定期检查当前时间,并在设定的时间自动重启网站。你可以根据需要修改重启时间,确保网站处于最佳状态。


12. 自动化 IIS 网站访问控制(基于 IP 地址)

有时候你可能希望根据客户端的 IP 地址来控制对 IIS 网站的访问。通过 PowerShell 脚本,你可以自动化这些访问控制规则,限制某些 IP 地址或允许特定的 IP 范围访问。

自动化基于 IP 地址的访问限制

以下是一个示例脚本,用于限制某些 IP 地址或 IP 范围的访问:

powershellCopy Code
# 设置网站名称
$siteName = "YourSiteName"

# 定义允许访问的 IP 地址范围
$allowedIPs = @("192.168.1.10", "192.168.1.11")

# 获取当前网站的所有 IP 访问规则
$accessRules = Get-WebConfigurationProperty -Filter "/system.webServer/security/ipSecurity" -Name collection -PSPath "IIS:\Sites\$siteName"

# 为每个不在允许列表中的 IP 地址添加拒绝访问规则
foreach ($rule in $accessRules) {
    if ($allowedIPs -notcontains $rule.ipAddress) {
        Write-Host "Blocking IP address: $($rule.ipAddress)"
        Remove-WebConfigurationProperty -Filter "/system.webServer/security/ipSecurity" -Name collection -PSPath "IIS:\Sites\$siteName" -AtElement $rule
    }
}

# 新增允许访问的 IP 地址
foreach ($ip in $allowedIPs) {
    Add-WebConfigurationProperty -Filter "/system.webServer/security/ipSecurity" -Name collection -Value @{ipAddress=$ip;allowed="true"} -PSPath "IIS:\Sites\$siteName"
    Write-Host "Allowing access for IP address: $ip"
}

这个脚本会扫描并移除现有规则中的非允许 IP 地址,并根据需要添加新的允许 IP 地址。你可以扩展此功能来实现更复杂的访问控制策略。

通过 IP 地址限制访问(黑名单)

如果你希望使用黑名单功能,自动阻止某些 IP 地址,你可以这样做:

powershellCopy Code
# 设置要阻止的 IP 地址
$blockedIPs = @("192.168.1.50", "192.168.1.51")

# 获取当前网站的所有 IP 访问规则
$accessRules = Get-WebConfigurationProperty -Filter "/system.webServer/security/ipSecurity" -Name collection -PSPath "IIS:\Sites\$siteName"

# 为黑名单 IP 地址添加拒绝访问规则
foreach ($ip in $blockedIPs) {
    Write-Host "Blocking IP address: $ip"
    Add-WebConfigurationProperty -Filter "/system.webServer/security/ipSecurity" -Name collection -Value @{ipAddress=$ip;allowed="false"} -PSPath "IIS:\Sites\$siteName"
}

该脚本会根据黑名单列表自动将指定 IP 地址列入拒绝访问的规则中。


13. 自动化 IIS 模块的启用/禁用

某些 IIS 模块可能对性能或安全性产生负面影响。如果你的 IIS 配置中包含一些不常用的模块,定期禁用这些模块有助于提高服务器的性能。

自动化禁用不常用的 IIS 模块

powershellCopy Code
# 设置禁用的模块列表
$disabledModules = @(
    "DefaultDocument",
    "HttpRedirect",
    "WebDAVModule"
)

# 遍历并禁用不需要的模块
foreach ($module in $disabledModules) {
    Set-WebConfigurationProperty -Filter "/system.webServer/modules" -Name collection -AtElement @{name=$module} -Value @{} -PSPath "IIS:\"
    Write-Host "Module '$module' has been disabled."
}

这个脚本会遍历你指定的模块,并将它们禁用。你可以根据实际需求选择启用或禁用模块。


14. 自动化 IIS 访问日志监控

IIS 访问日志提供了网站流量的重要数据。通过 PowerShell 脚本,你可以自动化对日志的监控,及时发现异常流量或攻击行为。

自动化日志文件监控(例如检查异常流量)

powershellCopy Code
# 设置日志文件路径
$logDirectory = "C:\inetpub\logs\LogFiles"
$logFile = "u_exYYMMDD.log"  # 假设你使用的是默认格式的日志文件

# 设置关键词,用于检测异常流量(如扫描、暴力破解等)
$keywords = @("403", "404", "500", "401", "badbot")

# 定期检查日志文件,发现异常请求
Get-ChildItem -Path $logDirectory -Filter $logFile | ForEach-Object {
    $logContents = Get-Content -Path $_.FullName
    foreach ($line in $logContents) {
        foreach ($keyword in $keywords) {
            if ($line -match $keyword) {
                Write-Host "Suspicious log entry detected: $line"
                # 可添加自动化警报或记录日志等操作
            }
        }
    }
}

该脚本会定期扫描 IIS 访问日志,检测 403(禁止访问)、404(未找到)、500(服务器错误)等常见的异常状态码,以及可能的恶意访问者标志(如 "badbot")。你可以根据需要调整异常流量的检测标准。


 

通过上述的脚本和技巧,你可以显著提高 IIS 环境的自动化管理能力。无论是网站健康检查、访问控制、日志监控,还是证书管理、安全加固,自动化脚本都可以帮助你有效地减轻管理负担,提升网站的安全性、可靠性和性能。


探讨一些更高级的 IIS 管理自动化脚本 和技巧,涵盖自动化备份、SSL 证书管理、性能监控、日志分析等方面的内容。这些技巧可以帮助你在 IIS 环境中实现更高效的自动化运维。


15. 自动化 IIS 网站和应用池的备份

定期备份 IIS 配置是确保网站数据安全的必要措施。通过 PowerShell 脚本,你可以自动化 IIS 网站配置和应用池的备份操作。这个备份过程包括网站的文件和配置文件,以便在故障发生时能够快速恢复。

自动化 IIS 配置备份

以下脚本会备份 IIS 的配置和应用池信息:

powershellCopy Code
# 设置备份目录和文件名
$backupDirectory = "C:\IISBackup"
$backupFileName = "IISConfigBackup_$(Get-Date -Format 'yyyyMMddHHmmss').xml"

# 创建备份目录(如果不存在)
if (-not (Test-Path -Path $backupDirectory)) {
    New-Item -ItemType Directory -Path $backupDirectory
}

# 执行 IIS 配置备份
$backupPath = Join-Path -Path $backupDirectory -ChildPath $backupFileName
Write-Host "Backing up IIS configuration to: $backupPath"
Export-IISConfiguration -Path $backupPath

这个脚本会将 IIS 的配置文件(包括网站和应用池配置)导出并保存在指定目录下。每次执行时,备份文件都会以时间戳命名,从而避免覆盖旧的备份文件。

自动化备份应用池配置

powershellCopy Code
# 设置应用池备份目录
$appPoolBackupDir = "C:\IISAppPoolBackup"
if (-not (Test-Path -Path $appPoolBackupDir)) {
    New-Item -ItemType Directory -Path $appPoolBackupDir
}

# 获取所有应用池配置并备份
Get-WebAppPool | ForEach-Object {
    $appPoolName = $_.Name
    $appPoolBackupFile = Join-Path -Path $appPoolBackupDir -ChildPath "$appPoolName-$(Get-Date -Format 'yyyyMMddHHmmss').xml"
    
    # 备份应用池配置
    Export-WebConfigurationProperty -Filter "/system.applicationHost/applicationPools/applicationPool[@name='$appPoolName']" -Name "applicationPool" -PSPath "IIS:\\" -Destination $appPoolBackupFile
    Write-Host "Backup of application pool '$appPoolName' saved to $appPoolBackupFile"
}

此脚本将备份所有应用池的配置文件,并为每个应用池生成一个备份文件。这样做可以确保在应用池配置损坏或丢失的情况下,可以迅速恢复配置。


16. 自动化 SSL 证书的管理

对于涉及 HTTPS 的 IIS 网站,SSL 证书的管理非常重要。你可以通过 PowerShell 脚本自动化证书的安装、更新和删除。

自动化安装 SSL 证书

powershellCopy Code
# 设置证书文件路径和证书密码
$certificatePath = "C:\path\to\certificate.pfx"
$certificatePassword = "YourPassword"

# 导入证书到证书存储区
$certificate = Import-PfxCertificate -FilePath $certificatePath -Password (ConvertTo-SecureString -String $certificatePassword -AsPlainText -Force) -CertStoreLocation "Cert:\LocalMachine\My"

# 获取证书的 thumbprint
$thumbprint = $certificate.Thumbprint

# 显示证书 thumbprint
Write-Host "SSL certificate installed with Thumbprint: $thumbprint"

该脚本会从指定的 .pfx 文件中导入 SSL 证书,并将其安装到机器的本地证书存储中。通过指定证书密码,你可以完成证书的安全导入。

自动化绑定 SSL 证书到 IIS 网站

powershellCopy Code
# 设置网站名称和证书 thumbprint
$siteName = "YourSiteName"
$thumbprint = "YourCertificateThumbprint"

# 获取网站的绑定信息
$bindings = Get-WebBinding -Name $siteName

# 如果已有 HTTPS 绑定,则更新证书,否则创建新的绑定
$httpsBinding = $bindings | Where-Object { $_.bindingInformation -like "*:443:*" }
if ($httpsBinding) {
    Write-Host "Updating SSL certificate binding for site '$siteName'..."
    $httpsBinding.AddSslCertificate($thumbprint, "My")
} else {
    Write-Host "Creating new SSL binding for site '$siteName'..."
    New-WebBinding -Name $siteName -Protocol "https" -BindingInformation "*:443:" -CertificateThumbprint $thumbprint -CertificateStoreName "My"
}

这个脚本会为指定的网站创建或更新 HTTPS 绑定,将 SSL 证书应用到指定的端口(通常为 443)。


17. 自动化 IIS 性能监控

IIS 性能监控对于确保网站的稳定性和响应速度至关重要。通过 PowerShell 脚本,你可以定期收集性能数据,并在发现性能瓶颈时进行相应的处理。

自动化收集 IIS 性能计数器

powershellCopy Code
# 设置要监控的性能计数器
$performanceCounters = @(
    "\Web Service(*)\Current Connections",
    "\Web Service(*)\Total Bytes Sent/sec",
    "\Web Service(*)\Total Bytes Received/sec"
)

# 收集性能数据并保存到日志文件
$logFile = "C:\IISPerformanceLogs\$(Get-Date -Format 'yyyyMMddHHmmss').csv"
$performanceCounters | ForEach-Object {
    $counter = Get-Counter -Counter $_ -SampleInterval 5 -MaxSamples 1
    $counter | Export-Csv -Path $logFile -Append -NoTypeInformation
    Write-Host "Logged performance data for counter: $_"
}

这个脚本会定期收集 IIS 的性能计数器数据,包括当前连接数、传输字节数等,并将数据保存到 CSV 文件中。这些数据可以用于后续的性能分析。

自动化性能报警

powershellCopy Code
# 设置性能阈值
$connectionThreshold = 1000
$bytesSentThreshold = 50000

# 获取性能计数器数据
$connections = (Get-Counter -Counter "\Web Service(*)\Current Connections").CounterSamples.CookedValue
$bytesSent = (Get-Counter -Counter "\Web Service(*)\Total Bytes Sent/sec").CounterSamples.CookedValue

# 判断是否超出阈值,触发报警
if ($connections -gt $connectionThreshold) {
    Write-Host "Warning: Current connections exceeded threshold ($connections)"
}
if ($bytesSent -gt $bytesSentThreshold) {
    Write-Host "Warning: Bytes sent per second exceeded threshold ($bytesSent)"
}

此脚本会监控当前连接数和每秒发送字节数是否超出预设的阈值。如果超出阈值,则触发报警,可以在实际生产环境中进一步扩展为电子邮件通知或其他警报机制。


18. 自动化 IIS 日志分析与报告生成

IIS 日志记录了大量关于网站访问、错误和请求的信息。通过 PowerShell,你可以自动化日志分析,生成网站流量报告和异常请求分析。

自动化日志分析(检查 404 错误)

powershellCopy Code
# 设置日志文件目录
$logDirectory = "C:\inetpub\logs\LogFiles"
$logFilePattern = "u_ex*.log"  # 默认日志文件模式

# 获取所有日志文件
$logFiles = Get-ChildItem -Path $logDirectory -Filter $logFilePattern

# 分析日志文件中的 404 错误
foreach ($logFile in $logFiles) {
    $logContent = Get-Content -Path $logFile.FullName
    $error404s = $logContent | Where-Object { $_ -match " 404 " }

    if ($error404s.Count -gt 0) {
        Write-Host "Found 404 errors in $($logFile.Name):"
        $error404s | ForEach-Object { Write-Host $_ }
    }
}

该脚本会扫描 IIS 日志文件,检查其中是否有 404 错误(即资源未找到),并将相关错误信息输出。

生成流量报告

powershellCopy Code
# 生成访问量报告(按 IP 排序)
$logFiles | ForEach-Object {
    $logContent = Get-Content -Path $_.FullName
    $ipAddresses = $logContent | ForEach-Object { ($_ -split " ")[0] }

    # 统计每个 IP 地址的访问次数
    $trafficReport = $ipAddresses | Group-Object | Sort-Object Count -Descending

    # 输出报告
    $trafficReport | ForEach-Object {
        Write-Host "IP: $($_.Name) - Visits: $($_.Count)"
    }
}

此脚本会统计每个 IP 地址的访问次数,并生成按访问量排序的流量报告。

以上技巧进一步扩展了 IIS 自动化管理的范围,从 SSL 证书

的管理到性能监控、日志分析等方面,为网站管理员和运维人员提供了一系列高效的自动化方案。下面我们继续探讨更多的自动化管理任务,进一步提升 IIS 环境的运维效率。


19. 自动化 IIS 网站和应用池健康检查

为了确保网站和应用池的健康状态,我们可以定期执行健康检查,并在出现问题时自动修复。健康检查可以帮助我们提前识别并处理潜在的故障,避免影响用户访问。

自动化网站健康检查

powershellCopy Code
# 设置要检查的网站名称
$siteName = "YourSiteName"

# 获取网站的状态
$siteStatus = (Get-WebSite -Name $siteName).State

# 如果网站未启动,则尝试启动
if ($siteStatus -ne "Started") {
    Write-Host "Website '$siteName' is not running. Attempting to start it..."
    Start-WebSite -Name $siteName
    Write-Host "Website '$siteName' has been started."
} else {
    Write-Host "Website '$siteName' is already running."
}

此脚本会检查指定网站的状态。如果网站未启动,则自动启动网站。你可以根据需要定期运行此脚本,确保网站始终处于运行状态。

自动化应用池健康检查

powershellCopy Code
# 设置要检查的应用池名称
$appPoolName = "YourAppPoolName"

# 获取应用池的状态
$appPoolStatus = (Get-WebAppPool -Name $appPoolName).State

# 如果应用池未启动,则尝试启动
if ($appPoolStatus -ne "Started") {
    Write-Host "Application Pool '$appPoolName' is not running. Attempting to start it..."
    Start-WebAppPool -Name $appPoolName
    Write-Host "Application Pool '$appPoolName' has been started."
} else {
    Write-Host "Application Pool '$appPoolName' is already running."
}

这个脚本会检查指定应用池的状态,如果应用池未启动,它将尝试启动该应用池。你可以定期使用此脚本来监控应用池的健康状态。


20. 自动化 IIS 安全性检查和修复

IIS 安全性是确保服务器不受攻击的关键。通过 PowerShell,你可以检查 IIS 配置中的一些常见安全问题,并自动修复它们。

检查并禁用不安全的 HTTP 方法(如 TRACE)

powershellCopy Code
# 获取所有站点的绑定信息
$bindings = Get-WebBinding

# 检查是否启用了 TRACE 方法
$traceMethodEnabled = Get-WebConfigurationProperty -Filter "/system.webServer/httpProtocol/customHeaders" -PSPath "IIS:\" | Where-Object { $_.name -eq "TRACE" }

if ($traceMethodEnabled) {
    Write-Host "TRACE method is enabled. Disabling it..."
    Set-WebConfigurationProperty -Filter "/system.webServer/httpProtocol/customHeaders" -PSPath "IIS:\" -Name "TRACE" -Value ""
    Write-Host "TRACE method has been disabled."
} else {
    Write-Host "TRACE method is already disabled."
}

此脚本检查是否启用了 TRACE HTTP 方法(这会使服务器容易受到攻击),并禁用它。TRACE 方法可能被用来泄露服务器信息,因此应当始终禁用。

强制设置 SSL/TLS 协议

powershellCopy Code
# 强制启用 TLS 1.2,并禁用低版本的协议(如 SSL 3.0 和 TLS 1.0)
$registryPath = "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols"
$enabledProtocols = @("TLS 1.2")

# 禁用 SSL 3.0 和 TLS 1.0
$disabledProtocols = @("SSL 3.0", "TLS 1.0", "TLS 1.1")

foreach ($protocol in $disabledProtocols) {
    $keyPath = "$registryPath\$protocol\Server"
    if (Test-Path -Path $keyPath) {
        Set-ItemProperty -Path $keyPath -Name "Enabled" -Value 0
        Write-Host "$protocol has been disabled."
    }
}

# 启用 TLS 1.2
$enabledProtocols | ForEach-Object {
    $keyPath = "$registryPath\$_\Server"
    if (-not (Test-Path -Path $keyPath)) {
        New-Item -Path $keyPath -Force
    }
    Set-ItemProperty -Path $keyPath -Name "Enabled" -Value 1
    Write-Host "$_ has been enabled."
}

该脚本通过修改注册表强制启用 TLS 1.2 协议,并禁用不安全的 SSL 3.0、TLS 1.0 和 TLS 1.1 协议。启用更高版本的协议能够有效提高网站的安全性,避免受到中间人攻击。


21. 自动化 IIS 日志清理

IIS 日志文件通常会随着时间的推移而迅速增大,特别是在流量较大的网站上。为了节省磁盘空间,并保持日志管理的有效性,你可以定期清理旧的日志文件。

自动化 IIS 日志文件清理

powershellCopy Code
# 设置日志文件目录和保留的天数
$logDirectory = "C:\inetpub\logs\LogFiles"
$retentionDays = 30

# 获取所有日志文件并筛选出超过保留天数的文件
$logFiles = Get-ChildItem -Path $logDirectory -Recurse | Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-$retentionDays) }

# 删除旧的日志文件
foreach ($logFile in $logFiles) {
    Remove-Item -Path $logFile.FullName -Force
    Write-Host "Deleted old log file: $($logFile.FullName)"
}

该脚本会删除指定日志目录下,超过保留天数(例如 30 天)的日志文件。你可以根据需求调整保留天数,从而实现对日志文件的有效管理。


22. 自动化 IIS 网站的扩展名限制和 MIME 类型配置

为了提高网站的安全性,你可能需要限制某些扩展名的访问,或配置特定的 MIME 类型来避免文件类型被错误处理。以下是如何通过 PowerShell 自动化这些配置。

配置允许的扩展名

powershellCopy Code
# 设置允许的扩展名列表
$allowedExtensions = @(".aspx", ".html", ".css", ".js")

# 获取当前所有配置的 MIME 类型
$mimeTypes = Get-WebConfigurationProperty -Filter "/system.webServer/staticContent/mimeMap" -PSPath "IIS:\"

# 保留允许的 MIME 类型,移除不在允许列表中的类型
foreach ($mimeType in $mimeTypes) {
    $extension = $mimeType.Extension
    if ($allowedExtensions -notcontains $extension) {
        Write-Host "Removing unsupported MIME type for extension: $extension"
        Remove-WebConfigurationProperty -Filter "/system.webServer/staticContent/mimeMap[@extension='$extension']" -PSPath "IIS:\"
    }
}

此脚本将遍历 IIS 中的所有 MIME 类型,并删除不在允许的扩展名列表中的条目,从而确保只有安全的文件类型可以被访问。

设置文件上传大小限制

powershellCopy Code
# 设置最大上传文件大小(例如,限制为 50MB)
$maxFileSize = 50MB

# 设置上传限制
Set-WebConfigurationProperty -Filter "/system.webServer/security/requestFiltering/requestLimits" -PSPath "IIS:\" -Name "maxAllowedContentLength" -Value $maxFileSize

Write-Host "File upload size limit set to $maxFileSize"

这个脚本将限制上传文件的最大大小,防止大文件上传导致服务器性能下降或磁盘空间耗尽。


23. 自动化 IIS 网站的备份和恢复

备份是保障数据安全的关键,尤其是在进行网站迁移或更新时。你可以使用 PowerShell 自动化 IIS 网站的备份和恢复过程。

自动化 IIS 网站备份

powershellCopy Code
# 设置备份目录和文件名
$backupDirectory = "C:\IISBackup"
$backupFileName = "IISSiteBackup_$(Get-Date -Format 'yyyyMMddHHmmss').zip"

# 备份网站文件
$siteDirectory = "C:\inetpub\wwwroot\YourSite"
Compress-Archive -Path $siteDirectory -DestinationPath "$backupDirectory\$backupFileName"

Write-Host "Website backup saved to $backupDirectory\$backupFileName"

该脚本会将指定网站的文件目录压缩成一个 ZIP 文件进行备份。你可以将其与前面的配置备份脚本结合使用,确保网站的文件和配置都得到备份。

自动化 IIS 网站恢复

powershellCopy Code
# 设置恢复目录和备份文件路径
$backupFilePath = "C:\IISBackup\IISSiteBackup_20231201000000.zip"
$restoreDirectory = "C:\inetpub\wwwroot\YourSite"

# 解压备份文件到目标目录
Expand-Archive -Path $backupFilePath -DestinationPath $restoreDirectory

Write
Write-Host "Website has been successfully restored from backup."

这个脚本将从备份文件恢复网站的文件。你可以在需要恢复时使用此脚本,通过指定正确的备份路径和恢复目标目录来完成操作。


24. 自动化 IIS 网站访问权限管理

为了确保只有授权的用户可以访问某些敏感页面或文件,你可以使用 PowerShell 脚本来自动化 IIS 网站的访问权限管理。例如,限制访问某些目录,或设置基本的身份验证。

自动化设置基本身份验证

powershellCopy Code
# 设置站点的名称和身份验证类型
$siteName = "YourSiteName"

# 启用基本身份验证
Set-WebConfigurationProperty -Filter "/system.webServer/security/authentication/basicAuthentication" -PSPath "IIS:\Sites\$siteName" -Name "enabled" -Value $true

Write-Host "Basic authentication has been enabled for site '$siteName'."

此脚本会为指定的网站启用基本身份验证。基本身份验证要求用户在访问网站时提供用户名和密码。你可以结合其他身份验证方法来提高安全性。

自动化禁用匿名身份验证

powershellCopy Code
# 禁用站点的匿名身份验证
Set-WebConfigurationProperty -Filter "/system.webServer/security/authentication/anonymousAuthentication" -PSPath "IIS:\Sites\$siteName" -Name "enabled" -Value $false

Write-Host "Anonymous authentication has been disabled for site '$siteName'."

这个脚本禁用匿名身份验证,只有经过身份验证的用户才能访问网站。你可以与基本身份验证一起使用来进一步保护站点。


25. 自动化 IIS 网站的压缩设置

启用动态内容压缩和静态内容压缩可以大幅度减少网站的带宽消耗,提高访问速度。你可以使用 PowerShell 脚本来自动化 IIS 网站的压缩设置。

启用静态内容压缩

powershellCopy Code
# 启用静态内容压缩
Set-WebConfigurationProperty -Filter "/system.webServer/httpCompression" -PSPath "IIS:\Sites\$siteName" -Name "enabled" -Value $true

Write-Host "Static content compression has been enabled for site '$siteName'."

该脚本启用静态内容压缩,可以显著减少静态文件(如 HTML、CSS 和 JavaScript 文件)的传输大小,提高网站加载速度。

启用动态内容压缩

powershellCopy Code
# 启用动态内容压缩
Set-WebConfigurationProperty -Filter "/system.webServer/httpCompression/dynamicCompression" -PSPath "IIS:\Sites\$siteName" -Name "enabled" -Value $true

Write-Host "Dynamic content compression has been enabled for site '$siteName'."

这个脚本启用动态内容压缩。对于动态生成的内容(如 ASP.NET 页面的响应),压缩可以有效减少传输数据量。


26. 自动化 IIS 网站的带宽限制

在某些情况下,你可能希望对网站的带宽使用进行限制,以防止过度消耗服务器的网络资源。你可以使用 PowerShell 来设置带宽限制。

设置带宽限制

powershellCopy Code
# 设置带宽限制(例如,最大带宽为 1MB/s)
$bandwidthLimit = 1MB

Set-WebConfigurationProperty -Filter "/system.webServer/limits" -PSPath "IIS:\Sites\$siteName" -Name "maxBandwidth" -Value $bandwidthLimit

Write-Host "Bandwidth limit of $bandwidthLimit has been set for site '$siteName'."

此脚本为指定网站设置了带宽限制,确保网站在高流量时不会超负荷。可以根据实际需要调整带宽大小。


27. 自动化 IIS SSL 证书绑定

为网站配置 SSL 证书是提升安全性的一个重要步骤。你可以使用 PowerShell 脚本自动绑定 SSL 证书。

自动化 SSL 证书绑定

powershellCopy Code
# 设置网站名称和证书信息
$siteName = "YourSiteName"
$certificateThumbprint = "YOUR_CERTIFICATE_THUMBPRINT"  # 证书的指纹

# 获取证书对象
$certificate = Get-Item "Cert:\LocalMachine\My\$certificateThumbprint"

# 获取网站绑定配置
$binding = Get-WebBinding -Name $siteName | Where-Object { $_.protocol -eq "https" }

# 如果该站点尚未绑定 SSL 证书,则执行绑定
if (-not $binding) {
    New-WebBinding -Name $siteName -BindingInformation "*:443:" -Protocol "https"
    $binding = Get-WebBinding -Name $siteName | Where-Object { $_.protocol -eq "https" }
}

# 将证书绑定到 HTTPS 端口
$binding.AddSslCertificate($certificate)

Write-Host "SSL certificate has been bound to site '$siteName'."

此脚本会将指定的 SSL 证书绑定到指定的网站。如果网站尚未配置 HTTPS 绑定,它会首先创建一个新的 HTTPS 绑定,然后将证书应用于该绑定。


28. 自动化 IIS 网站的 IP 限制

IP 限制可以用于限制或允许来自特定 IP 地址或 IP 范围的访问。在某些情况下,禁止或限制恶意 IP 地址的访问是提高网站安全性的一种有效方法。

设置允许的 IP 地址

powershellCopy Code
# 设置允许的 IP 地址
$allowedIP = "192.168.1.1"

# 获取站点的访问控制列表
$acl = Get-WebConfiguration -Filter "/system.webServer/security/ipSecurity" -PSPath "IIS:\Sites\$siteName"

# 添加允许的 IP 地址
Add-WebConfigurationProperty -Filter "/system.webServer/security/ipSecurity" -PSPath "IIS:\Sites\$siteName" -Name "." -Value @{ipAddress=$allowedIP;allowed="true"}

Write-Host "IP address $allowedIP has been added to the allowed list for site '$siteName'."

这个脚本会将指定的 IP 地址添加到网站的访问控制列表中,只允许该 IP 地址访问该网站。

设置禁止的 IP 地址

powershellCopy Code
# 设置禁止的 IP 地址
$blockedIP = "203.0.113.5"

# 获取站点的访问控制列表
$acl = Get-WebConfiguration -Filter "/system.webServer/security/ipSecurity" -PSPath "IIS:\Sites\$siteName"

# 添加禁止的 IP 地址
Add-WebConfigurationProperty -Filter "/system.webServer/security/ipSecurity" -PSPath "IIS:\Sites\$siteName" -Name "." -Value @{ipAddress=$blockedIP;allowed="false"}

Write-Host "IP address $blockedIP has been blocked for site '$siteName'."

此脚本将某个 IP 地址添加到禁止访问列表中,阻止该 IP 地址访问网站。你可以根据需要调整或扩展 IP 限制策略。


29. 自动化 IIS 网站的日志轮换

网站日志会随着时间的推移变得非常庞大,定期的日志轮换可以帮助管理磁盘空间。你可以设置日志轮换来自动保存每日、每周或每月的日志文件。

设置日志轮换

powershellCopy Code
# 设置日志文件的最大大小和保留天数
$maxLogSize = 50MB
$retentionDays = 30

# 获取日志配置并设置最大大小
Set-WebConfigurationProperty -Filter "/system.applicationHost/sites/siteDefaults/logFile" -PSPath "IIS:\" -Name "maxLogFileSize" -Value $maxLogSize
Set-WebConfigurationProperty -Filter "/system.applicationHost/sites/siteDefaults/logFile" -PSPath "IIS:\" -Name "logFormat" -Value "W3C"

Write-Host "Log rotation settings have been updated."

此脚本设置了最大日志文件大小为 50MB,超过该大小时日志文件会被轮换,并保持最近的 30 天日志。


 

通过这些 PowerShell 脚本,你可以自动化许多 IIS 网站管理任务,从网站的健康检查、SSL 证书管理、日志清理、带宽限制、到安全配置和访问控制等方面。自动化这些任务不仅可以提高运维效率,还可以增强服务器的稳定性和安全性。根据你的实际需求,你可以定制并扩展这些脚本,实现更精细化的管理。


探讨如何进一步优化和自动化 IIS 网站管理。下面的脚本涉及到更多的管理任务,包括自动备份 IIS 配置、自动清理日志、自动更新 IIS 站点的 DNS 配置等。


30. 自动备份 IIS 配置

定期备份 IIS 配置文件可以确保在出现故障时,能够快速恢复站点的配置。PowerShell 可以帮助自动化这一任务。

自动备份 IIS 配置

powershellCopy Code
# 设置备份文件的保存路径
$backupPath = "C:\IIS_Backups\"
$backupFileName = "IIS_Config_Backup_" + (Get-Date -Format "yyyyMMdd_HHmmss") + ".zip"
$backupFilePath = Join-Path -Path $backupPath -ChildPath $backupFileName

# 创建备份目录(如果不存在)
if (-not (Test-Path -Path $backupPath)) {
    New-Item -Path $backupPath -ItemType Directory
}

# 执行 IIS 配置备份
$backupCmd = "iisreset /stop"
Invoke-Expression $backupCmd

# 备份 IIS 配置文件
Export-IISConfiguration -Path $backupFilePath

# 启动 IIS 服务
$startCmd = "iisreset /start"
Invoke-Expression $startCmd

Write-Host "IIS configuration has been backed up to $backupFilePath."

该脚本将 IIS 配置文件导出到指定的备份文件夹,并将文件名包含当前时间戳。备份是通过停止 IIS 服务,执行备份操作后再重新启动 IIS 服务完成的。你可以将此脚本设置为定期任务,确保定期备份。


31. 自动清理 IIS 日志文件

长时间运行的 IIS 网站会产生大量的日志文件。定期清理旧的日志文件可以节省磁盘空间并避免日志文件占用过多存储。以下是一个自动清理日志的脚本,它会删除指定日期前的日志文件。

自动清理 IIS 日志

powershellCopy Code
# 设置日志目录路径
$logPath = "C:\inetpub\logs\LogFiles\"

# 设置日志文件保留的天数
$retentionDays = 30

# 获取当前日期
$currentDate = Get-Date

# 获取所有日志文件
$logFiles = Get-ChildItem -Path $logPath -Recurse -Filter "*.log"

# 删除超过保留天数的日志文件
foreach ($logFile in $logFiles) {
    $fileCreationDate = $logFile.CreationTime
    $age = $currentDate - $fileCreationDate

    if ($age.Days -ge $retentionDays) {
        Remove-Item -Path $logFile.FullName
        Write-Host "Deleted log file: $($logFile.FullName)"
    }
}

Write-Host "Log files older than $retentionDays days have been deleted."

该脚本会删除超过指定天数(例如30天)的日志文件。你可以根据需要修改 $retentionDays 的值来决定保留多长时间的日志文件。


32. 自动更新 IIS 网站的 DNS 配置

如果你更改了 IIS 站点的 IP 地址或其他配置信息,可能需要更新网站的 DNS 配置。通过 PowerShell,你可以自动更新 DNS 记录。

更新 DNS 记录

powershellCopy Code
# 设置 DNS 域名和新 IP 地址
$dnsServer = "your.dns.server"    # DNS 服务器的 IP 地址或主机名
$zoneName = "yourdomain.com"       # 域名区域
$hostName = "www"                  # 主机名
$newIpAddress = "192.168.1.100"    # 新的 IP 地址

# 获取现有的 DNS 记录
$dnsRecord = Get-DnsServerResourceRecord -ZoneName $zoneName -Name $hostName -ComputerName $dnsServer

# 删除旧的 A 记录
Remove-DnsServerResourceRecord -ZoneName $zoneName -Name $hostName -RRType "A" -Record $dnsRecord -ComputerName $dnsServer

# 添加新的 A 记录
Add-DnsServerResourceRecordA -ZoneName $zoneName -Name $hostName -IPv4Address $newIpAddress -ComputerName $dnsServer

Write-Host "DNS record for $hostName.$zoneName has been updated to $newIpAddress."

此脚本会自动查找并删除旧的 DNS 记录,然后创建新的 A 记录来指向新的 IP 地址。你需要指定 DNS 服务器的地址和相关的域名信息。注意,此脚本需要在有权限访问 DNS 服务器的环境中运行。


33. 自动检查 IIS 网站的 SSL 证书有效性

SSL 证书有有效期,过期后可能导致网站无法安全访问。自动检查证书的有效性并提醒管理员更新证书是提高网站安全性的一个重要步骤。

自动检查 SSL 证书有效性

powershellCopy Code
# 设置网站名称和证书信息
$siteName = "YourSiteName"
$sslPort = 443

# 获取网站绑定的证书
$bindings = Get-WebBinding -Name $siteName | Where-Object { $_.protocol -eq "https" }
$binding = $bindings | Where-Object { $_.bindingInformation -like "*:$sslPort:*" }

# 获取证书指纹
$certificateThumbprint = $binding.certificateHash

# 获取证书对象
$certificate = Get-Item "Cert:\LocalMachine\My\$certificateThumbprint"

# 检查证书的过期时间
$expiryDate = $certificate.NotAfter
$currentDate = Get-Date

# 提醒管理员证书即将过期
if ($expiryDate -lt $currentDate.AddDays(30)) {
    Write-Host "Warning: SSL certificate for $siteName is expiring on $expiryDate. Please renew it."
} else {
    Write-Host "SSL certificate for $siteName is valid until $expiryDate."
}

该脚本会检查 IIS 网站绑定的 SSL 证书的有效期,并在证书过期前30天提醒管理员进行更新。如果证书即将过期,它会发出警告。


34. 自动化 IIS 网站的健康检查和重启

自动化网站的健康检查可以帮助及时发现网站问题,并在必要时自动重启 IIS 站点。以下是一个简单的健康检查脚本,它会检查网站的响应,如果网站不可用,则重启站点。

自动化健康检查和重启 IIS 网站

powershellCopy Code
# 设置站点的名称和健康检查的 URL
$siteName = "YourSiteName"
$checkUrl = "http://localhost/healthcheck"  # 假设网站有一个健康检查的页面

# 执行 HTTP 请求进行健康检查
try {
    $response = Invoke-WebRequest -Uri $checkUrl -Method Get -TimeoutSec 10
    if ($response.StatusCode -ne 200) {
        throw "Website returned non-200 status code: $($response.StatusCode)"
    }

    Write-Host "Website $siteName is healthy."
} catch {
    Write-Host "Website $siteName is not responding. Attempting to restart..."
    
    # 重启 IIS 网站
    Restart-WebAppPool -Name $siteName
    Write-Host "Website $siteName has been restarted."
}

该脚本会发送一个 HTTP 请求到指定的健康检查 URL。如果请求失败或返回的状态码不是200,它会自动重启 IIS 网站。你可以通过设置定时任务来定期运行这个脚本,从而自动检测并恢复网站的健康状态。


35. 自动化 IIS 网站的防火墙规则配置

通过配置防火墙规则,可以增强服务器的安全性,限制不必要的访问。PowerShell 可以帮助自动化防火墙规则的添加和删除。

添加防火墙规则

powershellCopy Code
# 设置允许的 IP 地址和端口
$allowedIP = "192.168.1.100"
$port = 80

# 添加防火墙规则,允许指定 IP 地址访问指定端口
New-NetFirewallRule -DisplayName "Allow $allowedIP on port $port" -Direction Inbound -Protocol TCP -LocalPort $port -RemoteAddress $allowedIP -Action Allow

Write-Host "Firewall rule has been added to allow $allowedIP access on port $port."

该脚本会向 Windows 防火墙添加规则,允许指定的 IP 地址访问指定的端口。你可以使用类似的脚本来设置其他类型的访问控制规则,限制不安全的连接。


 

通过这些脚本,你可以进一步提高 IIS 网站的管理效率和安全性。自动备份、日志清理、证书管理、健康检查、DNS 更新等操作都可以通过 PowerShell 自动化完成,减少人工操作的风险,提高网站的可靠性和稳定性。你可以根据具体需求,定制这些脚本,并设置定时任务以便自动执行。


 

posted @ 2024-12-01 23:39  suv789  阅读(53)  评论(0编辑  收藏  举报