PowerShell 技能连载 - 性能优化与内存管理

适用于 PowerShell 5.1 及以上版本

PowerShell 的便利性往往以性能为代价——管道对象传递、灵活的类型转换、丰富的 .NET 集成,这些特性在处理小规模数据时非常方便,但面对大量数据(数万行 CSV、上千个文件、数百台服务器)时,性能瓶颈会非常明显。理解 PowerShell 的性能特征并掌握优化技巧,可以将脚本执行时间从数小时缩短到数秒。

本文将讲解常见的性能陷阱、优化技巧、内存管理策略,以及如何度量和对比脚本性能。

阅读更多

PowerShell 技能连载 - 定时任务与计划任务

适用于 PowerShell 5.1 及以上版本(Windows)

自动化运维的核心是定时执行——每天凌晨备份数据库、每周清理临时文件、每小时检查服务状态、每月生成报表。Windows 计划任务(Task Scheduler)是实现定时执行的基础设施,而 PowerShell 的 ScheduledTasks 模块提供了完整的计划任务管理能力,可以替代传统的 GUI 操作和 schtasks.exe 命令行工具。

本文将讲解计划任务的创建、管理、高级触发器配置,以及常见的自动化任务模板。

阅读更多

PowerShell 技能连载 - 文件与注册表 ACL 管理

适用于 PowerShell 5.1 及以上版本(Windows)

Windows 的权限管理核心是访问控制列表(ACL,Access Control List)。无论是文件共享、网站目录还是注册表键,权限配置错误都可能导致数据泄露或服务中断。传统的 GUI 方式(右键→属性→安全)效率低下且容易遗漏,而 PowerShell 提供了完整的 ACL 管理能力,可以实现精确、可重复、可审计的权限配置。

本文将系统讲解 NTFS 文件权限和注册表权限的查看、修改、备份和批量管理。

阅读更多

PowerShell 技能连载 - 事件日志与系统监控

适用于 PowerShell 5.1 及以上版本(Windows)

Windows 事件日志是故障排查的”黑匣子”——系统崩溃、应用异常、安全审计、服务启停,几乎所有重要事件都会被记录到事件日志中。对于运维人员来说,能够高效地查询、筛选和分析事件日志是一项必备技能。PowerShell 提供了 Get-WinEvent 命令,其过滤能力远超传统的事件查看器 GUI。

本文将讲解事件日志的查询技巧、自动化监控脚本、性能计数器采集,以及如何构建系统健康检查工具。

阅读更多

PowerShell 技能连载 - WMI 与 CIM 查询

适用于 PowerShell 5.1 及以上版本(Windows)

Windows Management Instrumentation(WMI)是 Windows 操作系统内置的管理信息基础设施,它以统一的接口暴露了硬件、操作系统、应用程序的海量信息——从 CPU 温度到磁盘健康状态,从进程列表到安装的补丁,几乎所有系统信息都可以通过 WMI 获取。PowerShell 通过 CIM(Common Information Model)cmdlet 提供了对 WMI 的现代化访问方式。

本文将系统讲解 WMI/CIM 的核心概念、查询语法、常用场景,以及如何构建高效的信息采集脚本。

阅读更多

PowerShell PSProvider深度解析

内存驱动器实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
$provider = New-Object Management.Automation.ProviderInfo(
@([Management.Automation.Provider.CmdletProvider]),
"MemoryProvider",
[Microsoft.PowerShell.Commands.FileSystemProvider],
"",
"",
$null
)

$ctx = New-Object Management.Automation.ProviderContext($provider)
$drive = New-Object Management.Automation.PSDriveInfo(
"mem",
$provider,
"",
"内存驱动器",
$null
)

# 创建虚拟文件
New-Item -Path 'mem:\config.json' -ItemType File -Value @"
{
"settings": {
"cacheSize": 1024
}
}
"@

项操作重载技术

1
2
3
4
5
6
7
8
9
10
class CustomProvider : NavigationCmdletProvider {
[void] NewItem(string path, string type, object content) {
base.NewItem(path, "Directory", "特殊项")
[MemoryStore]::Add(path, content)
}

[object] GetItem(string path) {
return [MemoryStore]::Get(path)
}
}

应用场景

  1. 配置中心虚拟文件系统
  2. 加密存储透明访问层
  3. 跨平台路径统一抽象
  4. 内存数据库交互界面

开发注意事项

  • 实现必要生命周期方法
  • 处理并发访问锁机制
  • 维护项状态元数据
  • 支持管道流式操作

PowerShell注册表高级操作技术

动态注册表项管理

1
2
3
4
5
# 创建带事务的注册表项
Start-Transaction -Name RegEdit
New-Item -Path HKLM:\Software\CustomConfig -Force
Set-ItemProperty -Path HKLM:\Software\CustomConfig -Name Version -Value '1.0'
Complete-Transaction -Name RegEdit

ACL权限控制

1
2
3
4
5
6
7
8
9
10
11
# 设置注册表项安全描述符
$acl = Get-Acl HKLM:\Software\SecureData
$rule = New-Object System.Security.AccessControl.RegistryAccessRule(
'Users',
'ReadKey',
'ContainerInherit',
'None',
'Allow'
)
$acl.AddAccessRule($rule)
Set-Acl -Path HKLM:\Software\SecureData -AclObject $acl

注册表提供者扩展

