创建Windows快捷方式以启动Run as administrator
脚本时,以常规用户双击并右键单击%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy "Bypass" -Command "&{& 'C:\Script.ps1'}"
时,以下工作正常:
Run as administrator
但是,如果路径是相对的并且未提前知道,那么当双击普通用户而不是右键单击%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy "Bypass" -Command "&{& '.\Script.ps1'}"
时,以下工作正常:
PSScriptRoot
我的问题是,当路径相对时,我怎样才能使它工作?我尝试使用require 'openssl'
key = '123'
data = 'test string'
digest = OpenSSL::Digest::SHA1.new
# See how HMAC uses SHA1 here:
result = OpenSSL::HMAC.hexdigest(digest, key, data)
# => "a145f4d366e9e4e96b80bc427144ba77b3c7151a", same as your node result
,但这也无效。
感谢您的帮助。
答案 0 :(得分:2)
从资源管理器以管理员身份启动时,您必须提供脚本的绝对路径。
当以管理员身份启动进程时,Explorer.exe会忽略快捷方式中的起始目录。相反,管理员级流程始终使用[Environment]::GetFolderPath('System')
中的当前目录启动(通常为C:\Windows\System32
)
在不同目录中运行的简便方法是在脚本开头更改目录。以下行将cd
到脚本所在的目录。
Set-Location $PsScriptRoot
如果脚本需要在不同的路径中启动,那么您可能必须编写一个函数来发现该路径在本地计算机上的位置(例如enumerating USB drives)
答案 1 :(得分:0)
您可以将当前解决方案用于非管理员提升的快捷方式,然后在内部自动提升脚本:
# ========================================= Admin Rights =======================================================
# Usage: asAdmin $PSCommandPath
function asAdmin
{
[string]$cmdPath = $args[0]
if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) { Start-Process powershell.exe "-NoProfile -ExecutionPolicy Bypass -File `"$cmdPath`"" -Verb RunAs; exit }
}