Das PowerShell-Skript zur Selbsterhöhung funktioniert nicht, wenn es als Funktion im Benutzerprofil geschrieben wird

Das PowerShell-Skript zur Selbsterhöhung funktioniert nicht, wenn es als Funktion im Benutzerprofil geschrieben wird

Wenn Sie diesen Code in ein PowerShell-Skript einfügen, wird er selbsterweiternd:

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

Wenn Sie jedoch eine Funktion daraus erstellen, die im PS-Benutzerprofil verwendet werden soll, und die Funktion über ein Skript aufrufen, funktioniert es nicht. Eine neue PowerShell-Administratorsitzung wird geöffnet, aber der Hauptskriptcode wird nicht gelesen.

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
    }
}

Irgendwelche Ideen, warum es als Funktion nicht funktioniert und ob man es zum Laufen bringen kann?

Antwort1

Habe die Funktion neu geschrieben, indem ich einen Parameter definiert habe, der die Übergabe des Skriptpfads als Variable an die Funktion im PS-Benutzerprofil erleichtert. Andernfalls wird stattdessen der Pfad des PS-Benutzerprofils verwendet.

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
    }
}

Im Skript:

Elevate-NoAdmin $PSCommandPath

#Main code here

oder

Elevate-NoAdmin $MyInvocation.MyCommand.Path

#Main code here

verwandte Informationen