登录时通过 GPO 运行的 Powershell 脚本无法正常工作

登录时通过 GPO 运行的 Powershell 脚本无法正常工作

我编写了一个 Powershell 脚本来删除 Windows 10 上的 Windows 应用商店和 Cortana。我编写并成功测试了该脚本。现在我将脚本添加到 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 
}

相关内容