Как создать ярлык «Запуск от имени администратора» с помощью Powershell

В моем сценарии 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()

Теперь, когда я создаю ярлык, как мне добавить в сценарий, чтобы по умолчанию он работал от имени администратора?


person Michelle    schedule 11.03.2015    source источник
comment
Обязательно прочитайте вопрос, на который Натан ссылается выше. Чтобы перевести код в PowerShell: $file = $Home\Desktop\ColorPix.lnk; $bytes = [System.IO.File]::ReadAllBytes($file); $bytes[0x15] = $bytes[0x15] -bor 0x20; #Set RunAsAdministrator [System.IO.File]::WriteAllBytes($file, $bytes); Используйте –bor для установки параметра RunAsAdministrator и –bxor для отмены.   -  person Jan Chrbolka    schedule 12.03.2015


Ответы (2)


Этот ответ является переводом PowerShell отличного ответа на этот вопрос uses-run-as-administrator">Как я могу использовать 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< /а>.

person Jan Chrbolka    schedule 12.03.2015
comment
Это изменение байта - это какой-то фокус-покус Windows старой школы. Спасибо за перевод PowerShell. - person hsimah; 19.10.2018
comment
Последняя строка у меня не сработала, поэтому вместо нее я использовал $bytes | Set-Content $shortcutPath -Encoding Byte - person Andy Joiner; 16.07.2019
comment
Массивы PowerShell начинаются с элемента 0, то есть это 22-й байт, точнее бит 6 2-го байта в структуре LinkFlags структуры ShellLinkHeader, то есть бит 14 структуры LinkFlags, приводящий нас к документированной позиции N RunAsUser. Но в 64-битной Windows изменяется 6-й бит 43-го байта. Я предполагаю, что каждый байт хранится в 16 битах вместо 8, пространство, зарезервированное для 8 первых флагов, теперь удвоено, поэтому флаг для RunAsUser находится в байте 4 * 2 + 16 * 2 + 1 * 2 + 1 = 43 ... И поскольку кажется, что байт 42 не 0x00, я подозреваю, что W64 использует новые недокументированные флаги... - person hymced; 12.10.2020
comment
@hsimah, независимо от того, хорошо это или плохо, изменение байта не имеет ничего общего с Windows. - person g.pickardou; 04.02.2021
comment
@g.pickardou Я не знал, что байты существуют на других платформах; спасибо, что нашли время в течение дня, чтобы поделиться своими обширными знаниями - person hsimah; 04.02.2021

Вы можете использовать переключатель -Elevate true для этого:

    CreateShortcut -name "myApp" -Target 
    "${env:ProgramFiles}\mApp\myApp.exe" -OutputDirectory 
    "C:\Users\Public\Desktop" -Elevated True
person Elgin Methley Prince    schedule 14.10.2019
comment
Это ответ или вопрос? Что еще CreateShortcut? - person Martin Prikryl; 14.10.2019