Creé un script de Powershell para eliminar la Tienda Windows y Cortana en Windows 10. Creé y probé el script con éxito. Ahora agregué el script a LogonScripts en un GPO y probé que el script se está ejecutando, también exitosamente. Pero no está haciendo lo que debería hacer.
Primero que nada, este es el Script:
$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}
Simplemente verifica la existencia del paquete AppX y, si existe, lo eliminará. Esto funciona si el script se inicia manualmente. Pero no funciona como Logon-Script. Lo primero que pensé fue que el script no se ejecuta en absoluto. Entonces agregué la creación de una carpeta en C-root y puedo confirmar que el script se está ejecutando mediante la creación de esta carpeta.
Entonces, ¿por qué no funciona como se desea? ¿Hay alguna manera de obtener el mensaje de error del script de alguna manera?
La política de ejecución no tiene restricciones. Se ejecuta en la configuración de Computadora del GPO, por lo que debería tener derechos de Computadora.
Respuesta1
Ejecútelo como un script de inicio en lugar de un script de inicio de sesión, ya que el comando utiliza el -AllUsers
parámetro para garantizar que el permiso sea suficiente para eliminar los paquetes para todos los usuarios cuando se ejecuta.
También lo pondría Set-ExecutionPolicy Unrestricted
en el script aunque usted diga que ya tiene la política de ejecución configurada en esto, por si acaso.
Por último, hasta donde yo sé, la eliminación del paquete requiere el nombre completo del paquete, así que use el siguiente PowerShell para obtenerlo para la aplicación que está eliminando.
Utilice la lógica de PowerShell como se especifica en los siguientes comandos en lugar de la lógica que está utilizando actualmente para ayudar a resolver.
Potencia 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};
};
Recursos de apoyo
Respuesta2
Su código de PowerShell es incorrecto.
$WSV =(Get-AppxPackage -Name "*WindowsStore*").name
# can also be written as
$WSV = Get-AppxPackage -Name "*WindowsStore*" | Select-Object -ExpandProperty Name
Esta consulta a veces devolverá una matriz dependiendo de la cantidad de elementos devueltos:
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
El operador de comparación -eq
no es correcto cuando se trata de matrices. En ese caso, desea utilizar -in
( $obj -in $array
) o -contains
( $array -contains $obj
).
El código completo se puede simplificar como:
$AppsToDelete = @("Microsoft.WindowsStore", "Microsoft.549981C3F5F10")
foreach ($UnwantedApp in $AppsToDelete) {
Get-AppxPackage -Name $UnwantedApp -AllUsers | Remove-AppxPackage
}