使用白名单在 Windows 10 部署中启用基于用户的应用程序

使用白名单在 Windows 10 部署中启用基于用户的应用程序

我对一个流行的 PS 脚本进行了修改,该脚本可以删除基于用户的应用程序。我的脚本使用白名单来确定哪些不能删除。我的白名单如下所示。

store
calc
camera
stickynotes

在 SCCM 任务序列期间调用该脚本来部署机器。这是脚本...

$whitelist = Get-Content -path $PSScriptRoot\whitelist.txt
$AllApps = @(Get-AppxPackage -AllUsers)
$AllProvApps = @(Get-AppxProvisionedPackage -Online)

foreach ($App in $AllApps) {

   foreach ($item in $whitelist) {  
   
      if ($App.name -like "*$item*") { $App = "" } 

   } 
      
   if ($App -ne "") {Remove-AppxPackage $App}
      
}

foreach ($ProvApp in $AllProvApps) {

   foreach ($item in $whitelist) {  
   
      if ($ProvApp.name -like "*$item*") { $ProvApp = "" } 

   } 
      
   if ($ProvApp -ne "") {Remove-AppxProvisionedPackage $ProvApp}
      
}

结果让我相信它“有点”起作用了...我有一个计算器,但没有别的东西?

答案1

从我的评论来看,这基本上就是你所需要的:

假设的内容whitelist.txt包含以下内容(正如您在问题中提到的):

store
calc
camera
stickynotes

您需要做的就是:

$whitelist = (Get-Content $PSScriptRoot\whitelist.txt | Where-Object { ![string]::IsNullOrWhiteSpace($_) }) -join '|'
Get-AppxPackage -AllUsers | Where-Object { $_.Name -notmatch $whitelist } | Remove-AppxPackage
Get-AppxProvisionedPackage -Online | Where-Object { $_.DisplayName -notmatch $whitelist } | Remove-AppxProvisionedPackage

解释:

  • 我们获取非空或空格的文件内容,并将其连接在一起以|创建正则表达式字符串
  • 我们获取所有AppxPackagesAppxProvisionedPackages匹配正则表达式的,并删除它们

答案2

你的脚本是错误的,其中的错误让人难以理解。但我猜到了你最终想要做什么,你试图卸载所有未列入白名单的应用程序,这很简单,我已经修复了你的代码,现在它可以正常工作了:

[string[]]$whitelist = Get-Content -path $PSScriptRoot\whitelist.txt
$AllApps = @(Get-AppxPackage -AllUsers)
$AllProvApps = @(Get-AppxProvisionedPackage -Online)

foreach ($App in $AllApps) {
    if ($whitelist -notcontains $App.packagefullname) {Remove-AppxPackage $App}
}
foreach ($ProvApp in $AllProvApps) {
    if ($whitelist -notcontains $ProvApp.packagename) {Remove-AppxProvisionedPackage $ProvApp}
}

由于 Get-Content 默认将每一行作为单独的字符串返回,使用 [string[]] 将创建一个 [array],其中每一行作为 [string] 元素,然后可以轻松使用 -contains 和 -notcontains 运算符检查包含条件,运算符的结果是布尔值(true 或 false)。

if 条件表示该应用程序不包含在白名单中。


更新

仅当提供应用程序的全名时,上述代码才会起作用,要获取全名,请运行Get-AppxPackage -AllUsers以获取所有应用程序,这是一个很长的列表,因此最好将输出重定向到文件:

Get-AppxPackage -AllUsers | Out-File "C:\path\to\text\file.txt"

您还可以通过以下方式进行过滤,使其仅输出应用程序的全名:

(Get-AppxPackage -AllUsers).packagefullname

对于已配置的 appx 包,请使用以下命令:

Get-AppxProvisionedPackage -Online

输出到控制台

(Get-AppxProvisionedPackage -Online).PackageName

仅显示包名称

Get-AppxProvisionedPackage -Online | Out-File "C:\path\to\file.txt"

将输出重定向到文本文件。

但最好使用这个:

Get-AppxProvisionedPackage -Online | Export-Csv "C:\Path\To\File.csv"

将其导出为 csv 文件,以便下次在 PowerShell 中使用它,只需执行以下操作:

$csv=Import-Csv "C:\Path\To\File.csv"

完整代码:

[string[]]$whitelist = get-content -path $psscriptroot\whitelist.txt
[array]$apps=(get-appxpackage -allusers).packagefullname
[array]$provapps=(get-appxprovisionedpackage -online).packagename
$approved=@()
foreach ($item in $whitelist) {
    foreach ($app in $apps) {
        if ($app -match $item -and $approved -notcontains $app) {$approved+=$app}
    }
    foreach ($provapp in $provapps) {
        if ($provapp -match $item -and $approved -notcontains $provapp) {$approved+=$provapp}
    }
}
$whitelist=$approved
foreach ($app in $apps) {
    if ($whitelist -notcontains $app) {remove-appxpackage -package $app -allusers}
}
foreach ($provapp in $provapps) {
    if ($whitelist -notcontains $provapp) {remove-appxprovisionedpackage -online -packagename $provapp}
}

答案3

是的,我知道这很脏,但它帮我解决了问题!

where-object {($_.name –notlike “*store*”) -and ($_.name –notlike "*Calc*") -and ($_.name –notlike "*Camera*")

我喜欢 Xeнεi Ξэnвϵς 的建议,但我认为我遇到了白名单路径问题,导致所有内容都被卸载。当我有更多时间时,我会重新考虑它。

相关内容