PowerShell 技能连载 - 凭据自动轮换

适用于 PowerShell 5.1 及以上版本

在信息安全领域,凭据管理是最基础也最重要的环节之一。无论是服务账户密码、API 密钥还是数据库连接字符串,长期不变的秘密都是潜在的安全隐患。越来越多的安全合规标准(如 PCI DSS、SOC 2)要求定期轮换密码,人工操作不仅容易遗漏,还可能在交接过程中引入风险。

自动化凭据轮换可以确保密码按策略定期更换,并将新密码安全地同步到所有需要的地方。PowerShell 结合 Windows 凭据管理 API 和 Azure Key Vault 等服务,能够构建端到端的凭据轮换工作流。本文将介绍如何用 PowerShell 实现凭据的安全存储、自动生成和轮换管理。

阅读更多

PowerShell 技能连载 - 安全编码实践

适用于 PowerShell 5.1 及以上版本

安全编码不是可选项,而是生产环境的基本要求。PowerShell 脚本经常处理凭据、连接字符串、API 密钥等敏感信息,如果处理不当,这些信息可能泄露到日志文件、版本控制系统、甚至被恶意代码利用。从凭据管理、输入验证、代码签名,到审计日志和合规检查,PowerShell 提供了完整的安全工具链。

本文将讲解 PowerShell 安全编码的核心实践,帮助构建安全可靠的自动化脚本。

阅读更多

PowerShell 技能连载 - 凭据管理与安全存储

适用于 PowerShell 5.1 及以上版本,SecretManagement 模块需要 PowerShell 7

脚本中的硬编码密码是安全隐患的头号来源。无论是数据库连接字符串中的密码、API 密钥还是 SSH 私钥,都应该使用安全的存储机制。PowerShell 提供了多层凭据管理方案——从基本的 PSCredential 对象到 SecureString,再到现代化的 SecretManagement 模块,可以满足从单机脚本到企业级自动化的所有需求。

本文将讲解凭据的安全创建、存储、使用,以及 Microsoft.PowerShell.SecretManagement 模块的使用。

阅读更多

PowerShell 技能连载 - Active Directory 管理

适用于 Windows Server 2012 R2 及以上版本,需安装 ActiveDirectory 模块

Active Directory(AD)是企业 IT 基础设施的核心——用户、计算机、组策略、DNS 都围绕 AD 展开。传统上管理员依赖 Active Directory Users and Computers(ADUC)图形界面操作,但面对成百上千的用户账户和组管理需求时,GUI 操作效率极低。PowerShell 的 ActiveDirectory 模块提供了完整的 AD 管理能力,可以实现批量创建、查询、修改和审计。

本文将讲解 AD 用户管理、组管理、计算机管理和常见自动化场景。

阅读更多

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

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

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

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

阅读更多

PowerShell 技能连载 - 物联网设备状态监控实战

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
function Start-EdgeDeviceMonitor {
[CmdletBinding()]
param(
[Parameter(Mandatory=$true)]
[string]$BrokerUrl,

[Parameter(Mandatory=$true)]
[string[]]$DeviceTopics
)

Add-Type -Path "MQTTnet.dll"
$factory = [MQTTnet.MqttFactory]::new()
$client = $factory.CreateMqttClient()

$report = [PSCustomObject]@{
Timestamp = Get-Date -Format 'yyyy-MM-dd HH:mm:ss'
ConnectedDevices = @()
HealthStatus = @()
}

$clientOptions = [MQTTnet.Client.MqttClientOptionsBuilder]::new()
.WithTcpServer($BrokerUrl)
.Build()

$client.ConnectAsync($clientOptions).Wait()

$DeviceTopics | ForEach-Object {
$client.SubscribeAsync([MQTTnet.MqttTopicFilterBuilder]::new()
.WithTopic($_)
.Build()).Wait()

$client.ApplicationMessageReceivedHandler = [MQTTnet.MqttApplicationMessageReceivedHandler]{
param($e)
$payload = [System.Text.Encoding]::UTF8.GetString($e.ApplicationMessage.Payload)

$report.ConnectedDevices += [PSCustomObject]@{
DeviceID = $e.ApplicationMessage.Topic.Split('/')[-1]
LastSeen = Get-Date
Telemetry = $payload | ConvertFrom-Json
}

if ($payload -match '"status":"error"') {
$report.HealthStatus += [PSCustomObject]@{
DeviceID = $e.ApplicationMessage.Topic.Split('/')[-1]
ErrorCode = ($payload | ConvertFrom-Json).errorCode
Recommendation = "检查设备固件版本并重启服务"
}
}
}
}

Register-ObjectEvent -InputObject $client -EventName ApplicationMessageReceived -Action {
$global:report = $eventArgs | ForEach-Object { $_.UserEventArgs }
}

$report | Export-Csv -Path "$env:TEMP/EdgeDeviceReport_$(Get-Date -Format yyyyMMdd).csv"
return $report
}

