Files
DetectionLab/Vagrant/scripts/Invoke-CommandAs.ps1

35 lines
1.3 KiB
PowerShell

# Based on research by James Forshaw (@tiraniddo)
# https://www.tiraniddo.dev/2019/09/the-art-of-becoming-trustedinstaller.html
function Invoke-CommandAs {
param (
[Parameter(Position=0)][String]$User,
[Parameter(Position=1)][ScriptBlock]$ScriptBlock
)
$LogFile = New-TemporaryFile
$ScriptFile = New-TemporaryFile
"Invoke-Command { $ScriptBlock } *> $LogFile" | Out-File $ScriptFile
$ScriptFile = Rename-Item $ScriptFile "$($ScriptFile.BaseName).ps1" -PassThru
$TaskName = 'Invoke-CommandAs Task'
$TaskAction = New-ScheduledTaskAction `
-Execute 'powershell.exe' `
-Argument "-NoProfile -ExecutionPolicy Bypass -File $ScriptFile"
Register-ScheduledTask -TaskName $TaskName -Action $TaskAction -Force | Out-Null
($ScheduleService = New-Object -ComObject Schedule.Service).Connect()
$ScheduleService.GetFolder('\').GetTask($TaskName).RunEx($null, 0, 0, $User) | Out-Null
while ((Get-ScheduledTask $TaskName).State -eq 'Running') { Start-Sleep 0.5 }
if (($Result = (Get-ScheduledTaskInfo $TaskName).LastTaskResult) -ne 0) {
throw "The scheduled task '$TaskName' failed with result code $Result."
}
Unregister-ScheduledTask $TaskName -Confirm:$false
Get-Content $LogFile
Remove-Item $LogFile, $ScriptFile
}