将此代码放入 PowerShell 脚本中可使其自我提升:
if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole(
[Security.Principal.WindowsBuiltInRole] 'Administrator'))
{
Start-Process PowerShell -ArgumentList "-File", ('"{0}"' -f $MyInvocation.MyCommand.Path) -Verb RunAs
exit
}
#Main code here
但是,当将其创建为在 PS 用户配置文件中使用的函数并从脚本调用该函数时,它不起作用。打开了新的 PowerShell 管理会话,但未读取主脚本代码。
function Elevate-NoAdmin
{
if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole(
[Security.Principal.WindowsBuiltInRole] 'Administrator'))
{
Start-Process PowerShell -ArgumentList "-File", ('"{0}"' -f $MyInvocation.MyCommand.Path) -Verb RunAs
exit
}
}
有什么想法为什么它不能作为一个功能发挥作用以及是否可以使它发挥作用?
答案1
通过定义一个参数重写了该函数,该参数有助于将脚本路径作为变量传递给 PS 用户配置文件中的函数。否则它将使用 PS 用户配置文件的路径。
function Elevate-NoAdmin
{
param(
[Parameter(Mandatory)]
[String]$ScriptPath
)
if (-not ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::
GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] 'Administrator'))
{
Start-Process -FilePath PowerShell.exe -Args "-File `"$ScriptPath`"" -Verb RunAs
exit
}
}
在脚本中:
Elevate-NoAdmin $PSCommandPath
#Main code here
或者
Elevate-NoAdmin $MyInvocation.MyCommand.Path
#Main code here