1
2
3
4
5
6
class RegistryWatcher : RegistryProvider {
[void] SetItem(string path, object value) {
[AuditLog]::RecordChange($path, $value)
base.SetItem($path, $value)
}
}

典型应用场景

  1. 集中式配置管理
  2. 权限审计追踪
  3. 批量注册表修改回滚
  4. 自动化部署配置

注意事项

  • 严格限制HKLM修改权限
  • 事务操作需Windows 8+支持
  • 定期备份关键注册表项
  • 启用注册表虚拟化保护

XAMPP 学习路线

XAMPP = Apache + MySQL + PHP + Perl

XAMPP是最流行的PHP开发环境

XAMPP是完全免费且易于安装的Apache发行版,其中包含MySQL、PHP和Perl。XAMPP开放源码包的设置让安装和使用出奇容易。

网站

XAMPP 官方网站
XAMPP - SourceForge

文件区别

  • 安装版(适合小型服务器安装)
    • xampp-win32-*-installer.exe - 有安装向导。
    • xampp-win32-*.zip - 解开是一个 xampp 目录,但可以随后注册服务等。
    • xampp-win32-*.7z - 和 .zip 版相同,压缩后体积更小。
  • 便携版(适合开发测试。不包含 FileZilla FTP 和 Mercury Mail Server,不能安装服务)
    • xampp-portable-win32-*-installer.exe
    • xampp-portable-win32-*.zip
    • xampp-portable-win32-*.7z

快速起步

**切勿自己摸索!**因为不同的版本的步骤有所不同。请阅读 xampp\readme_en.txt 中的 QUICK INSTALLATION 节。篇幅很短,不用担心 :)

潜在陷阱

  • 必须安装(或解压到)根目录下。例如 D:\xampp,或者 E:\xampp。
  • 注意缺省的 80 和 443 端口未被其它程序占用。netstat -ano |find "80"netstat -ano |find "443"
  • 如果用安装版的压缩包(.zip 或 .7z),并需要安装服务,请用提升权限的管理员账户打开 xampp-control.exe 进行安装。
  • 如果要能让别的机器或外网访问,请注意配置防火墙。
  • 通过 xampp-control.exe 启动,可能看不到完整的错误提示。请在命令行下启动 xampp_start.exe,可以看到更详细的错误提示。
  • 如果遇到错误,可以根据 xampp-control.exe 面板上的各个 Logs 按钮找到相应的日志。另外,可以通过 Windows 的事件查看部分日志。

用 XAMPP 搭建反向代理服务器

公网 IP 地址 + 80 端口是稀缺资源。在开发、测试阶段,我们常常需要在一个公网 IP 的 80 端口上,绑定多个 WEB 服务,这些服务可能部署在内网的多台异构服务器上(不同操作系统、不同服务器软件)。

用表格来表达就是:

外网访问 重定向到
http://home.test.com http://127.0.0.1:81
http://img.test.com http://127.0.0.1:82
http://js.test.com http://127.0.0.1:83

在 Linux 下,可以通过 vhost 程序来实现这个需求。在 Windows 下,我们有 XAMPP 和 IIS 两种选择。本文重点介绍 XAMPP 的实现方式。

分别搭建 3 个测试服务器

可以采用这些小工具快速创建测试服务器:

设置 hosts 以便测试

首先要让 3 个域名都指向本机。我们可以直接修改本地 hosts 文件以便测试。这种方式立刻生效,免去申请域名的麻烦。

用提升权限的记事本打开 %windir%\system32\drivers\etc\hosts 文件,加入这段:

127.0.0.1 home.test.com
127.0.0.1 img.test.com
127.0.0.1 js.test.com

这里有个快捷的方法,参见:PowerShell 技能连载 - 编辑“hosts”文件

搭建 XAMPP 环境

请参见 XAMPP 学习路线。只需要其中的 Apache 模块即可。确保 XAMPP 能够正常启动,并能够通过 http://127.0.0.1 访问缺省页面。

设置 XAMPP

编辑 xampp\apache\conf\httpd.conf,将 LoadModule proxy_http_module modules/mod_proxy_http.so 前的 # 号去掉。

编辑 xampp\apache\conf\extra\httpd-vhosts.conf,在尾部添加:

ProxyRequests Off

<Proxy *>
    Order deny,allow
    Allow from all
</Proxy>

<VirtualHost *:80>
    ServerName blog.test.com
    ProxyPass / http://127.0.0.1:81/
    ProxyPassReverse / http://127.0.0.1:81/
</VirtualHost>

<VirtualHost *:80>
    ServerName img.test.com
    ProxyPass / http://127.0.0.1:82/
    ProxyPassReverse / http://127.0.0.1:82/
</VirtualHost>

<VirtualHost *:80>
    ServerName js.test.com
    ProxyPass / http://127.0.0.1:83/
    ProxyPassReverse / http://127.0.0.1:83/
</VirtualHost>

重启 XAMPP 中的 Apache 组件

姊妹篇 - 用 IIS 搭建反向代理服务器

用 IIS 也可以实现相同的功能。

注意有个坑:

%windir%\System32\inetsrv\iis.msc 或通过“这台电脑 - 右键 - 计算机管理” 启动 IIS 管理器,可能看不到 ARR 组件而通过 %windir%\system32\inetsrv\InetMgr.exe 则可以看到。

鸣谢

PowerShell 技术 QQ 群