
Poner este código en un script de PowerShell lo hace autoelevable:
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
Sin embargo, cuando se crea una función para usar en el perfil de usuario de PS y se llama a la función desde un script, no funciona. Se abre una nueva sesión de administrador de PowerShell, pero no se lee el código del script principal.
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
}
}
¿Alguna idea de por qué no funciona como función y si se puede hacer que funcione?
Respuesta1
Se reescribió la función definiendo un parámetro que facilite el paso de la ruta del script como una variable a la función en el perfil de usuario de PS. De lo contrario, utilizará la ruta del perfil de usuario de 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
}
}
En guión:
Elevate-NoAdmin $PSCommandPath
#Main code here
o
Elevate-NoAdmin $MyInvocation.MyCommand.Path
#Main code here