PowerShell安装MS Store等Appx包时如何分段以管理员和本地用户运行
解决方案
你可以通过身份检测+临时文件传递参数的方式实现权限拆分,无需手动输入凭据,实现逻辑如下:
- 脚本启动后先判断运行身份:
- 如果是管理员身份:先执行获取所有用户下Appx包全路径的逻辑,将获取到的包名列表写入公共临时文件,之后主动降权触发当前脚本以普通用户身份运行
- 如果是普通用户身份:直接读取临时文件中的包名列表,逐个执行应用注册操作
- 全流程执行完成后自动清理临时文件
修改后可直接运行的完整脚本如下:
# 定义需要安装的应用列表 $NAMES = @( "WindowsStore" "Photos" "WindowsCalculator" ) $tempFile = Join-Path $env:TEMP "appx_install_list.tmp" # 检测当前是否为管理员身份 $currentPrincipal = New-Object Security.Principal.WindowsPrincipal([Security.Principal.WindowsIdentity]::GetCurrent()) $isAdmin = $currentPrincipal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator) if ($isAdmin) { # ========== 管理员权限执行部分 ========== $packageList = @() foreach ($NAME in $NAMES) { Write-Host "正在查询$NAME 包信息..." $PackageFullName = Get-Appxpackage -Allusers -Name *$NAME | Sort-Object Version -Descending | Select-Object -ExpandProperty PackageFullName -First 1 if ($PackageFullName) { $packageList += $PackageFullName } else { Write-Warning "未找到$NAME 的安装包,请确认系统已预存该应用的部署文件" } } # 将包名列表写入临时文件 $packageList | Out-File $tempFile -Encoding UTF8 # 以当前普通用户身份重新启动脚本执行注册逻辑 Start-Process powershell.exe "-NoProfile -ExecutionPolicy Bypass -File `"$PSCommandPath`"" -UseNewEnvironment -Wait # 执行完成后清理临时文件 Remove-Item $tempFile -Force -ErrorAction SilentlyContinue exit } else { # ========== 普通用户权限执行部分 ========== if (-not (Test-Path $tempFile)) { Write-Error "未找到包信息文件,请先以管理员身份运行本脚本" pause exit 1 } $packageList = Get-Content $tempFile -Encoding UTF8 foreach ($PackageFullName in $packageList) { Write-Host "正在注册应用:$PackageFullName" Add-AppxPackage -register "C:\Program Files\WindowsApps\$PackageFullName\AppxManifest.xml" -DisableDevelopmentMode } Write-Host "所有应用注册完成" pause exit }
注意事项
- 直接右键选择「以管理员身份运行」脚本即可自动完成全流程,不需要手动切换权限或者输入凭据
- 脚本中已添加取最新版本包的逻辑,避免系统存在多个版本部署包时出现注册错误
- 如果需要新增要安装的应用,直接在
$NAMES数组中添加对应的应用名称即可
内容的提问来源于stack exchange,提问作者Tealk
相关产品推荐
相关产品推荐

