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
}