แฐแแ แฐแแแ ! แแฅแแแแก แงแฃแ แแแฆแแแแก แฌแแ แแแแแแแแแ แกแขแแขแแแก แแแ แแแแแก
แแแแ แแแแ, แ แแ แแก แแ แแ แแก แแฅแกแแแแ แแแ"
แแแแแฅแขแแ แแ แแแแขแแ แแแฃแแ แแ แคแฃแแฅแชแแแแแแฃแ แ แแ แแแ แแแแ แแแแก แแแ แแแแแแแแ แจแแแซแแแแ แแฌแแแแแฆแแแแแแแแแแก แแ แแแแแแแก, แแแแ แแ แแ แแแ แแแแแแ แแ แแ แแก แแฎแแ แแแญแแ แแแ Powershell-แจแ. แแแแฅแแแก แงแแแแ แแ แแแ แแแแ แแแแก แแแแก, แคแฃแแฅแชแแแแแแฃแ แแฃ แแ แ, แแฅแแก แแแคแแ แแแแแฃแแ แกแแฎแแแ-แแแแจแแแแแแแแก แแแแแแจแแ แแแแก แกแแจแฃแแแแแแแ; แแแแกแแแ, แแกแแแ แ แแแแ แช แกแขแ แฃแฅแขแฃแ แแแ แแ แฉแแแแฌแแ แแแ, แแฎแแแแ แแ แแ แแแแแแแแ. แแฃ แฉแแแ แจแแแแฆแฃแแแแ แแแแกแแแแก แแแแแงแแแแแแก แกแแฎแแแแแแกแ แแ แแแแจแแแแแแแแแแก แจแแแ แแแแแ แแ แแแแแแแ แแแแชแแแแแ แแซแแแ แแแแแฅแขแแ แแ แแแแขแแ แแแฃแแ แแ แแแ แแแแ แแแแก แชแแแแแแก, แ แแแแ แแชแแ แแแแแแแแ แแแแ, แแแแแแแ แคแแแแ แแ แชแแแแแแแแแแ, แฉแแแ แจแแแแแซแแแ แแแกแแ แแแแแแ แแแแแแ แฉแแแแ แแแแแก แแแ แแฃแแแแแก แแแ แแจแ. แแแ แแ แแแแกแ, แฃแชแแแแแ แขแแแแก แแแแแแ แขแแชแแแก แแแแแแแแแก แแแแแขแแแแ, แฉแแแ แจแแแแแซแแแ แแแแแแแแแ แแ แฉแแแแ แคแฃแแฅแชแแฃแ แ แแแแ แแแแกแแแแ.
แแแกแขแแแแก แแแแแ
แแแกแขแแแ Powershell-แแก แแ แ-แแ แแ แงแแแแแแ แซแแแแ แ แคแฃแแฅแชแแแ. แ แแแแกแแช แแฅแแแ แแซแแแแ แแแแจแแแแแแแแก, แแฅแแแ แแงแ แแแแแแ แแแแแแชแแฃแ แแแแชแแแแแแแชแแแก แแ แแแแแแแชแแแก แจแแกแแซแแแแแแแแแก, แ แแแแแแแช แแแ แแแ แแแแขแแแก แแฅแแแแก แแแแแแแชแแแก. แแแแแแแแแ, แกแขแ แแฅแแแแก แฃแแ แแแแ แฉแแแแกแฎแแ [xml]-แจแ แแแแแแแก แแแก แแแ แกแแ แแก แแแแแก แแแจแแแแแแ แแ แฌแแ แแแฅแแแแก แกแ แฃแ xml แฎแแก. แฉแแแ แจแแแแแซแแแ แแแแแแแงแแแแ แแแแกแแแ แฉแแแแก แแแแจแ แแแแแ แแแแแแ.
แฉแแกแแแ แฐแแจแขแแแแแแ
แแฃ แแ แแแฅแแ แแแแกแขแ แฃแฅแขแแ แ, แจแแแแซแแแแ แแแแแ แซแแแแ แแแก แแแ แแจแ แฐแแจแขแแแแแก แฉแแกแแแ แแฅแแแแ แแแแกแแก แขแแแแ. แแ แแแแแแแฌแงแแแ แแแแแแแชแแแก แแขแ แแแฃแขแแแแก แแแแแงแแแแแ แแ แแแแฃแจแแก แกแ แฃแแ แกแแ แแแแแแแแกแแแแก. แแแแแแ แแฃแแแ, แฉแแแ แจแแแแแซแแแ แแแแแแแงแแแแ แแแแกแแก แแแ แแคแแแ แแแแกแแแแแ แแแแแ แฃแคแ แ แฆแ แแ แแแแชแแแแแแแชแแแกแ แแ แแแแแแแชแแแก แแแแแแแก แแแกแแจแแแแแ.
class Cluster {
[ValidatePattern("^[A-z]+$")]
[string] $Service
[ValidateSet("TEST", "STAGE", "CANARY", "PROD")]
[string] $FlightingRing
[ValidateSet("EastUS", "WestUS", "NorthEurope")]
[string] $Region
[ValidateRange(0, 255)]
[int] $Index
}
[Cluster]@{
Service = "MyService"
FlightingRing = "PROD"
Region = "EastUS"
Index = 2
}
แแแ แแ แแแแกแ, แฉแแแแกแฎแแ แฎแแแก แฃแฌแงแแแก แกแฃแคแแ แแแแแกแแแแแก แแแฆแแแแก. แจแแแแแ แแ Format-Table-แแ แแแแแชแแแฃแแ แแแแกแขแแ แฃแแ แฐแแจแขแแแแฃแ แ แแแกแแแแก แแแแแแแแแแ, แ แแกแแช แแแแฆแแแ, แแฃ แแแ แแแแแ แแแแแแขแแแแ แแก แฐแแจแขแแแแแ แแแแกแจแ. แแแแกแแก แแแแกแแแแแ แงแแแแแแแแก แฉแแแแแแแแแแ แแ แแแแแแแแแแ แแแแ, แ แแแแแแแช แแกแแแ แแฅ แแ แแก แแแแกแแแฆแแ แฃแแ. แแ แแแแแแแฌแงแแแ แแแแแแฃแแ แกแแแแแแซแ แกแแขแงแแแก แแแแแขแแแ แงแแแแ แแ แแแแกแแแแแแ, แ แแแแแแช แแ แแกแฃแ แ แ แแ แแงแแก แฎแแแฃแแ แจแแแแแแแจแ.
แแแแจแแแแแแแแแแก แ แแแ
แแฃ แแฅแแแ แแแฅแแ แแแแกแขแ แฃแฅแขแแ แ แแ แแ แแ แแฃแแแแขแแ, แแฅแแแแ แแแแกแแก แขแแแแ แแแแจแแแแแแแแก แแแชแแแ แแแแแกแชแแแก แแแแจแแแแแแแแก แแฅแแแแก แแแแกแขแ แฃแฅแขแแ แก, แกแแแแช แจแแแแซแแแแ แแฅแแแแ แแแแกแแก แแแแแแแแแ แแก แแแแชแแแแแแแชแแ.
class Cluster {
[ValidatePattern("^[A-z]+$")]
[string] $Service
[ValidateSet("TEST", "STAGE", "CANARY", "PROD")]
[string] $FlightingRing
[ValidateSet("EastUS", "WestUS", "NorthEurope")]
[string] $Region
[ValidateRange(0, 255)]
[int] $Index
Cluster([string] $id) {
$this.Service, $this.FlightingRing, $this.Region, $this.Index = $id -split "-"
}
}
[Cluster]"MyService-PROD-EastUS-2"
แขแ แแแกแแแ แแแ แฎแแแแ
แแฅแแแ แแกแแแ แจแแแแซแแแแ แฃแแฃแแแแแแงแแ [string] ToString() แแแแกแแก แแแแแแ, แ แแแ แแแแแกแแแฆแแ แแก แแแแแแ แแแแแฅแขแแก แกแแแแแแแแ แฌแแ แแแแแแแแก แแแฆแแ, แ แแแแ แแชแแ แกแแแแแแแแ แแแขแแ แแแแแชแแแก แแแแแงแแแแแแ.
class Cluster {
[ValidatePattern("^[A-z]+$")]
[string] $Service
[ValidateSet("TEST", "STAGE", "CANARY", "PROD")]
[string] $FlightingRing
[ValidateSet("EastUS", "WestUS", "NorthEurope")]
[string] $Region
[ValidateRange(0, 255)]
[int] $Index
[string] ToString() {
return $this.Service, $this.FlightingRing, $this.Region, $this.Index -join "-"
}
}
$cluster = [Cluster]@{
Service = "MyService"
FlightingRing = "PROD"
Region = "EastUS"
Index = 2
}
Write-Host "We just created a model for '$cluster'"
แแแแแชแแแฃแแ แกแแ แแฃแแ แจแแแแฎแแแแแแ
Cast แกแแจแฃแแแแแแก แแซแแแแ แฃแกแแคแ แแฎแ แแแกแแ แแแแแแแชแแ. แฅแแแแแ แแแงแแแแแแ แแแแแแแแแแ แฌแแ แฃแแแขแแแแแ แแฅแแแแ, แแฃ แแแแแชแแแแแ แแ แจแแแกแแแแแแแ แฉแแแแก แกแแแชแแคแแแแชแแแก แแแแกแขแแ แจแ
# ะะฐะปะธะดะฐัะธั ัะตัะธะฐะปะธะทะพะฒะฐะฝะฝัั
ะดะฐะฝะฝัั
[Cluster]$cluster = Get-Content "./my-cluster.json" | ConvertFrom-Json
[Cluster[]]$clusters = Import-Csv "./my-clusters.csv"
แแแกแขแแแ แแฅแแแแก แคแฃแแฅแชแแฃแ แแแแจแ
แคแฃแแฅแชแแฃแ แ แแ แแแ แแแแแ แฏแแ แแแแกแแแฆแแ แแแก แแแแแชแแแแ แกแขแ แฃแฅแขแฃแ แแแก, แจแแแแแ แแฎแแ แชแแแแแแก แแ แแแ แแแแก, แ แแแแ แช แขแ แแแกแคแแ แแแชแแแแแก แแแแแแแแแแ แแแแก แแแแแชแแแแ แฃแชแแแแ แกแขแ แฃแฅแขแฃแ แแแแ. แฌแแแแแฆแแแแแแแ แแแ แจแแแแแญแแแแแแแก แแแฃแฎแแแแแแ, แแแแกแแแ แแแแแแแแแ แแแฎแแแ แแแแ แแแฌแแ แแ แคแฃแแฅแชแแฃแ แ แแแแ, แขแแแแแแก แแแแแแ แขแแชแแแก แแแแแแแแแก แฌแงแแแแแแ.
Powershell, แ แแแแแกแแช แแฌแแ , แคแฃแแฅแชแแแแแแฃแ แแ?
แแแแ แ แแแแแแแแ, แ แแแแแแช แแแแแก C#-แแแ แแ แแกแแแแกแ แคแแแแแแ, แฌแแ แก Powershell-แก, แ แแแแแแช C#-แแก แแกแแแแกแแ. แแแแ แแฅแแแ แจแแ แแแแแ แคแฃแแฅแชแแแแแแฃแ แ แแ แแแ แแแแ แแแแก แแแแชแแคแชแแแแแก แแแแแงแแแแแแก แแ แกแแแแ แแฃแแแ แแกแแ แแแแแแแ แแแแแฅแขแแ แแ แแแแขแแ แแแฃแ แแ แแแ แแแแ แแแแจแ Powershell-แจแ แฉแแกแแแแ แแ แแแขแแก แจแแกแฌแแแแแ แคแฃแแฅแชแแฃแ แ แแ แแแ แแแแ แแแแก แจแแกแแฎแแ.
แแฃ แแแแแ แแงแ แแแแแแ แฃแชแแแแแ แแแแแชแแแแแแก แขแ แแแกแคแแ แแแชแแแก แแแแกแแแแแแแแก (|), Where-Object, ForEach-Object, Select-Object, Group-Object, Sort-Object แแ แ.แจ. - แแฅแแแ แแแฅแแ แฃแคแ แ แคแฃแแฅแชแแแแแแฃแ แ แกแขแแแ แแ แแกแแ แแแแแแแ Powershell-แแก แแแแแงแแแแแแ. แแแแกแแแ แคแฃแแฅแชแแฃแ แกแขแแแจแ.
แแแแกแแแแก แคแฃแแฅแชแแฃแ แ แแแแแงแแแแแ
แแแกแขแแแ, แแแฃแฎแแแแแแ แแแแกแ, แ แแ แแกแแแ แแงแแแแแแ แแแขแแ แแแขแแฃแ แกแแแขแแฅแกแก, แแ แแก แแฎแแแแ แ แฃแฅแ แแ แแแแแแก แจแแ แแก. แแแแกแแแแแจแ แจแแแแซแแแแ แจแแแแแแแแ แแแแจแแแแแแแแแแก แแแกแแแ ForEach-Object-แแก แแแแแงแแแแแแ.
แฅแแแแแ แแแงแแแแแ แแแแแแแแจแ Node แแแแกแขแ แฃแฅแขแแ แ แกแ แฃแแแแแ แงแแแแ แฏแแ แแ, แ แแแแกแแช Datum แแ แแก แฉแแแแแแแแแ, แแ แแก แแแแซแแแแก แจแแกแแซแแแแแแแแก, แแแแ แแแแ แแแแ แแแแแก แกแแแแ แแแแแแ แ แแแแแแแแแก แแแฌแแ แแก. แจแแแแแแ, แฉแแแแ แแแแกแแแแแ แคแแแฃแกแแ แแแฃแแแ แแแแแชแแแแแแก แแแแแแ แแชแแฃแ แแแแฎแแแแแแ แแ แแแ แแแแชแแแแ, แฎแแแ แฉแแแแ แแแแกแแแ แแ แฃแแแแแ แแแแแชแแแแ แแแแแแแแแแแแแ แแ แแแแแแแชแแแแ.
# ะัะธะผะตั ะบะพะผะฑะธะฝะธัะพะฒะฐะฝะธั ะบะปะฐััะพะฒ ั ะบะพะฝะฒะตะนะตัะฐะผะธ ะดะปั separation of concerns ะฒ ะบะพะฝะฒะตะนะตัะฐั
class Node {
[ValidateLength(3, 7)]
[string] $Name
[ValidateSet("INT", "PPE", "PROD")]
[string] $FlightingRing
[ValidateSet("EastUS", "WestUS", "NorthEurope", "WestEurope")]
[string] $Region
Node([string] $Name) {
$Name -match "([a-z]+)(INT|PPE|PROD)([a-z]+)"
$_, $this.Service, $this.FlightingRing, $this.Region = $Matches
$this.Name = $Name
}
}
class Datum {
[string] $Name
[int] $Value
[Node] $Computer
[int] Severity() {
$this.Name -match "[0-9]+$"
return $Matches[0]
}
}
Write-Host "Urgent Security Audit Issues:"
Import-Csv "./audit-results.csv" `
| ForEach-Object {[Datum]$_} `
| Where-Object Value -gt 0 `
| Group-Object {$_.Severity()} `
| Where-Object Name -lt 2 `
| ForEach-Object Group `
| ForEach-Object Computer `
| Where-Object FlightingRing -eq "PROD" `
| Sort-Object Name, Region -Unique
แจแแคแฃแแแแก แแแแกแ แฎแแแแฎแแแ แแแแแงแแแแแแกแแแแก
แแ แแคแแ แแ แแกแแแ แแแ แแ, แ แแแแ แช แฉแแแก
แกแแแฌแฃแฎแแ แแ, แแแแกแแแแก แแฅแกแแแ แขแแ แแแ แจแแฃแซแแแแแแแ แแแแฃแแแแแก แแแแ แแกแ, แ แแแแ แช แคแฃแแฅแชแแแแ แแ แชแแแแแแแ; แแแแ แแ แแ แแก แ แแแแแแแแ แฎแ แแแ. แแแฅแแแ, แแฅแแแแ แแแแกแแแ แแแแกแแแฆแแ แฃแแแ แคแแแแจแ ./my-classes.ps1
-
แจแแแแซแแแแ แคแแแแ แแแแกแแแแ:. ./my-classes.ps1. แแก แจแแแกแ แฃแแแแก my-classes.ps1 แแฅแแแแก แแแแแแแแแแ แคแแ แแแแแก แแ แแแแกแแแฆแแ แแแก แงแแแแ แแแแกแก แแฅ แแ แกแแแฃแแ แคแแแแแแแ.
-
แแฅแแแ แจแแแแซแแแแ แจแแฅแแแแ Powershell แแแแฃแแ, แ แแแแแแช แแฅแกแแแ แขแก แแฎแแ แชแแแแแแก แงแแแแ แแฅแแแแก แแแ แแแแฃแ API-แก (cmdlets) แแ แแแแงแแแแ ScriptsToProcess = "./my-classes.ps1" แชแแแแแ แแฅแแแแก แแแแฃแแแก แแแแแคแแกแขแจแ, แแแแแ แจแแแแแแ: ./my-classes.ps1 แจแแกแ แฃแแแแแ แแฅแแแแ แแแ แแแ.
แ แแแแแ แแแ แแแแขแแช แแ แฃแแแ แแแ แฉแแแ, แแแแแแแแแกแฌแแแแ, แ แแ Powershell-แแก แขแแแแก แกแแกแขแแแแก แแ แจแแฃแซแแแ แกแฎแแแแแกแฎแแ แแแแแแแแแ แฉแแขแแแ แแฃแแ แแ แแแแแแแแแ แกแแฎแแแแก แขแแแแแแก แแแแฎแกแแ.
แแแจแแแแช แแ, แแฃ แแฅแแแ แฉแแขแแแ แแแ แแ แ แแแแแขแฃแ แ แแแแกแ แแ แแ แแ แแแแแ แแแแกแแแแแแ แกแฎแแแแแกแฎแแ แแแแแแแแแ, แแฅแแแ แ แแกแแแแ แแ แแแแแแแแแก แฌแแแแจแ.
แฌแแแกแแแแก แแแ
แขแแแแก แ แแแแแฃแชแแแก แแ แแแแแแแแแก แแแแแแแ แแชแแแแแแก แกแแฃแแแแแกแ แแแแ แแฅแแแแ แแแแกแแแแก แแ แแกแแแแก แแแแแแจแแแ แแแแ แแแแฎแแแ แแแแแแแกแแแแก. แแแแก แแแชแแแแ, แ แแ แแแแแแแแ แแแแฎแแแ แแแแแก แแแแ แแแแกแแ แแแแกแแแฆแแ แฃแแ แขแแแแก แแแแแ แขแก, แแฅแแแแ แแแแฃแแแแแ แคแฃแแฅแชแแแก แแฅแกแแแ แขแ, แ แแแแแแช แแแแแ แแชแฎแแแก แแแแกแจแ แฃแจแฃแแแแ แฌแแแแแแก แแฃแชแแแแแแแแแก. แแแแกแขแแ แแกแแแแก แจแแแแแซแแแ แแฎแแแ แแแแกแขแแ แแก แคแฃแแฅแชแแแก แแฅแกแแแ แขแ, แ แแแแแแช แฎแแแก แจแแฃแฌแงแแแก แแแแฎแแแ แแแแแกแแแแก แแแกแแฎแแ แฎแแแแแ แแแ แแแแขแ แแแแก แแแแแแแฅแขแก แแ แแแแแ แฃแแแแก แแแแกแขแแ แก.
class Cluster {
[ValidatePattern("^[A-z]+$")]
[string] $Service
[ValidateSet("TEST", "STAGE", "CANARY", "PROD")]
[string] $FlightingRing
[ValidateSet("EastUS", "WestUS", "NorthEurope")]
[string] $Region
[ValidateRange(0, 255)]
[int] $Index
}
function New-Cluster {
[OutputType([Cluster])]
Param(
[Parameter(Mandatory, ParameterSetName = "Id", Position = 0)]
[ValidateNotNullOrEmpty()]
[string] $Id,
[Parameter(Mandatory, ParameterSetName = "Components")]
[string] $Service,
[Parameter(Mandatory, ParameterSetName = "Components")]
[string] $FlightingRing,
[Parameter(Mandatory, ParameterSetName = "Components")]
[string] $Region,
[Parameter(Mandatory, ParameterSetName = "Components")]
[int] $Index
)
if ($Id) {
$Service, $FlightingRing, $Region, $Index = $Id -split "-"
}
[Cluster]@{
Service = $Service
FlightingRing = $FlightingRing
Region = $Region
Index = $Index
}
}
Export-ModuleMember New-Cluster
แกแฎแแ แ แ แฌแแแแแแฎแ
แฌแงแแ แ: www.habr.com