通过批处理文件以管理员身份启动Powershell

5

我正在运行一个基本脚本,复制快捷方式到公共桌面文件夹中,这样任何登录的用户都会在他们的桌面上看到它。由于我需要绕过执行策略,所以我使用批处理文件进行操作。以下是我尝试过的内容,但似乎对我没有用...

Powershell.exe -Command "& {Start-Process Powershell.exe -ArgumentList 'ExecutionPolicy Bypass -File DesktopShortcut.ps1' -Verb RunAs}"

而PS文件就是:

Copy-Item -Path "aiStarter.lnk" -Destination "C:\Users\Public\Desktop\" -PassThru

当我运行它时,窗口只是闪烁然后消失了。如果我不使用RunAs运行它,我会得到访问被拒绝的错误。我很不想问这个问题,因为我相信这个问题以前已经被问过了,但我几乎确定我正在正确地执行它。你有什么想法吗?

看起来很奇怪。你基本上是使用批处理文件启动 PowerShell,然后再次启动 PowerShell,最终尝试运行你的 PowerShell 脚本。 - Squashman
2
此外,您无需使用脚本来分发快捷方式。只需使用组策略即可。 - Bill_Stewart
1
@Squashman 那种复杂的语法是为了以提升的权限启动PowerShell进程。powershell.exe没有“runas”开关,因此您需要利用Start-Process命令。 - Ansgar Wiechers
不确定您的问题或实际代码中是否存在打字错误,但参数列表中应该是-ExecutionPolicy而不是ExecutionPolicy(没有前导连字符)。然而,我同意@Bill_Stewart的观点,组策略(首选项)是实现您想要的功能的更好方法。 - Ansgar Wiechers
1个回答

6

像其他一些人所说的那样,这不是传递快捷方式的最佳选择。

话虽如此,有两个问题。一个是执行策略需要使用-。另一个是在创建提升的 PowerShell 实例后,工作路径会发生变化。因此,如果是批处理文件,您需要添加脚本的完整路径,可以使用 %~dp0 来实现。

Powershell.exe -Command "& {Start-Process Powershell.exe -ArgumentList '-ExecutionPolicy Bypass -File %~dp0DesktopShortcut.ps1' -Verb RunAs}"

同样需要对powershell脚本进行类似的操作。

Copy-Item -Path "$($MyInvocation.MyCommand.Path)\aiStarter.lnk" -Destination "C:\Users\Public\Desktop\" -PassThru

假设批处理文件、快捷方式和powershell脚本都在同一个文件夹中。


链接文件是否是指向“DesktopShortcut.ps1”?为什么? - Timo
这个答案对我有用。但是,我有一个很长的ArgumentList要传递,我想将其拆分成多行。在这里使用插入符号^不起作用。例如:Powershell.exe -Command "& {Start-Process Powershell.exe -Verb RunAs -ArgumentList '-ExecutionPolicy Bypass -File %~dp0HelloWorld.ps1 ^ -parameter1 Long ^ -parameter2 list ^ -parameter3 of ^ -parameter4 parameters ^ '}"(每个^后面的新行符号在此评论中不显示) - jamacoe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接