35 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			PowerShell
		
	
	
	
	
	
			
		
		
	
	
			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
 | |
| }
 | 
