-
Notifications
You must be signed in to change notification settings - Fork 0
/
Set-Firefoxconfig.ps1
178 lines (150 loc) · 6.15 KB
/
Set-Firefoxconfig.ps1
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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
<#
Dateiname: Set-Firefoxconfig.ps1
Version: 2.0
Autor: Alexander Schüßler
Erstellt: 13.05.2015
Letzte Änderung: 26.05.2015
#>
##############
# Funktionen #
##############
function Set-Firefoxconfig
{
<#
.SYNOPSIS
Eine Funktion, um Einträge in Firefoxkonfigurationsdateien zu ändern
.DESCRIPTION
Mit der Funktion können Einträge in Firefoxkonfigurationsdateien, z.B. all.js oder pref.js
verändert werden. Dabei werden sowohl allgemeine, als auch userbezogene Regeln unterstützt
.PARAMETER file
Die Datei, die bearbeitet werden soll. Sie wird als Dateiinfoobjekt übergeben, zum Beispiel durch Ermittlung mit
Get-Childitem
.PARAMETER type
Die Art der Regel, die geändert werden soll. Kann 'pref', 'user_pref' oder 'lock_pref' sein
.PARAMETER key
Der Schlüssel der Regel, die bearbeitet werden soll
.PARAMETER value
Der neue Wert für diesen Schlüssel
.INPUTS
Es sind keine Inputs möglich
.OUTPUTS
Gibt true zurück, wenn eine Änderung vorgenommen wurde.
Gibt false zurück, wenn eine Änderung vorgenommen hätte werden müsste, dies jedoch fehlschlug.
Gibt null zurück, wenn keine Änderung nötig war.
.EXAMPLE
Set-Firefoxconfig -file prefs.js -type user_pref -key browser.newtab.url -value "www.google.de"
setzt die aufgerufene Seite für einen neuen Tab für die aktuelle Sitzung auf www.google.de
#>
param(
[System.IO.FileInfo]$file,
[ValidateSet("pref", "user_pref", "lockpref")]
[string]$type,
[string]$key,
$value,
[System.Boolean]$debug = $false
)
begin
{
[bool]$inas | Out-Null #inas steht übrigens für "is not a string"
#Booleans oder Zahlen müssen als Nicht-Strings besonders berücksichtigt werden.... :)
if($value -eq "true" -or $value -eq $true -or $value -eq "false" -or $value -eq $false -or $value -is [int])
{
$exactpattern = "$type(`"$key`", $value);"
$inas = $true
if($debug){Write-verbose "Es wurde ein Wahrheitswert oder eine Zahl als Eingabe erkannt: " $value}
}
else
{
$inas = $false
$exactpattern = "$type(`"$key`", `"$value`");"
}
}
process
{
#Wenn wir keine Berechtigungen für die Datei haben, haben wir ein Problem und lassen es besser bleiben....
trap [System.UnauthorizedAccessException]{
Write-Error "Es ist kein Zugriff auf die Datei "$file.FullName" möglich. Bitte überprüfen Sie die Rechte für diese Datei."
return $false
}
#Zunächst die Datei auslesen
$content = Get-Content -path $file.FullName
#Debugzwecke: Ausgabe des derzeitigen Inhaltes der Datei
if($debug){$content | ? {Write-Verbose $_}}
#Möglicherweise gibt es die Konfiguration schon exakt so, dann sind wir bereits fertig
if($content | ? {$_ -like $exactpattern})
{
Write-Host "Konfiguration bereits korrekt, keine weiteren Handlungen nötig für "$file.FullName"."
return $null
}
#Möglicherweise gibt es zwar schon eine Konfiguration für diese Eigenschaft, aber sie hat noch den falschen Wert
#Dann müssen wir sie entfernen
elseif($content | ? {$_ -like "$type(`"$key`",*"})
{
Write-Host "Konfiguration nicht korrekt, Wert aktualisieren in "$file.FullName"."
#Filtere die nicht mehr aktuelle Regel heraus
$content = $content | ? {$_ -notlike "$type(`"$key`",*"}
}
else
{
Write-Host "Konfiguration nicht vorhanden, daher eintragen in "$file.FullName"."
}
$content += $exactpattern
#Wir sortieren unsere gesetzten Eigenschaften wieder
$content = $content | Sort-Object
#Dann leeren wir unsere Datei
Clear-Content $file.FullName
#und schreiben den veränderten Inhalt wieder hinein.
Add-Content $file.FullName -Value $content
Write-Host "Konfiguration erfolgreich geändert."
return $true
}
}
##############
#MAIN SCRIPT #
##############
##
##Hier: Setze Proxy auf Systemstandard:
##
#Aktiviere Infonachrichten
$VerbosePreference = "continue"
$ErrorActionPreference = "continue"
$policy = Get-ExecutionPolicy
#Ermittle, ob Ausführung von Skripten erlaubt ist
if($policy -ne "bypass" -and $policy -ne "unrestricted") <#Variante für PowerShell 3.0 oder neuer - nicht praktikabel derzeit => if((Get-ExecutionPolicy) -notin ("bypass", "restricted") #>
{
try
{
#Wenn nein, dann versuche, sie zu erlauben
Set-ExecutionPolicy -ExecutionPolicy Bypass -Force
}
catch
{
#Fehlen die Rechte, die Ausführung zu erlauben, werfe einen Fehler und beende das Skript
Write-Error "Auf dem Gerät ist die Ausführung von Skripten nicht erlaubt. Es sind daher Administrationsrechte nötig, um diesem Skript die Ausführung zu ermöglichen."
return
}
}
<#
$ffsettings = "${env:ProgramFiles(x86)}\Mozilla firefox"
Derzeit nicht benötigt, das ist dann hilfreich, wenn man Einstellungen für alle oder für neue User setzen möchte
#>
#Das ist das reguläre Verzeichnis für Firefoxnutzerprofile
$ffusersettings = "$env:APPDATA\Mozilla\Firefox\Profiles"
if($ffusersettings -eq $null)
{
throw [System.IO.DirectoryNotFoundException] "Der Pfad konnte nicht gefunden werden."
}
#Finde alle Userprofile im Profilordner, rekursiv da die Benutzer-ID zufällig generiert wird und nicht hartkodiert ist.
$profilefiles = Get-Childitem $ffusersettings -Recurse -Force | ? {$_.Name -like 'prefs.js'}
#Setze die Verwendung des Standardproxys für die aktuelle Sitzung
foreach($file in $profilefiles)
{
try
{
Set-Firefoxconfig -file $file -type user_pref -key "network.proxy.type" -value 5 | Out-Null
}
catch
{
Write-Error "Der Wert konnte nicht geändert werden in "$file.FullName"."
}
}