-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathInstall-FalconSensor.ps1
More file actions
92 lines (74 loc) · 3.46 KB
/
Copy pathInstall-FalconSensor.ps1
File metadata and controls
92 lines (74 loc) · 3.46 KB
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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
<#
.SYNOPSIS
Kopiert eine Installationsdatei (z.B. FalconSensor) auf Zielcomputer
und führt sie dort remote mit Parametern aus.
Das Skript muss als Administrator ausgeführt werden.
#>
param (
[string[]]$ZielComputerListe = @(
"CLIENT-PC-01",
"CLIENT-PC-02" # Bitte durch Ihre echten Computernamen ersetzen
),
[string]$RemoteTempPfad = "C:\Temp"
)
# --- Konfiguration der Installationsdatei ---
$DateiName = "FalconSensor_FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF-FF.exe"
$Argumente = "/install /quiet /norestart /CID=FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF-FF"
$Quelldatei = Join-Path $PSScriptRoot $DateiName
$RemoteTempPfadTeil = $RemoteTempPfad.TrimStart('C:')
# --- Vorab-Prüfung ---
if (!(Test-Path -Path $Quelldatei)) {
Write-Error "Die Quelldatei '$Quelldatei' wurde nicht gefunden. Das Skript wird beendet."
return
}
Write-Host "Starte parallelisierte Ausführung für $($ZielComputerListe.Count) Computer..."
# --- Parallele Verarbeitung ---
$ZielComputerListe | ForEach-Object -Parallel {
# --- Zuweisung der $using:-Variablen (gemäß Ihrer Anforderung) ---
# $Computer ist die aktuelle Eingabe (von ForEach-Object)
$Computer = $_
# $using: Variablen aus dem Haupt-Thread (P_ = Parallel)
$P_RemoteTempPfad = $using:RemoteTempPfad
$P_DateiName = $using:DateiName
$P_RemoteTempPfadTeil = $using:RemoteTempPfadTeil
$P_Quelldatei = $using:Quelldatei
$P_Argumente = $using:Argumente
# --- Ende Zuweisung ---
# Wir verwenden nun die lokalen $P_ Variablen innerhalb des Parallel-Threads
$RemoteDateiPfad = "$P_RemoteTempPfad\$P_DateiName"
$ZielAdminPfad = "\\$Computer\C$\$P_RemoteTempPfadTeil\$P_DateiName"
try {
Write-Host "[$Computer] Starte Verarbeitung..."
# 1. Sicherstellen, dass der Zielordner existiert
# Wir definieren den ScriptBlock und nutzen -ArgumentList,
# um $using: im Block zu vermeiden (beste Praxis)
$ScriptBlockDir = {
param(
[string]$R_RemoteTempPfad, # R_ = Remote
[string]$R_Computer
)
if (!(Test-Path -Path $R_RemoteTempPfad)) {
Write-Host "[$R_Computer] Erstelle Ordner $R_RemoteTempPfad"
New-Item -Path $R_RemoteTempPfad -ItemType Directory -Force | Out-Null
}
}
# Wir übergeben die Variablen aus dem Parallel-Thread ($P_... und $Computer)
Invoke-Command -ComputerName $Computer -ScriptBlock $ScriptBlockDir -ArgumentList $P_RemoteTempPfad, $Computer -ErrorAction Stop
# 2. Datei kopieren
Write-Host "[$Computer] Kopiere '$P_DateiName'..."
Copy-Item -Path $P_Quelldatei -Destination $ZielAdminPfad -Force -ErrorAction Stop
# 3. Befehl remote ausführen
Write-Host "[$Computer] Führe Installation aus..."
# Dieser Block war bereits korrekt (nutzt param() und ArgumentList)
$ScriptBlockInstall = {
param($Pfad, $ArgumenteListe)
Start-Process -FilePath $Pfad -ArgumentList $ArgumenteListe -Wait
}
Invoke-Command -ComputerName $Computer -ScriptBlock $ScriptBlockInstall -ArgumentList $RemoteDateiPfad, $P_Argumente -ErrorAction Stop
Write-Host "[$Computer] Verarbeitung ERFOLGREICH abgeschlossen."
}
catch {
Write-Warning "[$Computer] FEHLER bei der Verarbeitung: $($_.Exception.Message)"
}
} -ThrottleLimit 8
Write-Host "Skriptausführung für alle Computer beendet."