登入時透過 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-Package 是否存在,如果存在,則會將其刪除。如果腳本是手動啟動的,則此方法有效。但它不能像登入腳本一樣工作。我的第一個想法是,腳本根本沒有運行。因此,我在 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 
}

相關內容