Powershell-Skript über GPO bei der Anmeldung funktioniert nicht richtig

Powershell-Skript über GPO bei der Anmeldung funktioniert nicht richtig

Ich habe ein Powershell-Skript erstellt, um den Windows Store und Cortana unter Windows 10 zu entfernen. Ich habe das Skript erfolgreich erstellt und getestet. Jetzt habe ich das Skript zu den LogonScripts in einem GPO hinzugefügt und getestet, ob das Skript auch erfolgreich ausgeführt wird. Aber es tut nicht, was es tun sollte.

Zunächst einmal ist dies das Skript:

$WSV =(Get-AppxPackage -Name "*WindowsStore*").name
if ($WSV -eq "Microsoft.WindowsStore") 
    {Get-AppxPackage -allusers "*WindowsStore*" | Remove-AppxPackage}

$Cor =(Get-AppxPackage -Name Microsoft.549981C3F5F10).name
if ($Cor -eq "Microsoft.549981C3F5F10")
    {Get-AppxPackage -allusers Microsoft.549981C3F5F10 | Remove-AppxPackage}

Es prüft lediglich, ob das AppX-Paket vorhanden ist, und entfernt es, wenn es vorhanden ist. Dies funktioniert, wenn das Skript manuell gestartet wird. Als Anmeldeskript funktioniert es jedoch nicht. Mein erster Gedanke war, dass das Skript überhaupt nicht ausgeführt wird. Also habe ich die Erstellung eines Ordners im C-Root-Verzeichnis hinzugefügt und kann durch die Erstellung dieses Ordners bestätigen, dass das Skript ausgeführt wird.

Warum funktioniert es also nicht wie gewünscht? Gibt es eine Möglichkeit, die Fehlermeldung des Skripts irgendwie abzurufen?

Die Ausführungsrichtlinie unterliegt keinen Einschränkungen. Sie wird in der Computerkonfiguration der Gruppenrichtlinie ausgeführt und sollte daher über Computerrechte verfügen.

Antwort1

Wird als Startskript und nicht als Anmeldeskript ausgeführt, da der Befehl den -AllUsersParameter verwendet, um sicherzustellen, dass beim Ausführen die Berechtigung zum Entfernen der Pakete für alle Benutzer ausreicht.

Ich würde es auch in das Skript einfügen, Set-ExecutionPolicy Unrestrictedobwohl Sie sagen, dass Sie die Ausführungsrichtlinie für alle Fälle bereits entsprechend eingestellt haben.

Abschließend möchte ich sagen, dass zum Entfernen des Pakets der vollständige Paketname erforderlich ist. Verwenden Sie daher die folgende PowerShell, um diesen für die App abzurufen, die Sie entfernen.

Verwenden Sie zur Lösung die PowerShell-Logik, wie in den folgenden Befehlen angegeben, und nicht die Logik, die Sie aktuell verwenden.

Power Shell

Set-ExecutionPolicy Unrestricted;

Get-AppxProvisionedPackage –Online | % {
    If($_.DisplayName -eq "Microsoft.WindowsStore")
        {Remove-AppxProvisionedPackage -Online -PackageName $_.PackageName}
    };

Get-AppxProvisionedPackage –Online | % {
    If($_.DisplayName -eq "Microsoft.549981C3F5F10")
        {Remove-AppxProvisionedPackage -Online -PackageName $_.PackageName}
    };
    
"Microsoft.WindowsStore" | %{
    $p = (Get-AppxPackage -Name $_ | %{$_.PackageFullName});
    If($p){Remove-AppxPackage -Package $p -AllUsers};
    };

"Microsoft.549981C3F5F10" | %{
    $p = (Get-AppxPackage -Name $_ | %{$_.PackageFullName});
    If($p){Remove-AppxPackage -Package $p -AllUsers};
    };

Unterstützende Ressourcen


Antwort2

Ihr PowerShell-Code ist falsch.

$WSV =(Get-AppxPackage -Name "*WindowsStore*").name
# can also be written as
$WSV = Get-AppxPackage -Name "*WindowsStore*" | Select-Object -ExpandProperty Name

Diese Abfrage gibt manchmal ein Array zurück, abhängig von der Anzahl der zurückgegebenen Elemente:

PS > Get-Item *.html, *.log

    Directory: /Users/megamorf

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-----          06.04.2020    18:04            730 back-to-work.html
-----          05.10.2020    12:32           4269 jmeter.log
-----          28.09.2020    14:41         246873 olv.log
-----          20.10.2020    16:28         170945 web.log

PS > $Result = (Get-Item "*.log").Name
PS > $Result.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array

PS > $Result = (Get-Item "*.html").Name
PS > $Result.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     String                                   System.Object

Der Vergleichsoperator -eqist nicht korrekt, wenn Sie mit Arrays arbeiten. In diesem Fall müssen Sie -in( $obj -in $array) oder -contains( $array -contains $obj) verwenden.

Der gesamte Code kann wie folgt vereinfacht werden:

$AppsToDelete = @("Microsoft.WindowsStore", "Microsoft.549981C3F5F10")

foreach ($UnwantedApp in $AppsToDelete) {
    Get-AppxPackage -Name $UnwantedApp -AllUsers | Remove-AppxPackage 
}

verwandte Informationen