
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