Скрипт Powershell через GPO при входе в систему работает неправильно

Скрипт Powershell через GPO при входе в систему работает неправильно

Я сделал скрипт 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 
}

Связанный контент