Я сделал скрипт Powershell для удаления Windows Store и Cortana в Windows 10. Я сделал и успешно протестировал скрипт. Теперь я добавил скрипт в LogonScripts на GPO и протестировал скрипт, который также успешно работает. Но он не делает то, что должен делать.
Прежде всего, вот сценарий:
$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-Package и, если он существует, удаляет его. Это работает, если скрипт запущен вручную. Но он не работает как Logon-Script. Моя первая мысль, что скрипт вообще не работает. Поэтому я добавил создание папки в C-root, и я могу подтвердить, что скрипт запущен, создав эту папку.
Так почему же не работает так, как хотелось бы? Есть ли способ как-то получить сообщение об ошибке скрипта?
Execution-Policy не имеет ограничений. Он выполняется в конфигурации Computer GPO, поэтому должен иметь права Computer.
решение1
Запустите как сценарий запуска, а не как сценарий входа, поскольку команда использует параметр, -AllUsers
чтобы гарантировать, что разрешения достаточны для удаления пакетов для всех пользователей при запуске.
Я бы также добавил Set-ExecutionPolicy Unrestricted
в скрипт, хотя вы говорите, что у вас уже установлена политика выполнения на этот случай.
Наконец, насколько я могу судить, для удаления пакета требуется полное имя пакета, поэтому используйте PowerShell ниже, чтобы получить его для удаляемого приложения.
Для решения проблемы используйте логику 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
}