【问题标题】:Remove AppxPackage for All Users with For Loop and If/Else Statments使用 For 循环和 If/Else 语句为所有用户删除 AppxPackage
【发布时间】:2023-02-23 03:20:21
【问题描述】:

大家好!

非常新手的脚本编写者在这里为公立学校 K-12 区寻找一些帮助。

示例代码:

#Clear Screen    
cls

#Launch as Administrator
 if (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator"))  
{  
  $arguments = "& '" +$myinvocation.mycommand.definition + "'"
  Start-Process powershell -Verb runAs -ArgumentList $arguments
  Break
}

# Search for all users of the Windows computer
 $AllUsers = Get-ChildItem 'HKLM:\Software\Microsoft\Windows NT\CurrentVersion\ProfileList' | ForEach-Object { $_.GetValue('ProfileImagePath') }
 

 #For loop search of all computer users for specific application             
 foreach ($u in $Allusers) {
     $u.Name
     $app = (Get-AppxPackage -Name *12030rocksdanister.LivelyWallpaper* -AllUsers)

 #If/Else statement to remove specific application or output not found message    
     if ($app) {
        "Application Located!"
        Get-AppxPackage -Name *12030rocksdanister.LivelyWallpaper* -User $u | Remove-AppxPackage
         "Application Removed" } 
    else {
        "Application Not Found." }

#Troubleshooting Pause  
Read-Host - Prompt "Press any key to continue!"
}

我在公立学校系统工作,我们有学生从 Microsoft Store 下载未经授权的应用程序。我们已经通过仅转移到私人商店来解决这个问题。但是,我们需要删除一些学生安装的 AppxPackages。 (我们正在构建一个列表,我将把它放在一个数组中,以便稍后与上面的脚本一起使用。现在,我只是想在增加复杂性之前让脚本的基础工作。)

为此,我正在尝试编写一个 Powershell 脚本,该脚本将检查笔记本电脑上的用户,搜索该用户名的特定 AppxPackage,然后删除该特定包。

发生的事情是我正在搜索笔记本电脑上的用户,并且找到了 AppxPackage,但是,我认为我只是一次又一次地循环访问同一用户,而没有删除实际的包。

我在这里缺少什么:

  1. 查找一台机器的所有用户
  2. For 遍历每个用户寻找特定的 AppxPackage
  3. 如果找到 AppxPackage,删除 AppxPackage
  4. 否则转到下一个用户
  5. 当所有用户都删除了特定的 AppxPackage 时终止并关闭脚本。

    提前感谢您的所有帮助和协助。我感谢你所有的眼睛和建议。祝你有美好的一天!

【问题讨论】:

  • Remove-AppxPackage 也有一个 -AllUsers 开关。为什么不直接运行它呢?
  • 此外,在以管理员身份重新启动 PowerShell 后,您应该使用 exit 而不是 break 来退出当前会话

标签: powershell appx


【解决方案1】:

我知道这是一个死线已久,但我今天做了这个,它似乎有效。整个 Remove-appxpackage -allusers 事情根本无法正常工作。

$path = 'Registry::HKey_Local_MachineSoftwareMicrosoftWindows NTCurrentVersionProfileList*'
$items = Get-ItemProperty -path $path
Foreach ($item in $items) {
    $objUser = New-Object System.Security.Principal.SecurityIdentifier($item.PSChildName)
    $objName = $objUser.Translate([System.Security.Principal.NTAccount])
    $item.PSChildName = $objName.value
    Get-AppxPackage -Name *officehub* -User $item.PSChildName | Remove-AppxPackage
}
     

例如,这将删除 officehub。我遇到了很多应用程序漏洞,因为人们已经很久没有登录某些计算机了,而且显然 office 应用程序存在一些漏洞。所以,我不得不想办法从每个人的个人资料中删除 Office 应用程序。无论如何,没有人使用商店应用程序。

这将循环遍历每个用户,然后尝试删除该应用程序。您必须以每个用户为基础执行此操作,因为应用程序的版本可能会因每个用户而异。这就是为什么 -allusers 开关在 IMO 上似乎不起作用的原因。

编辑: 在删除用户的情况下,使用 SID 实际上可能效果更好:

$path = 'Registry::HKey_Local_MachineSoftwareMicrosoftWindows NTCurrentVersionProfileList*'
$items = Get-ItemProperty -path $path
Foreach ($item in $items) {
    $sid = $item.PSChildname
    Get-AppxPackage -Name *officehub* -User $sid | Remove-AppxPackage
}

【讨论】:

    猜你喜欢
    • 2021-11-26
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多