如果将 PowerShell 自提升脚本作为函数写入用户配置文件中,则该脚本将不起作用

如果将 PowerShell 自提升脚本作为函数写入用户配置文件中,则该脚本将不起作用

将此代码放入 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

相关内容