核心功能

  1. MQTT协议设备状态实时订阅
  2. 边缘计算设备健康状态分析
  3. 异常事件自动化预警
  4. CSV报告持续输出

典型应用场景

  • 智能制造产线监控
  • 智慧城市基础设施管理
  • 农业物联网传感器网络
  • 能源设备远程诊断

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+支持
  • 定期备份关键注册表项
  • 启用注册表虚拟化保护

用 PowerShell 屏蔽腾讯 QQ 秀

我们在 用 PowerShell 屏蔽腾讯 QQ 的广告 这篇文章中介绍过了如何屏蔽 QQ 聊天窗口的横幅广告,那么如何屏蔽 QQ 秀的广告呢?请参见 QQ2013 删除QQ秀广告

但是其中的步骤有点繁琐。我们把整个流程用 PowerShell 写一遍,对于用户只要执行一下即可:

$folder = "${env:ProgramFiles}\Tencent\QQ\Plugin\Com.Tencent.QQShow\"
$folder
$rdbFile = Join-Path $folder 'Bundle.rdb'
$rdbDir = Join-Path $folder 'Bundle'

$xmlPath = Join-Path $folder 'Bundle\I18N\2052\UrlBundle.xml'

if (Test-Path "$rdbFile.bak") {
    Write-Warning "$rdbFile.bak 文件已存在,请确认是否已经替换?"
    Write-Warning "程序退出。"
    return
}

$rdbFile
.\RDB.exe """$rdbFile"""
move $rdbFile "$rdbFile.bak"
.\D4QQenc.exe (Join-Path $folder 'Bundle\I18N\2052\UrlBundle.xml.enc')

del (Join-Path $folder 'Bundle\I18N\2052\UrlBundle.xml.enc')

[xml]$urlBundle = Get-Content $xmlPath -Encoding UTF8 | where { $_ -ne '' }

@('IDS_QQSHOW_MARKET', 'IDS_3DSHOW_MARKET', 'IDS_FLASHSHOW_MARKET') | foreach {
    $id = $_
    ($urlBundle.StringBundle.String | where { $_.id -eq $id })."#text" = ''
}
$urlBundle.OuterXml | Set-Content $xmlPath -Encoding UTF8

.\RDB.exe """$rdbDir"""

您也可以从这里 下载 写好的脚本,祝您使用愉快。
本方法在 QQ2013(SP6) 上验证通过。

用 PowerShell 屏蔽腾讯 QQ 的广告

非会员 QQ,在对话窗口的右上角会显示一个广告横幅,如图所示:

我们可以将 %appdata%\Tencent\Users\QQ号\QQ\Misc.db 文件删除并且替换成一个同名文件夹,就可以屏蔽该广告:

如果您有多个 QQ 号的话,我们可以用 PowerShell 来批量完成该任务:

echo '本脚本用于屏蔽 QQ 对话窗口右上方的广告条。'
Read-Host '请关闭所有 QQ,按回车键继续' | Out-Null

$usersDir = "$($env:AppData)\Tencent\Users\"
dir $usersDir -Directory | foreach {
    $qq = $_
    $qqDir = Join-Path $_.FullName 'QQ'
    $miscDb = Join-Path $qqDir Misc.db
    if (Test-Path -PathType Leaf $miscDb) {
        echo "正在禁用 $qq 的广告"
        del $miscDb
        md $miscDb | Out-Null
    }
}
exit
echo '处理完毕。'

您也可以从这里 下载 写好的脚本,祝您使用愉快。
本方法在 QQ2013(SP6) 上验证通过。

PowerShell 技术 QQ 群