Fehler im Powershell Skript, oder Denkfehler?
Moin Leute,
ich habe gerade mein Skript soweit fertig, aber stehe nun komplett am Schlauch, die ersten Teile laufen ohne Probleme, er erstellt mir einen Temp Folder, kopiert aus dem Netzwerkshare die Start2.bin, legt diese für alle User / vorhanden oder neu ab, deinstalliert die Apps und deprovisioniert.
Ich bekomme aber nun einen Teil nicht hin, der angemeldete User was dieses Skript ausführt, bekommt die Taskbareinstellungen, klar, aber alle vorhanden bzw. User was sich zum ersten mal am PC anmelden werden von den RegKeys nicht gesteuert....
Ich komm nicht drauf, kann mir jemand helfen, ich gehe davon aus es ist eine Kleinigkeit, aber vor lauter Zeilen sehe ich den Wald nicht mehr![face-smile face-smile](/images/icons/fa/light/face-smile.svg)
Bin für Tipps dankbar.
Grüße
edit:
ganz vergessen, das Script erstellt einen Ordner unter C , legt dort eine txt als LogFile an, kopiert dann aus dem Netzwerk die start2.bin, nimmt die vorhandene und kopiert diese ins Temp (rename) , danach löscht er die Angegebenen Windows Apps, und dann sollte er für alle User die Taskbar ändern.
ich habe gerade mein Skript soweit fertig, aber stehe nun komplett am Schlauch, die ersten Teile laufen ohne Probleme, er erstellt mir einen Temp Folder, kopiert aus dem Netzwerkshare die Start2.bin, legt diese für alle User / vorhanden oder neu ab, deinstalliert die Apps und deprovisioniert.
Ich bekomme aber nun einen Teil nicht hin, der angemeldete User was dieses Skript ausführt, bekommt die Taskbareinstellungen, klar, aber alle vorhanden bzw. User was sich zum ersten mal am PC anmelden werden von den RegKeys nicht gesteuert....
Ich komm nicht drauf, kann mir jemand helfen, ich gehe davon aus es ist eine Kleinigkeit, aber vor lauter Zeilen sehe ich den Wald nicht mehr
$logDirectory = "C:\Temp"
$logFile = "$logDirectory\PSSkript_APPX-LOG.txt"
if (-not (Test-Path $logDirectory)) {
New-Item -Path $logDirectory -ItemType Directory | Out-Null
Write-Host "Log-Verzeichnis erstellt: $logDirectory"
}
function Write-Log {
param (
[string]$message
)
$timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
$logMessage = "$timestamp - $message"
Add-Content -Path $logFile -Value $logMessage
}
function Uninstall-App {
param (
[string]$PackageFullName
)
Write-Host "Deinstalliere $PackageFullName"
Write-Log "Versuche, $PackageFullName zu deinstallieren"
try {
Get-AppxPackage -AllUsers -Name $PackageFullName | Remove-AppxPackage -AllUsers
Get-AppxProvisionedPackage -Online | Where-Object DisplayName -EQ $PackageFullName | Remove-AppxProvisionedPackage -Online
Write-Log "$PackageFullName erfolgreich deinstalliert."
} catch {
Write-Log "Fehler bei der Deinstallation von ${PackageFullName}: $($_)"
}
}
$appsToUninstall = @(
"Microsoft.Office.Desktop",
"Microsoft.MicrosoftSolitaireCollection",
"Microsoft.Todos",
"microsoft.windowscommunicationsapps",
"Microsoft.BingWeather",
"Microsoft.XboxApp",
"Microsoft.Xbox.TCUI",
"Microsoft.XboxGamingOverlay",
"Microsoft.XboxGameOverlay",
"Microsoft.BingNews",
"Microsoft.MicrosoftOfficeHub",
"Microsoft.GamingApp",
"Microsoft.WindowsMaps",
"Microsoft.WindowsAlarms",
"Microsoft.Clipchamp",
"Clipchamp.Clipchamp"
)
foreach ($app in $appsToUninstall) {
Uninstall-App -PackageFullName $app
}
Write-Host "Deinstallation für alle vorhandenen Benutzer abgeschlossen."
Write-Log "Deinstallation für alle vorhandenen Benutzer abgeschlossen."
foreach ($app in $appsToUninstall) {
Write-Host "Entferne $app aus dem Provisionierungspaket"
Write-Log "Entferne $app aus dem Provisionierungspaket"
try {
Get-AppxProvisionedPackage -Online | Where-Object DisplayName -EQ $app | Remove-AppxProvisionedPackage -Online
Write-Log "$app erfolgreich aus dem Provisionierungspaket entfernt."
} catch {
Write-Log "Fehler beim Entfernen von $app aus dem Provisionierungspaket: $($_)"
}
}
Write-Host "Entfernung aus dem Provisionierungspaket abgeschlossen."
Write-Log "Entfernung aus dem Provisionierungspaket abgeschlossen."
$networkPath = "SERVERNAME\start2.bin"
$localPath = "$env:LOCALAPPDATA\Packages\Microsoft.Windows.StartMenuExperienceHost_cw5n1h2txyewy\LocalState\start2.bin"
$backupPath = "$logDirectory\start2.bin_OLDnotdelete"
try {
if (Test-Path $localPath) {
Write-Host "Umbenennen der vorhandenen start2.bin und Verschieben nach $backupPath"
Write-Log "Umbenennen der vorhandenen start2.bin und Verschieben nach $backupPath"
Move-Item -Path $localPath -Destination $backupPath -Force
} else {
Write-Log "Keine vorhandene start2.bin Datei gefunden, daher keine Umbenennung erforderlich."
}
Write-Host "Kopiere start2.bin von $networkPath nach $localPath"
Write-Log "Kopiere start2.bin von $networkPath nach $localPath"
Copy-Item -Path $networkPath -Destination $localPath -Force
Write-Host "Kopieren abgeschlossen."
Write-Log "Kopieren von start2.bin abgeschlossen."
$defaultUserPath = "$env:SystemDrive\Users\Default\AppData\Local\Packages\Microsoft.Windows.StartMenuExperienceHost_cw5n1h2txyewy\LocalState"
if (-not (Test-Path $defaultUserPath)) {
New-Item -Path $defaultUserPath -ItemType Directory -Force | Out-Null
Write-Log "Standardverzeichnis für neue Benutzer erstellt: $defaultUserPath"
}
Copy-Item -Path $networkPath -Destination $defaultUserPath\start2.bin -Force
Write-Log "start2.bin für neue Benutzer bereitgestellt."
} catch {
Write-Log "Fehler beim Kopieren der start2.bin Datei: $($_)"
}
Write-Host "Skript abgeschlossen."
Write-Log "Skript erfolgreich abgeschlossen."
$defaultUserSID = (Get-WmiObject -Class Win32_UserAccount -Filter "Name='Default Account'" | Select-Object -ExpandProperty SID)
if (-not $defaultUserSID) {
Write-Log "Default-Benutzer SID konnte nicht gefunden werden."
} else {
$taskbarKeyPath = "Registry::HKEY_USERS\$defaultUserSID\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced"
$searchKeyPath = "Registry::HKEY_USERS\$defaultUserSID\Software\Microsoft\Windows\CurrentVersion\Search"
$widgetsKeyPath = "Registry::HKEY_USERS\$defaultUserSID\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced"
try {
Set-ItemProperty -Path $taskbarKeyPath -Name "ShowTaskViewButton" -Value 0 -Force
Set-ItemProperty -Path $taskbarKeyPath -Name "TaskbarAl" -Value 0 -Force
Write-Log "Taskleiste linksbündig ausgerichtet und aktive Anwendungen ausgeblendet für Default-Benutzer"
Set-ItemProperty -Path $searchKeyPath -Name "SearchboxTaskbarMode" -Value 0 -Force
Write-Log "Suchfeld in der Taskleiste ausgeblendet für Default-Benutzer"
Set-ItemProperty -Path $widgetsKeyPath -Name "TaskbarDa" -Value 0 -Force
Write-Log "Widgets in der Taskleiste ausgeblendet für Default-Benutzer"
} catch {
Write-Log "Fehler beim Anpassen der Taskleiste für Default-Benutzer: $($_)"
}
}
$userProfiles = Get-WmiObject Win32_UserProfile | Where-Object { $_.Special -eq $false } | ForEach-Object {
$_.SID
}
foreach ($profileSID in $userProfiles) {
$taskbarKeyPath = "Registry::HKEY_USERS\$profileSID\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced"
$searchKeyPath = "Registry::HKEY_USERS\$profileSID\Software\Microsoft\Windows\CurrentVersion\Search"
$widgetsKeyPath = "Registry::HKEY_USERS\$profileSID\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced"
try {
Set-ItemProperty -Path $taskbarKeyPath -Name "ShowTaskViewButton" -Value 0 -Force
Set-ItemProperty -Path $taskbarKeyPath -Name "TaskbarAl" -Value 0 -Force
Write-Log "Taskleiste linksbündig ausgerichtet und aktive Anwendungen ausgeblendet für Benutzer ${profileSID}"
Set-ItemProperty -Path $searchKeyPath -Name "SearchboxTaskbarMode" -Value 0 -Force
Write-Log "Suchfeld in der Taskleiste ausgeblendet für Benutzer ${profileSID}"
Set-ItemProperty -Path $widgetsKeyPath -Name "TaskbarDa" -Value 0 -Force
Write-Log "Widgets in der Taskleiste ausgeblendet für Benutzer ${profileSID}"
} catch {
Write-Log "Fehler beim Anpassen der Taskleiste für Benutzer ${profileSID}: $($_)"
}
}
Write-Host "Taskleistenanpassung für alle Benutzer abgeschlossen."
Write-Log "Taskleistenanpassung für alle Benutzer abgeschlossen."
Bin für Tipps dankbar.
Grüße
edit:
ganz vergessen, das Script erstellt einen Ordner unter C , legt dort eine txt als LogFile an, kopiert dann aus dem Netzwerk die start2.bin, nimmt die vorhandene und kopiert diese ins Temp (rename) , danach löscht er die Angegebenen Windows Apps, und dann sollte er für alle User die Taskbar ändern.
Please also mark the comments that contributed to the solution of the article
Content-ID: 51289798180
Url: https://administrator.de/contentid/51289798180
Printed on: September 1, 2024 at 08:09 o'clock
12 Comments
Latest comment
Das Skript schaut ja erstmal welche Userprofile existieren und versucht die Taskbareinstellungen auf diese anzuwenden.
Das führt dazu das:
wenn der ausführende User kein lokaler admin ist funktioniert es natürlich nur beim eigenen Profil, da kein zugriff auf die registry-hives der anderen User erlaubt.
für nicht vorhandene User kann es natürlich auch keine Änderungen in der Registry ausführen da diese SIDs ja zum zeitpunkt der ausführung noch gar nicht auf dem pc existieren
EDIT: bei dem Teil für den Default User ist nen Schreibfehler in Zeile 110, "Default Account" -> "DefaultAccount"
Das führt dazu das:
wenn der ausführende User kein lokaler admin ist funktioniert es natürlich nur beim eigenen Profil, da kein zugriff auf die registry-hives der anderen User erlaubt.
für nicht vorhandene User kann es natürlich auch keine Änderungen in der Registry ausführen da diese SIDs ja zum zeitpunkt der ausführung noch gar nicht auf dem pc existieren
EDIT: bei dem Teil für den Default User ist nen Schreibfehler in Zeile 110, "Default Account" -> "DefaultAccount"
$defaultUserSID = (Get-WmiObject -Class Win32_UserAccount -Filter "Name='DefaultAccount'" | Select-Object -
„Am“ Schlauch steht nur die 🚒…. Heute ist Freitag! 🐟 😂
https://www.geo.de/geolino/redewendungen/auf-dem-schlauch-stehen-3016878 ...
https://www.geo.de/geolino/redewendungen/auf-dem-schlauch-stehen-3016878 ...
Hab grad mal bei mir rumgespielt, das mit der SID des default users funktioniert nicht, versuch mal den part durch das hier zu ersetzen. Reg.exe wird für den search registrykey verwendet da sonst das reg unload fehlschlägt.
REG LOAD HKLM\Default C:\Users\Default\NTUSER.DAT
$taskbarKeyPath = "HKLM:\Default\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced"
$searchKeyPath = "HKLM\Default\Software\Microsoft\Windows\CurrentVersion\Search"
$widgetsKeyPath = "HKLM:\Default\\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced"
try {
Set-ItemProperty -Path $taskbarKeyPath -Name "ShowTaskViewButton" -Value 0 -Force
Set-ItemProperty -Path $taskbarKeyPath -Name "TaskbarAl" -Value 0 -Force
Write-Log "Taskleiste linksbündig ausgerichtet und aktive Anwendungen ausgeblendet für Default-Benutzer"
reg.exe add $searchKeyPath /v SearchboxTaskbarMode /t REG_DWORD /d 0 /f
Write-Log "Suchfeld in der Taskleiste ausgeblendet für Default-Benutzer"
Set-ItemProperty -Path $widgetsKeyPath -Name "TaskbarDa" -Value 0 -Force
Write-Log "Widgets in der Taskleiste ausgeblendet für Default-Benutzer"
} catch {
Write-Log "Fehler beim Anpassen der Taskleiste für Default-Benutzer: $($_)"
}
REG UNLOAD HKLM\Default
was mir noch aufgefallen ist es fehlt im script nen sonst funktioniert fast keiner deiner try .. catch blöcke richtig.
Ausserdem hatte ich bewusst reg.exe für den search eintrag genommen, wenn du das rein mit pwershell machen willst pack am besten vor den block mit reg unload (also zeile 165) noch ein
sonst kann vermutlich der hive öfter mal nicht entladen werden
$ErrorActionPreference = "Stop"
Ausserdem hatte ich bewusst reg.exe für den search eintrag genommen, wenn du das rein mit pwershell machen willst pack am besten vor den block mit reg unload (also zeile 165) noch ein
[gc]::Collect()
[gc]::WaitForPendingFinalizers()