如何使用Powershell创建一个“以管理员身份运行”的快捷方式

33

在我的PowerShell脚本中,我创建了一个快捷方式到一个.exe文件(类似于这个问题中的答案):

$WshShell = New-Object -comObject WScript.Shell
$Shortcut = $WshShell.CreateShortcut("$Home\Desktop\ColorPix.lnk")
$Shortcut.TargetPath = "C:\Program Files (x86)\ColorPix\ColorPix.exe"
$Shortcut.Save()

现在,当我创建快捷方式时,我该如何在脚本中添加使其默认以管理员权限运行的选项?

2个回答

58

这篇答案是针对该问题的一个出色回答进行的PowerShell翻译。 如何使用JScript创建一个使用"以管理员身份运行"的快捷方式

简单来说,您需要将.lnk文件读取为一个字节数组。找到第21个字节(0x15),并将第6位(0x20)更改为1。 这就是RunAsAdministrator标志。 然后,您将字节数组写回.lnk文件中。

在您的代码中,这看起来像这样:

$WshShell = New-Object -comObject WScript.Shell
$Shortcut = $WshShell.CreateShortcut("$Home\Desktop\ColorPix.lnk")
$Shortcut.TargetPath = "C:\Program Files (x86)\ColorPix\ColorPix.exe"
$Shortcut.Save()

$bytes = [System.IO.File]::ReadAllBytes("$Home\Desktop\ColorPix.lnk")
$bytes[0x15] = $bytes[0x15] -bor 0x20 #set byte 21 (0x15) bit 6 (0x20) ON
[System.IO.File]::WriteAllBytes("$Home\Desktop\ColorPix.lnk", $bytes)

如果有人想要更改.LNK文件中的其他内容,可以参考官方Microsoft文档


最后一行对我不起作用,所以我使用了 $bytes | Set-Content $shortcutPath -Encoding Byte - Andy Joiner
2
PowerShell数组从第0项开始,因此它在ShellLinkHeader结构的LinkFlags结构中是第22个字节,更准确地说是第2个字节的第6位,因此定位到LinkFlags结构的第14位,使我们进入文档位置N“RunAsUser”。但在64位Windows上,修改的是第43个字节的第6位。我猜测每个字节存储在16位而不是8位上,为前8个标志预留的空间现在加倍了,因此RunAsUser标志位于4×2 + 16×2 + 1×2 + 1 = 43字节。由于似乎第42个字节不是0x00,我怀疑W64使用新的未记录的标志... - hymced
你能详细解释一下为什么我们需要更改“字节21(0x15)”吗?x64和x86有什么区别吗?@hymced - undefined
@IchigoKurosaki 就试试吧 :) 好久没记得了,但根据我的评论,那时我肯定对自己相当有信心! - undefined

-5
您可以使用“-Elevate true”开关来实现此功能:
    CreateShortcut -name "myApp" -Target 
    "${env:ProgramFiles}\mApp\myApp.exe" -OutputDirectory 
    "C:\Users\Public\Desktop" -Elevated True

6
这是一个回答还是一个问题?什么是“CreateShortcut”? 这是一个问题。 "CreateShortcut" 是指创建快捷方式的操作。 - Martin Prikryl

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