ログオン時に GPO 経由の Powershell スクリプトが正しく動作しない

ログオン時に GPO 経由の Powershell スクリプトが正しく動作しない

Windows 10 で Windows ストアと Cortana を削除する Powershell スクリプトを作成しました。スクリプトの作成とテストは成功しました。次に、スクリプトを GPO の LogonScripts に追加し、スクリプトの実行をテストしました。これも成功しました。しかし、実行すべき動作は実行されていません。

まず、これがスクリプトです:

$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}

これは、AppX パッケージの存在をチェックし、存在する場合は削除するだけです。スクリプトを手動で開始した場合は機能します。ただし、ログオン スクリプトとしては機能しません。最初に考えたのは、スクリプトがまったく実行されていないことです。そこで、C ルートにフォルダーの作成を追加し、このフォルダーの作成によってスクリプトが実行されていることを確認できました。

では、なぜ期待どおりに動作しないのでしょうか? 何らかの方法でスクリプトのエラー メッセージを取得する方法はありますか?

実行ポリシーは制限されていません。GPO のコンピューター構成で実行されるため、コンピューター権限が必要です。

答え1

コマンドは、-AllUsers実行時にすべてのユーザーのパッケージを削除するのに十分な権限があることを確認するためにパラメータを使用しているため、ログオン スクリプトではなくスタートアップ スクリプトとして実行します。

Set-ExecutionPolicy Unrestricted実行ポリシーがすでにこれに設定されているとおっしゃっていますが、念のためスクリプトにも追加します。

最後に、パッケージの削除には、私の知る限り完全なパッケージ名が必要なので、削除するアプリのパッケージ名を取得するには、以下の PowerShell を使用してください。

解決するには、現在使用しているロジックではなく、以下のコマンドで指定されている PowerShell ロジックを使用します。

パワーシェル

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};
    };

サポートリソース


答え2

PowerShell コードが間違っています。

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

このクエリは、返される要素の数に応じて配列を返すことがあります。

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

-eq配列を扱う場合、比較演算子は適切ではありません。その場合は、 -in( $obj -in $array) または-contains( $array -contains $obj) を使用します。

コード全体は次のように簡略化できます。

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

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

関連情報