@
echoo00 思路:
通过 PowerShell 实现一个函数来维护操作的逻辑。
1. 读取特定路径的 domain.txt 来管理规则
2. 实现 Add 操作的逻辑,NRPT 规则不存在则添加
3. 实现 Add 操作的逻辑,NRPT 规则存在则更新
4. 实现 Add 操作的逻辑,NRPT 规则多余则删除
5. 实现 Clean 操作的逻辑,清理本机所有 NRPT 规则,恢复初始状态。
代码如下:
```powershell
param (
[string]$Action = "Add", # 可以是 Add 或 Clean
[string]$FilePath = ".\domains.txt", # 包含域名的文件路径
[string]$NameServer = "192.168.188.2" # 默认的 DNS 服务器地址
)
function Manage-NrptRuleFromFile {
param (
[string]$Action,
[string]$FilePath,
[string]$NameServer
)
# 读取文件中的域名,添加前缀 '.'
$fileNamespaces = Get-Content $FilePath | ForEach-Object { "." + $_ }
switch ($Action) {
"Get" {
$rules = Get-DnsClientNrptRule
if ($rules) {
Write-Host "Current NRPT rules:"
$rules | Format-Table -Property Namespace, NameServers
} else {
Write-Host "No NRPT rules found"
}
}
"Add" {
# 获取当前所有的 NRPT 规则
$currentRules = Get-DnsClientNrptRule
# 添加或更新规则
foreach ($ns in $fileNamespaces) {
$rule = $currentRules | Where-Object { $_.Namespace -eq $ns }
if ($rule) {
if ($rule.NameServers -ne $NameServer) {
Set-DnsClientNrptRule -Name $
rule.Name -NameServers $NameServer
Write-Host "Updated NRPT rule for $ns $NameServer"
}
} else {
Add-DnsClientNrptRule -Namespace $ns -NameServers $NameServer
Write-Host "Added NRPT rule for $ns"
}
}
# 清除不在文件中的规则
$currentRules | Where-Object { $fileNamespaces -notcontains $_.Namespace } | ForEach-Object {
Remove-DnsClientNrptRule -Name $
_.Name Write-Host "Removed NRPT rule for $($_.Namespace)"
}
}
"Clean" {
Get-DnsClientNrptRule | Remove-DnsClientNrptRule -Force
Write-Host "Cleaned all NRPT rules"
}
default {
Write-Host "Invalid action: $Action"
}
}
}
# 调用 Manage-NrptRuleFromFile 函数
Manage-NrptRuleFromFile -Action $Action -FilePath $FilePath -NameServer $NameServer
# 示例用法
# 将内容保存为 nrpt.ps1 文件,在 CWD 内添加一份 domains.txt ,每个域名一行,比如:
#
example-01.com#
example-02.com#
example-03.com#
# 指定 NameServer 地址
# .\nrpt.ps1 -NameServer "10.0.0.2"
#
# 指定文件地址
# .\nrpt.ps1 -FilePath ".\another-domains.txt"
#
# 清除所有规则
# .\nrpt.ps1 -Action Clean
```