使用PowerShell固定快捷方式到开始菜单时遇权限错误求助
无法通过PowerShell将桌面快捷方式固定到开始菜单(权限错误)
尝试将桌面快捷方式固定到开始菜单,即使以管理员身份运行PowerShell仍出现权限错误。测试“Open”等其他动词可正常执行,但固定到开始菜单时会报错。
所用代码
$desktopPath = [System.Environment]::GetFolderPath('Desktop') $shortcutName = "XAMPP Control Panel.lnk" # Name of the shortcut $shortcutPath = Join-Path $desktopPath $shortcutName $Shell = New-Object -ComObject Shell.Application $Folder = $Shell.Namespace((Get-Item $shortcutPath).DirectoryName) $Item = $Folder.ParseName((Get-Item $shortcutPath).Name) $Item.Verbs() | ForEach-Object { Write-Output $_.Name } $Verb = $Item.Verbs() | Where-Object {$_.Name -eq "&Pin to Start"} if ($Verb) { $Verb.DoIt() Write-Output "Pinned." } else { Write-Output "Not Pinned" }
错误截图

已尝试的排查步骤
- 运行
gpedit.msc,依次进入用户配置 -> 管理模板 -> 开始菜单和任务栏 - 在右侧面板双击“阻止用户自定义其开始屏幕”,设置为已禁用
- 重启设备确保更改生效,但问题依旧

解决方案
1. 切换为普通用户权限运行PowerShell
固定开始菜单属于用户级操作,管理员上下文会与当前用户的开始菜单数据隔离。直接以普通用户身份启动PowerShell,再执行脚本即可避免权限冲突。
2. 确认动词名称的正确性
不同系统语言或版本中,"固定到开始"的动词名称可能存在差异。先执行以下命令列出目标快捷方式的所有可用动词:
$desktopPath = [System.Environment]::GetFolderPath('Desktop') $shortcutName = "XAMPP Control Panel.lnk" $shortcutPath = Join-Path $desktopPath $shortcutName $Shell = New-Object -ComObject Shell.Application $Folder = $Shell.Namespace((Get-Item $shortcutPath).DirectoryName) $Item = $Folder.ParseName((Get-Item $shortcutPath).Name) $Item.Verbs() | Select-Object Name, VerbID
找到对应"固定到开始屏幕"的动词名称(例如中文系统中为&固定到开始屏幕),替换原脚本中的&Pin to Start后重新执行。
3. 使用官方Start布局API替代Shell Verb方法
Shell Verb方式在Windows 10/11中权限限制严格,可改用微软官方的Start布局管理API实现固定:
# 获取快捷方式的完整路径 $desktopPath = [System.Environment]::GetFolderPath('Desktop') $shortcutName = "XAMPP Control Panel.lnk" $shortcutPath = Join-Path $desktopPath $shortcutName # 生成开始布局XML模板 $layoutXml = @" <LayoutModificationTemplate xmlns:defaultlayout="http://schemas.microsoft.com/Start/2014/FullDefaultLayout" xmlns:start="http://schemas.microsoft.com/Start/2014/StartLayout" Version="1" xmlns="http://schemas.microsoft.com/Start/2014/LayoutModification"> <LayoutOptions StartTileGroupCellWidth="6" /> <DefaultLayoutOverride> <StartLayoutCollection> <defaultlayout:StartLayout GroupCellWidth="6"> <start:Group Name="自定义应用"> <start:DesktopApplicationTile Size="2x2" Column="0" Row="0" DesktopApplicationLinkPath="$shortcutPath" /> </start:Group> </defaultlayout:StartLayout> </StartLayoutCollection> </DefaultLayoutOverride> </LayoutModificationTemplate> "@ # 保存XML到临时文件 $tempXmlPath = Join-Path $env:TEMP "StartLayout.xml" $layoutXml | Out-File $tempXmlPath -Encoding UTF8 # 应用布局(需要管理员权限) Import-StartLayout -LayoutPath $tempXmlPath -MountPath $env:SystemDrive\ # 清理临时文件 Remove-Item $tempXmlPath
注意:该方法会覆盖当前开始菜单布局,若需保留原有布局,需先执行Export-StartLayout -Path "CurrentLayout.xml"导出当前布局,再修改XML内容后重新导入。
4. 调整用户账户控制(UAC)设置
打开控制面板\用户帐户\用户帐户\更改用户帐户控制设置,将滑块调整至"仅当应用尝试更改我的计算机时通知我(默认)"或更低级别,重启系统后测试脚本。
内容的提问来源于stack exchange,提问作者Arash Seifi
相关产品推荐
相关产品推荐

